แยกรายการของรายการลงในรายการเศร้า


12

ในการท้าทายนี้คุณจะต้องแยกวิเคราะห์รายการเป็นรูปแบบรายการที่ง่ายขึ้น

ความท้าทายนี้ขึ้นอยู่กับตัวแยกวิเคราะห์เศร้าของฉัน ในตัวแยกวิเคราะห์ sadflak ของฉันมีการลบทั้งหมด () แทนที่ด้วยผลรวมของ () ที่จุดเริ่มต้นของรายการเพื่อให้โปรแกรมทำงานได้เร็วขึ้น

ในการแยกวิเคราะห์ไปยัง Sad-List คุณต้องทำสิ่งนี้ (การใช้ python ใช้ tuple ของ tuples):

def sadlistfunc(list):
    new-sadlist = [0]
    for i in list:
        if i == ():
            new-sadlist[0]+=1
        else:
            new-sadlist.append(sadlistfunc(i))

นี่คือฟังก์ชั่นวนซ้ำ สำหรับรายการให้เริ่มต้นรายการใหม่เริ่มต้นด้วยจำนวน () จากรายการอินพุตจากนั้นส่วนที่เหลือของรายการนี้คือรุ่นเศร้ารายการของทุกรายการที่ไม่ใช่ () จากอินพุตรายการตามลำดับ ส่งคืนรายการ

การป้อนข้อมูล:

คุณสามารถป้อนข้อมูลในรูปแบบที่แตกต่างกันไม่กี่:

  • คุณอาจใช้มันเป็นรายการ
  • คุณอาจใช้มันเป็นสิ่งอันดับ
  • คุณอาจใช้มันเป็นสตริง

ถ้าคุณคิดว่ามันเป็นสตริงคุณควรใช้วงเล็บบางอันตามที่ปรากฎในสมอง คุณไม่สามารถใช้อักขระ 1 และ 2

เพียงแค่มีเหตุผล

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

เอาท์พุท:

อาจเป็น list หรือ tuple หรือ string หรืออะไรก็ตาม คุณสามารถใช้รูปแบบผลลัพธ์ที่สมเหตุสมผลเช่นเดียวกับฉันทามติเมตา

ตัวอย่าง:

(()()()) = [3]
(((()))) = [0,[0,[1]]]
((())()(())) = [1, [1], [1]]
() = invalid input, if the outside bracket is explicit.
((((())())())(())()) = [1, [1, [1, [1]]], [1]]

โปรดทราบว่าการป้อนข้อมูลไม่เข้มงวด อินพุตเหล่านี้อาจเป็น:

[[],[],[]]
[[[[]]]]
[[[]],[],[[]]]
[]
[[[[[]],[]],[]],[[]],[]]

หรือรูปแบบที่เหมาะสมอื่น ๆ

อธิบายกรณีทดสอบ:

(()()((())())())

ถึง "sadify" สิ่งนี้ก่อนอื่นเราต้องนับจำนวน ()

 ()()        ()
(    ((())())  )

3. จากนั้นเราจะลบสิ่งเหล่านี้และเพิ่ม 3 ตอนเริ่มต้น

(3,((())()))

มีหนึ่งรายการในรายการนี้ เราทำให้สิ่งนี้เศร้า

((())())

เท่าไหร่ ()?

     ()
((())  )

1. เราลบและเพิ่ม 1 เมื่อเริ่มต้น

(1,(()))

มีหนึ่งรายการในนั้น

(())

นับ

 ()
(  )

ลบและเพิ่มจำนวน

(1)

จากนั้นเราใส่กลับเข้าไปในรายการ

(1,(1))

จากนั้นเราใส่กลับเข้าไปในรายการ

(3,(1,(1)))

เสร็จแล้ว

นี่คือสั้นกว่าดีกว่า


โปรดทราบว่าในตัวแยกวิเคราะห์เศร้าจริง ๆ จำนวน () เป็นรายการที่สองของรายการและรายการแรกคือดัชนีของคำสั่ง
Destructible Lemon

Good ol 'JavaScript for... inทำให้ฉันจำได้ว่าทำไมคุณไม่เคยใช้: Fiddle
Stephen

ผมคิดว่าควรจะเป็น((((())())())(())()) = [1, [1, [1, [1]], [1]] ((((())())())(())()) = [1, [1, [1, [1]]], [1]]
Renzo

คำตอบ:


4

Pyth , 13 ไบต์

L+]/bYyM-b]Yy

ชุดทดสอบ

มันทำงานอย่างไร

L+]/bYyM-b]Yy
L               define a function y with argument b:
   /bY              list 1: count how many [] can be found in b
  ]                         wrap into singleton
        -b]Y        list 2: filter out [] from b
      yM                    apply y (this function) to each
 +                  concatenate the two lists above
            y   apply y to the input

]คุณสามารถลบครั้งแรก
Erik the Outgolfer


2

Brachylogขนาด 21 ไบต์

;[[]]x{↰₀}ᵐA&{∋∅}ᶜg,A

ลองออนไลน์!


ไบต์และตัวอักษรไม่เท่ากัน การใช้ UTF-8 นั้นจะใช้เวลา33ไบต์แม้จะเป็นเพียง 21 ตัวอักษร
Samadi

