ย้อนกลับอาร์เรย์ N-Dimensional


10

รายละเอียด

เขียนฟังก์ชั่นหรือโปรแกรมที่กำหนดอาร์เรย์ (หรือรายการ) ที่มีจำนวนเต็มเท่านั้นส่งคืนหรือส่งออกอาร์เรย์ที่มีองค์ประกอบย่อยทั้งหมดกลับรายการ นั่นคือย้อนกลับองค์ประกอบทั้งหมดของอาร์เรย์ที่ลึกที่สุดจากนั้นลึกที่สุดที่สอง ฯลฯ ไม่จำเป็นต้องระบุขนาด แต่ฟังก์ชั่นหรือโปรแกรมจะต้องทำงานสำหรับอาร์เรย์ขรุขระในรูปแบบดั้งเดิมของภาษาโปรแกรมของคุณ


ตัวอย่าง

นี้:

[[1,2], [3,4]]

จะกลายเป็นสิ่งนี้:

[[4,3], [2,1]]

นี้:

[[[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]],
 [[10,11,12], [13,14,15], [16,17,18]],
 [[19,20,21], [22,23,24], [25,26,27]],
 [[28,29,30], [31,32,33], [34,35,36]],
 [[37,38,39], [40,41,42], [43,44,45]],
 [[46,47,48], [49,50,51], [52,53,54]]]

จะกลายเป็นสิ่งนี้:

[[[54,53,52], [51,50,49], [48,47,46]],
 [[45,44,43], [42,41,40], [39,38,37]],
 [[36,35,34], [33,32,31], [30,29,28]],
 [[27,26,25], [24,23,22], [21,20,19]],
 [[18,17,16], [15,14,13], [12,11,10]],
 [[ 9, 8, 7], [ 6, 5, 4], [ 3, 2, 1]]]

นี้:

[[[1,2]],
 [[3,4], [5]],
 [[6,7,8], [9], [10,11]],
 [[[12,13], [14,15]], [16], [17,18,19,20]],
 [21]]

จะกลายเป็นสิ่งนี้:

[[21],
 [[20,19,18,17], [16], [[15,14], [13,12]]],
 [[11,10], [9], [8,7,6]],
 [[5], [4,3]],
 [[2,1]]]

โบนัส

หวังว่านี้จะสนับสนุนคำตอบในภาษาการเขียนโปรแกรมเชิงวัตถุบางอย่าง...

-50% Bytecountหากโปรแกรมของคุณสามารถรับข้อมูลเป็นอาร์เรย์ (หรือรายการ) ด้วยสมาชิกประเภทต่าง ๆ (สิ่งเหล่านี้สามารถอยู่ในรูปของวัตถุ) และย้อนกลับอาร์เรย์ทั้งหมดได้สำเร็จ

นี้:

[["Foo",["Bar",1]],
  2,
 ["Baz"],
 [[["Qux"],3],3.14]]

จะกลายเป็นสิ่งนี้:

[[3.14,[3,["Qux"]]],
 ["Baz"],
  2,
 [[1,"Bar"],"Foo"]]

1
ในตัวอย่างโบนัสของคุณคุณปฏิบัติกับสายอักขระเป็นอะตอม ฉันจะยืนยันว่าพวกเขาเป็น sub-array และดังนั้นควรย้อนกลับด้วย นี่คือความจริงแล้วสิ่งที่โซลูชัน APL ของฉันทำเมื่อป้อนสตริงปกติเนื่องจาก APL ไม่มีประเภทข้อมูลสตริงเพียงประเภทข้อมูลอักขระ สตริงจึงเป็นอาร์เรย์อักขระหนึ่งมิติ หากคุณต้องการให้สตริงยังคงอยู่ในลำดับปกติคุณเพียงแค่ทำให้วัตถุเป็นแบบฟอร์มแสดงผล
อดัม

@ Nᴮᶻคุณเชื่อหรือไม่ว่า -50% Bytecount ใจดีเกินไป? ฉันอาจทำบางอย่างตามบรรทัด -30% Bytecount สำหรับชนิดข้อมูลต่าง ๆ และบางอย่างเช่น -10% Bytecount สำหรับการย้อนกลับสตริง -15% Bytecount สำหรับการย้อนกลับประเภทจำนวนเต็ม (123 -> 321) และ -15% Bytecount สำหรับการย้อนกลับ ประเภทลอย (3.14 -> 41.3)
MrPublic

1
ฉันไม่ชอบโบนัสโดยทั่วไป การกลับจำนวนเต็มและลอยเป็น ... น่าสนใจ
อดัม

4
ทิ้งไว้ก่อน แต่คราวหน้าคุณอาจต้องการใช้แซนด์บ็อกซ์เพื่อค้นหาสิ่งต่าง ๆ
อดัม

คำตอบ:


9

Pyth, 11 - 50% = 5.5 ไบต์

L?+IbY_yMbb

ลองมันออนไลน์: สาธิตหรือTest Suite

yนี้กำหนดฟังก์ชั่น เพิ่มอีก 3 ไบต์<newline>yQเพียงเรียกใช้ฟังก์ชันด้วยรายการอินพุตดังนั้นจึงไม่จำเป็นต้องนับรวมกับจำนวนไบต์ทั้งหมด

คำอธิบาย:

L?+IbY_yMbb
L             define a function y(b), that returns:
 ?+IbY           if b + [] == b (test if b is a list):
      _yMb           recursively call y on all elements in b, then reverse the list
          b      else: b

6

Dyalog APL , 14 - 50% = 7 ไบต์

{∇¨⍣(×|≡⍵)⌽⍵}

⌽⍵อาร์กิวเมนต์ย้อนกลับ
⍣(×|≡⍵)ถ้าอาร์กิวเมนต์ไม่ได้เป็นอะตอม (สัญลักษณ์ของความลึก [สัมบูรณ์]) ...
∇¨... ใช้ฟังก์ชันกับแต่ละองค์ประกอบ (ของอาร์กิวเมนต์ที่กลับรายการ)

ถ้า⎕ML←3(IBM สไตล์) ซึ่งเป็นกรณีที่เกี่ยวกับระบบที่อพยพมาจาก APL2 |หนึ่งไบต์จะถูกบันทึกไว้โดยการเอา

ลอง APLออนไลน์

สำหรับความอยากรู้อยากเห็นint ที่เสนอและการย้อนกลับลอย:

{∇¨⍣(×≡⍵){0::⌽⍵⋄⍎⌽⍕⍵}⍵}

ฟังก์ชั่นภายใน:

0::⌽⍵หากข้อผิดพลาดใด ๆ เกิดขึ้นเพียงแค่ส่งกลับข้อโต้แย้ง revesed
⍎⌽⍕ให้เป็นสตริงย้อนกลับให้เป็นจำนวน


4

Prolog, 40 - 50% = 20 ไบต์

a(X,Y):-reverse(X,Z),maplist(a,Z,Y);X=Y.

สิ่งนี้เรียกซ้ำภาคa/2ด้วยmaplist/3สำหรับสมาชิกแต่ละคนของรายการจนกระทั่งreverse/2ล้มเหลว (เช่นองค์ประกอบสุดท้ายไม่ใช่รายการ)


4

Python 2, 40 - 50% = 20

f=lambda x:map(f,x)[::-1]if"">x>[]else x

มีเพียงการดัดแปลงเล็กน้อยที่จำเป็นจากวิธีการขั้นพื้นฐานในการรับโบนัส ใช้ข้อเท็จจริงว่ารายการทั้งหมดน้อยกว่าสตริงว่างและตัวเลขทั้งหมดน้อยกว่ารายการว่าง

กรณีทดสอบทั้งหมด


f=lambda x:map(f,x)[::-1]if x>[]else xเพียงแค่ทราบว่ารุ่นที่ไม่มีโบนัส
mbomb007

3

Emacs Lisp, 46 ไบต์ * 0.5 = 23