1
@Samadi Brachylog ใช้หน้ารหัสของตัวเองซึ่งได้รับอนุญาตต่อคำตอบเมตานี้
Leun Nun

อ่าฉันเข้าใจแล้ว ฉันได้รับการสับสนเล็กน้อย ขอบคุณสำหรับการชี้แจง!
Samadi

@Samadi ไม่มีปัญหาคำถามนี้ถูกถามตลอดเวลา
Leun Nun

2

Mathematica ขนาด 42 ไบต์

{#~Count~{0},##&@@#~DeleteCases~{0}}&//@#&

หลีกเลี่ยงการเรียกซ้ำโดยใช้//@( MapAll) ซึ่งแม็พฟังก์ชันกับทุกโหนดในทรี นอกจากนี้ยังหมายความว่าฟังก์ชั่นจะถูกดำเนินการจากใบขึ้นไป อย่างไรก็ตามมันจะถูกนำไปใช้กับกระบวนการ{}ที่กลายเป็น{0}กระบวนการ นั่นเป็นเหตุผลที่เรานับและลบแทน{0}{}



2

Clojure, 59 ไบต์

(fn f[i](conj(map f(remove #{[]}i))(count(filter #{[]}i))))

ไม่แตกต่างจากคำตอบCommonLispมาก มันcountและremoveดูเหมือนว่าจะยอมรับการสร้างนิดหน่อยที่นี่ฉันต้องใช้ชุด


2

ที่จริงแล้ว 12 ไบต์

;[]@c@;░Q£Mo

ลองออนไลน์!

รับอินพุตเป็นรายการวงเล็บเหลี่ยมที่คั่นด้วยเครื่องหมายจุลภาคด้วยเครื่องหมายวงเล็บด้านนอกอย่างชัดเจน

คำอธิบาย:

;[]@c@;░Q£Mo
;[]@c         count the number of empty lists
     @;░      filter out empty lists
        Q£Mo  recurse with filtered list and append result

2

Python 2 , 69 46 45 ไบต์

f=lambda l:[l.count([])]+map(f,filter(len,l))

ลองออนไลน์!


ฉันคิดว่าคุณต้องเพิ่มf=ใน bytecount ของคุณเนื่องจากคุณกำลังใช้งานฟังก์ชั่น f และตั้งชื่อมิฉะนั้นจะทำให้การแก้ปัญหาของคุณไม่เป็นปัญหา
Leo

@Leo คุณพูดถูก
ovs

1

เยลลี่ 10 ไบต์

Tị߀;@ċ“”$

ลองออนไลน์!

รับอินพุตเป็นรายการของรายการ ...

แน่นอนว่ามันใช้อัลกอริทึมที่คำตอบอื่นใช้ ;)


นั่นไม่ใช่ 10 ไบต์ มันเป็น 10 ตัวอักษร จำนวนไบต์จะขึ้นอยู่กับการเข้ารหัสที่คุณใช้
Samadi

2
@Samadi ไม่ Jelly มีชุดอักขระเฉพาะซึ่งเป็นค่าเริ่มต้นและสามารถแทนอักขระเหล่านั้นเป็นหนึ่งไบต์ ดูที่นี่
อดัม

ฉันเห็น. ขอขอบคุณสำหรับการชี้แจง!
Samadi

1

Haskell , 102 ไบต์

data L=I Int|T[L]deriving Show
(I n:r)#m=r#(n+m)
(x:r)#m=x:r#m
_#m=[I m]
f(T[])=I 1
f(T t)=T$map f t#0

ลองออนไลน์!

เนื่องจาก Haskell พิมพ์อย่างเคร่งครัดจึงไม่มีรายการซ้อนกันโดยพลการ ในฐานะที่เป็นยาdata L=I Int|T[L]deriving Showประกาศรายการที่ซ้อนกันเหมือนต้นไม้ที่มีทั้ง Ints หรือรายการที่ว่างเปล่าเป็นใบไม้

การป้อนข้อมูลเป็นเหมือนในรูปแบบตัวอย่างที่สองกับคอนสตรัคเพิ่มเติมก่อนที่จะเปิดรั้ง:T เดียวกันจะไปสำหรับการส่งออกที่มีแต่ละหมายเลขจะถูกนำโดยผู้สร้างT[T[T[]],T[],T[T[]]] Iฟังก์ชั่นfดำเนินการsaddening

เอาต์พุตสำหรับกรณีทดสอบ:

T [I 3]
T [T [T [I 1],I 0],I 0]
T [T [I 1],T [I 1],I 1]
T [T [T [T [I 1],I 1],I 1],T [I 1],I 1]

1

Javascript (ES6), 77 ไบต์

แข็งแรงเล่นกอล์ฟ:

let m=a=>!a.length||a.map(m).reduce((b,c)=>(c.length?b.push(c):b[0]++,b),[0])

Ungolfed:

const traverse = arr => !arr.length || arr
    .map(traverse)
    .reduce(
        (accum, val) => (val.length ? accum.push(val) : accum[0]++, accum),
        [0]
    );

การสาธิต

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