(defun g(x)(if(atom x)x(mapcar'g(reverse x))))

ตัวอย่างการใช้: (g '((1 2) 3 (four 5)))->((5 four) 3 (2 1))

วิธีการเรียกซ้ำแบบคลาสสิก: ถ้าอาร์กิวเมนต์ไม่ใช่รายการให้ใช้มันไม่เปลี่ยนแปลงถ้าเป็นรายการให้แมปฟังก์ชันเหนือส่วนท้ายของรายการ


2

Mathematica, 34/2 = 17 ไบต์

Quiet[Reverse//@#]/.Reverse->(#&)&

หรือเพียงแค่Reverse//@#&คุณต้องการข้อผิดพลาดและReverseทุกที่



1

JavaScript ES6, 42 - 50% = 21 ไบต์

คะแนนของฉันสมบูรณ์แบบในหลาย ๆ ด้าน ใช้ฟังก์ชันrที่นำตัวเองไปใช้ซ้ำกับสมาชิกของอินพุต

r=a=>Array.isArray(a)?a.reverse().map(r):a

หากเราสมมติว่าไม่มีวัตถุใดมีคุณสมบัติอยู่popสิ่งนี้จะกลายเป็น (31 - 50% = 15.5) ขอบคุณ dev-null:

r=a=>a.pop?a.reverse().map(r):a

หรือถ้าเราคิดว่าวัตถุนั้นมีreverseคุณสมบัติที่มีสติเราสามารถทำเช่นนั้นได้ (35 - 50% = 17.5):

r=a=>a[R="reverse"]?a[R]().map(r):a

a.pop?a.reverse().map(r):aผมคิดว่าคุณได้อย่างปลอดภัยสามารถตรวจสอบสำหรับอาร์เรย์เช่นนี้: สมมติว่าไม่จำเป็นต้องจัดการvoid 0และกำหนดวัตถุเอง
andlrc

1

Lua, 111 99 * .5 = 55.5 49.5 ไบต์

function r(a)local t={}for i,v in next,a do t[#a+1-i]=type(v)=="table"and r(v)or v end return t end

การเรียกซ้ำที่ดี



1

Brachylog , 5 - 50% = 2.5 ไบต์

ċ↔↰ᵐ|

ลองออนไลน์!

         The input
ċ        which is a list
 ↔       reversed
   ᵐ     with each element
  ↰      passed through this same predicate
    |    is the output. If the input isn't a list,
         it is the output.

ตั้งแต่ยังสามารถสตริงย้อนกลับและจำนวนเต็มเราจะต้องชัดเจนล้มเหลวไม่ใช่รายการที่มีċ


1

ภาษา Wolfram (Mathematica) , 23 -50% = 11.5 bytes

#/.List->Reverse@*List&

ลองออนไลน์!

Listใน Mathematica ( {...}) List[...]เทียบเท่ากับ @*เป็นผู้ดำเนินการองค์ประกอบดังนั้นแทนที่แต่ละรายการที่เกิดขึ้นListด้วยReverse@*Listกลับรายการทุกรายการที่เกิดขึ้นในอินพุต ( Reverse@*List[...]=Reverse[{...}] )


24 -50% = 12 ไบต์

#~Reverse~Range@Depth@#&

ลองออนไลน์!

ไม่เพียงทำงานบนLists


1

Clojure, 38 ไบต์

(และโบนัสที่ฉันเดา แต่ Clojure เป็นภาษาแบบไดนามิกดังนั้นมันจึงมาฟรี)

(fn f[x](if(seq? x)(map f(into()x))x))

นี่เป็นการเริ่มต้นที่ดี แต่ไม่ได้ใช้การเพิ่มประสิทธิภาพเหล่านี้:

  • กำหนดฟังก์ชั่นที่ไม่ระบุชื่อกับแทนที่จะเป็นชื่อหนึ่งด้วยfn defnแต่เรายังต้องใช้ชื่อ "ขอบเขต"fเพื่อสอบถามซ้ำ
  • นำเข้าเป็นรายการแทนเวกเตอร์จากนั้นเราสามารถใช้seq?แทนcoll?
  • ใช้(into () ...)แทนreverse
  • ย้อนกลับxก่อนการแมปเราไม่จำเป็นต้องมีช่องว่างมากแล้ว

0

ทับทิม , 32 - 50% = 16 ไบต์

ฟังก์ชั่นวนซ้ำ การใช้rescueเพื่อจับNoMethodErrorทริกเกอร์นั้นเมื่อพยายามreverseหาตัวเลขหรือmapสตริงนั้นสั้นกว่า 2 ไบต์มากกว่าการตรวจสอบว่าอินพุตเป็นอาร์เรย์ผ่านa==[*a]หรือไม่

f=->a{a.reverse.map(&f)rescue a}

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.