จริงหรือเปล่า? ถามเจลลี่!


32

พื้นหลัง

แรงบันดาลใจจากอ็อกเทฟ (และโดยการขยาย MATL's) การตีความที่สะดวกมากของเมทริกซ์ความจริง / ความเท็จเยลลี่ได้รับอะตอมอะตอมȦ (ออคเทฟทั้งหมด )

Ȧใช้เวลาอาร์เรย์เป็น input และส่งกลับ1ถ้าอาร์เรย์คือไม่ว่างและไม่ได้มีจำนวน0 (จำนวนเต็มลอยหรือซับซ้อน) ที่ใดก็ได้ในโครงสร้าง ; มิฉะนั้นก็จะส่งกลับ0

ตัวอย่างเช่นอาร์เรย์[[]]เป็นความจริงเพราะมันไม่ว่างเปล่าและไม่มีเลขศูนย์ แต่[[0]]เป็นเท็จเพราะมันมีค่า0อยู่ที่ระดับชั้นในสุด

งาน

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

การส่งของคุณจะต้องปฏิบัติตามกฎต่อไปนี้

  • ค่าความจริงและเท็จจะต้องสอดคล้องกับอินพุตทั้งหมดเช่นอาร์เรย์ทั้งหมดที่Ȧคืน1ต้องจับคู่กับค่าความจริงเดียวกันและอาร์เรย์ทั้งหมดที่ all คืน0ต้องจับคู่กับค่าเท็จเดียวกัน

  • เนื่องจากโปรแกรมแบบเต็มสามารถใช้การแทนค่าสตริงของอาร์เรย์เป็นอินพุตจึงอนุญาตให้ทำได้ อย่างไรก็ตามคุณต้องใช้การแสดงคานคาลิกในภาษาของคุณโดยส่งคืนโดยreprหรือคล้ายกัน

    โดยเฉพาะอย่างยิ่งคุณไม่สามารถสันนิษฐานได้ว่าองค์ประกอบแรกของอาร์เรย์จะนำหน้าด้วยช่องว่าง

  • หาก (และเฉพาะในกรณี) ภาษาของคุณไม่สามารถแทนอาร์เรย์แบบขรุขระได้คุณอาจใช้การแทนค่าสตริงของอินพุตโดยใช้ไวยากรณ์ที่เป็นมาตรฐานของภาษาการเขียนโปรแกรมที่มีอยู่แล้ว

  • หากภาษาของคุณมีหลายวิธีในการแทนอาร์เรย์แบบขรุขระ (เช่นรายการและสิ่งอันดับ) คุณจะต้องสนับสนุนหนึ่งในนั้นเท่านั้น

  • ถ้าภาษาของคุณได้ในตัวว่าตัวเองเป็นส่งที่ถูกต้องเพื่อความท้าทายนี้คุณไม่สามารถใช้มันในคำตอบของคุณ อนุญาตบิวด์อินอื่นทั้งหมด

  • คุณควรโพสต์คำตอบโดยใช้ทั้งอาร์เรย์และการจัดการสตริงแม้ว่าจะสั้นกว่าอีก

  • ใช้กฎมาตรฐานทั้งหมด

อาจรหัสที่สั้นที่สุดในไบต์ชนะ!

กรณีทดสอบความจริง

[1]
[10]
[[]]
[[[[1]]]]
[[], [1], [1, 2]]
[[1], [1, [2]], [1, [2, [3]]]]
[[8], [8, [9]], [8, [9, [10]]]]

กรณีทดสอบเท็จ

[]
[0]
[0, -1]
[-1, 0]
[[[[0]]]]
[[0], [1, 2], [3, 4, 5]]
[[8], [8, [9]], [8, [9, [1, 0]]]]
[-1, 0, 0, 0]

จากกรณีทดสอบคุณหมายถึง "มีหมายเลข 0" ให้หมายถึงที่ใดก็ได้ในโครงสร้างต้นไม้หรือไม่ นั่นไม่ใช่สิ่งที่ฉันเดาได้
xnor

ใช่ทุกที่ ฉันจะพยายามอธิบายให้ชัดเจน
Dennis

คุณหมายถึงอะไรอย่างแน่นอน "คุณไม่สามารถสันนิษฐานได้ว่าการเป็นตัวแทนสตริงจะมีรูปแบบเฉพาะ"?
Dada

2
สิ่งเหล่านี้ไม่ใช่อาร์เรย์แบบขรุขระ - อาร์เรย์แบบขรุขระจะมีตัวเลขทั้งหมดที่มีความลึกเท่ากันเนื่องจากขนาดเท่านั้นจะแตกต่างกันไปไม่ใช่ประเภทองค์ประกอบ
Ørjan Johansen

2
@Qwertiy ใช่ไหม "ภาษาส่วนใหญ่" ที่ "ทุกอย่าง" เป็นObject... ฉันชอบมากที่สุดคือ Haskell ซึ่งไม่เป็นเช่นนั้น หรือใน C อย่างน้อยก็ไม่ใช่วิธีที่ช่วยให้คุณสามารถผสมอาร์เรย์และ ints อย่างปลอดภัย ทั้งสองภาษานั้นมีความสามารถในการเรียงลำดับแบบขรุขระได้อย่างสมบูรณ์ แต่ก็ยังไม่สามารถใช้กับปัญหานี้ได้
Ørjan Johansen

คำตอบ:


38

เยลลี่ 3 ไบต์

ṭFẠ

F แผ่รายการอินพุตให้แบน

tacks ในรายการอินพุตต้นฉบับเป็นองค์ประกอบซึ่งเป็นเท็จถ้าหากว่าว่างเปล่า

จากนั้นตรวจสอบว่าองค์ประกอบใด ๆ ในรายการที่แบนหรือรายการเดิมนั้นเป็นเท็จหรือไม่


(คำตอบเดิม)

FẠ^Ṇ

ขอบคุณเดนนิสที่ให้กำลังใจในการหาทางออกที่ตรงกับเขา

FẠให้ 0 ถ้าอินพุตมีค่าเท็จที่ระดับความลึกใด ๆ มิฉะนั้น 1. นี่คือสิ่งที่Ȧทำยกเว้นรายการที่ว่างเปล่า

ให้ 1 ถ้าอินพุตเป็นค่าที่ผิดพลาด, อื่น ๆ 0 รายการที่เป็นเท็จเท่านั้นคือรายการที่ว่างเปล่า

แฮคเกอร์ทั้งสองให้คำตอบ


F;WẠ

นี่เป็นวิญญาณเดียวกันกับของเดนนิสF;LẠแต่แทนที่จะใช้Lเพื่อใส่ศูนย์ในรายการเมื่อรายการว่างเปล่ามันใช้Wเพื่อใส่รายการเปล่าเข้าไปในตัวมันเอง (การผลิต[[]]) ทำให้มันมีองค์ประกอบที่เป็นเท็จ


30
เก่งกว่าในความท้าทายของฉันและภาษาของฉันเอง ... ทำได้ดีมาก!
Dennis

15

เรติน่า 10 ไบต์

A`\b0
^...

ลองออนไลน์!

ก่อนอื่นเราจะลบอินพุตถ้ามันมีศูนย์ เราพยายามจับคู่อักขระอย่างน้อยสามตัวตั้งแต่เริ่มต้นของสตริง (เพื่อให้แน่ใจว่าอินพุตไม่ได้ถูกกำจัดในขั้นตอนก่อนหน้าหรือเพียง[]เพื่อเริ่มต้นด้วย)


12

Ruby, 25 24 23 18 16 ไบต์

p$_!~/\D0|^..$/

ต้องการ-nแฟล็กบนบรรทัดคำสั่ง (+1 ไบต์, -e-> -ne)

ลองออนไลน์!

นี่เป็นโปรแกรมเต็มรูปแบบที่รับอินพุตในรูปแบบอาเรย์แบบบัญญัติของ Ruby บน STDIN และเอาต์พุตtrueหรือfalseบน STDOUT

 $_              # line of input that was read automatically (-n)
   !~/        /  # does not match the regex...
      \D0        #   a non-digit followed by a 0
         |       #   or...
          ^..$   #   a 2-length string (which must be [], the empty array)
p                # output the result

รุ่นฟังก์ชั่น23 ไบต์ :

->a{"#{a}"!~/\D0|^..$/}

นี่คือ proc ที่รับอาร์กิวเมนต์หนึ่งชุดเพื่อทำการทดสอบ

ขอบคุณMartin Enderสำหรับไบต์และVenteroสำหรับสองไบต์!


คุณสามารถบันทึกอีกสองไบต์โดยใช้p$_!~/\D0|^..$/(หรือใช่p ! ~/\D0|^..$/ช่องว่างที่สำคัญ) พร้อมกับการ-nตั้งค่าสถานะ
Ventero

8

เยลลี่ 4 ไบต์

FẠ_Ṇ

ลองออนไลน์!

Ȧอัตราผลตอบแทน0ถ้าใส่ว่างเปล่าหรือมีอย่างอื่นก็คือ01

FẠผลผลิต0ถ้าอินพุตแบบแบนมี a 0, เหลือเพียงเคสขอบของอาเรย์ที่ว่างเปล่า (เนื่องจากอินพุตรับประกันว่าจะเป็นอาเรย์)

เป็น non-vectorising ตรรกะไม่ใช่ monad และด้วยเหตุนี้ส่งคืน0สำหรับรายการที่ไม่ว่างและ1สำหรับรายการว่าง ในฐานะที่เป็นเช่นนี้ก็สามารถจะ subtraced จากผลของการใช้FẠ_


ลงหนึ่งครั้งอย่างน้อยหนึ่งครั้งที่จะไป
Dennis

@Dennis FẠạṆใช่มั้ยใช่มั้ย
Erik the Outgolfer

@EriktheOutgolfer ไม่ไม่ใช่ คำตอบที่ฉันมีอยู่ในใจเกี่ยวข้องกับกรณีขอบของอาร์เรย์ที่ว่างเปล่าและจะให้ผลลัพธ์ที่แตกต่างกันสำหรับอาร์เรย์ที่ไม่ใช่
Dennis

@Dennis ชอบส่งคืน A สำหรับ True, B สำหรับ false, C สำหรับ empty และ D สำหรับ non-array หรือไม่ นั่นจะไม่ใช่การแข่งขัน สิ่งที่ฉันทำคือใช้ความแตกต่างแบบสัมบูรณ์แทนความแตกต่างเพราะไม่มีบูลีนลบ
Erik the Outgolfer

@EriktheOutgolfer B ต้องเท่ากับ C เพื่อให้สอดคล้องกับข้อมูลจำเพาะของความท้าทาย แต่ D สามารถเป็นอะไรก็ได้เนื่องจากอินพุตมีการรับประกันว่าเป็นอาร์เรย์
Dennis

8

05AB1E , 9 8 ไบต์

-1 ไบต์ขอบคุณ Emigna

)Q¹˜0å~_

คำอธิบาย:

)Q        Is the length of the input 0?
  ~    _  ... NOR ... (just for you, Dennis) 
   ¹˜     Input deep flattened
     0å   Contains 0

ลองออนไลน์!


[[]]ดูเหมือนว่าจะล้มเหลว
Dennis

เป็น0จริงๆ truthy ใน 05AB1E?
Dennis

อาร์เรย์ทั้งหมดที่Ȧส่งคืน 1 ต้องจับคู่กับค่าความจริงเดียวกันและทุกอาร์เรย์ที่Ȧส่งคืน 0 ต้องจับคู่กับค่าที่ผิดพลาดเหมือนกัน (เหมืองของฉัน)
Dennis

1
@Dennis Alright ถูกหัวเราะเยาะด้วยการปฏิเสธทางตรรกะที่นั่น
Okx

1
แย่แล้วสำหรับฉัน : P
Dennis

7

Mathematica ขนาด 17 ไบต์

#!={}&&#~FreeQ~0&

FreeQตรวจสอบกับ0เราหรือไม่ แต่แน่นอนว่ามันจะกลับมาTrueเป็นอินพุต{}ดังนั้นเราจึงต้องตรวจสอบกรณีนั้นแยกจากกัน


7

APL (Dyalog), 21 12 7 ไบต์

Golfed 5 ไบต์ขอบคุณAdámโดยใช้ส้อม

⍬∘≡⍱0∊∊

ลองออนไลน์!

นี่เป็นครั้งแรกที่ฉันลอง Dyalog ยินดีต้อนรับเคล็ดลับการเล่นกอล์ฟ!

คำอธิบาย

⍬∘≡                   Fork; Is the argument a null set
   ⍱                  Nor
    0∊∊               0 belongs to the enlisted form of the argument
                      For example, (1 (2 (3 (0)))) would become
                      1 2 3 0 using the ∊ monad
                      Then we check if zero belongs to this vector

+1 โปรดทราบว่าคุณกำลังรวมผลลัพธ์ของการทดสอบสองรายการ นี่คือที่สมบูรณ์แบบสำหรับส้อม ⍬∘≡คือการทดสอบทางซ้าย (การตั้งค่าที่ว่างเปล่า - เป็น - เพื่อ - เหมือนกัน), และ0∊∊เป็นการทดสอบที่ถูกต้อง รวมมันเข้าด้วยกัน: ⍬∘≡⍱0∊∊. ลองออนไลน์!
อดัม

นอกจากนี้คุณอาจต้องการใช้ชื่อ "APL (Dyalog)" เพื่อให้ผู้ใช้สามารถค้นหาสิ่งที่คุณใช้
อดัม

@ Adámขอบคุณสำหรับเคล็ดลับ!
Kritixi Lithos

6

ภาษาสคริปต์การทำงานของ Flashpoint , 199 188 ไบต์

A={f={private["_i","_r"];_r=1;_i=0;while{_i<count _this}do{o=_this select _i;if(o in [o])then{if(o==0)then{_r=0}}else{_r=o call f};_i=_i+1};_r};if(count _this==0)then{0}else{_this call f}}

โทรด้วย:

[3,6,4,[4,6],[3,6,[],[2,4,[0],3]]] call A

หรือด้วย:

hint format["%1", [3,6,4,[4,6],[3,6,[],[2,4,[0],3]]] call A]

คำอธิบาย:

ในภาษาสคริปต์ของเกมสตริงใด ๆ ที่มีรหัสสามารถเรียกใช้ได้ วงเล็บปีกกา{}แสดงถึงการเริ่มต้นและจุดสิ้นสุดของสตริง (เครื่องหมายอัญประกาศทำงานมากเกินไป แต่ที่ได้รับยุ่งเมื่อพวกเขาจะซ้อนกัน.) ดังนั้นA={...}กำหนดสตริงกับตัวแปรและตัวแปรนั้นจะสามารถเรียกเช่นฟังก์ชั่นที่มี:A <argument> call Aโดยทั่วไปสตริงใด ๆ สามารถถือว่าเป็นบล็อกของรหัส

จากนั้นภายใน "ฟังก์ชั่น" เรากำหนดฟังก์ชั่นอื่นA ประกาศตัวแปรทั้งสองและท้องถิ่นเพื่อฟังก์ชั่น ชื่อตัวแปรท้องถิ่นจะต้องเริ่มต้นด้วยการขีดเส้นใต้fprivate_i_rf

while {} do {}คือลูปโดยที่สตริงแรก (แสดงโดย{}) มีโค้ดสำหรับเงื่อนไขลูปและสตริงที่สองสำหรับลูป body

_thisเป็นอาร์กิวเมนต์ที่ส่งผ่านกับcallฟังก์ชัน _thisสามารถเป็นประเภทใดก็ได้ แต่ที่นี่เราคิดว่ามันเป็นอาร์เรย์

ในวงที่o=_this select _iเข้าถึง _i: oองค์ประกอบของอาร์เรย์วันที่และกำหนดให้กับตัวแปร if (o in [o])เป็นเคล็ดลับในการตรวจสอบว่าoเป็นอาร์เรย์อื่นหรือไม่ ถ้าoเป็นเลข (หรือสิ่งอื่นที่ไม่ใช่อาร์เรย์) o in [o]จะประเมินไปtrueเพราะinฟังก์ชั่นพบการจับคู่ค่าจากอาร์เรย์o [o]ถ้าoเป็นอาร์เรย์การแสดงออกให้ผลfalseเพราะinปฏิเสธที่จะเปรียบเทียบอาร์เรย์

ถ้าoไม่ใช่อาร์เรย์เราตรวจสอบว่ามันเท่ากับศูนย์และถ้าเป็นเช่นนั้นเราจะตั้งค่าตัวแปร_rซึ่งเราจะใช้เป็นค่าตอบแทนเป็นศูนย์ มิฉะนั้นถ้าoเป็นอาร์เรย์เรากำหนดให้_rกับค่าส่งคืนของการเรียกแบบเรียกซ้ำfด้วยอาร์เรย์ใหม่oเป็นอาร์กิวเมนต์

หลังจากวนรอบ, ในตอนท้ายของฟังก์ชันf, เราประเมินค่านิพจน์_r, ซึ่งให้ค่าของ_r, และเนื่องจากนี่คือนิพจน์สุดท้ายที่จะถูกประเมิน, นี่คือสิ่งที่การเรียกฟังก์ชั่นfส่งคืน

ตอนนี้ที่เราได้กำหนดไว้f( fไม่จำเป็นต้องอยู่ภายในAแต่วิธีนี้เราจะได้ประกาศว่าตัวแปรท้องถิ่น / ฟังก์ชั่น (ไม่แตกต่างกันจริงๆ) ของAถ้าเราไม่ได้ต้องการที่จะบันทึกไบต์บางส่วน) Aให้ของได้รับกลับมา if (count _this == 0)ตรวจสอบว่าAอาร์เรย์อินพุตว่างหรือไม่และถ้าเป็นจะAส่งคืน 0 มิฉะนั้นfจะเรียกใช้ฟังก์ชันและค่าส่งคืนจะเป็นAค่าส่งคืน

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


รออะไร?! การทำงานของ Flashpoint?
Brain Guider

เป็นอย่างไรบ้าง อะไร??? confuzed
Christopher

@DownChristopher เพิ่มคำอธิบายแล้ว
Steadybox

1
@AnderBiguri ใช่ทำไมล่ะ ภาษาสคริปต์ของเกมนั้นเหมาะกับคำจำกัดความของภาษาโปรแกรมที่ให้ไว้ในเมตาโพสต์ที่เชื่อมโยงกับคำถาม
Steadybox

1
@ Steadybox ฉันสับสนเกี่ยวกับการมีอยู่ของสิ่งที่ไม่ถูกต้อง !!
Brain Guider

5

Perl 5 , 15 ไบต์

ที่บันทึกไว้ 2 ไบต์โดยใช้เทคนิคเดียวกับ Doorknob ของคำตอบทับทิม

14 ไบต์ของรหัสเมือง + -pธง

$_=!/\b0|^..$/

ลองออนไลน์!

/.../ตรวจสอบให้แน่ใจว่าอาร์เรย์ไม่ว่างเปล่า (จะจับคู่กับอาร์เรย์ใดก็ได้ แต่[].
/\b0/จะจับคู่หากมี0ในอาร์เรย์เท่านั้น ( \bทำให้แน่ใจ0ว่าไม่ได้เป็นส่วนหนึ่งของตัวเลขอื่น แต่เป็นจำนวนเต็ม)


5

Haskell , 48 ไบต์

f x=or[elem c"[,"|c:'0':_<-scanr(:)[]x]<(x<"[]")

ลองออนไลน์!

ขอบคุณ Lynn สำหรับกรณีทดสอบและx<"[]"เคล็ดลับ

ความไม่เท่าเทียมกันด้านนอกจะต้อง(x<"[]")เป็นจริง (ไม่ใช่รายการที่ว่างเปล่า) และor[elem c"[,"|c:'0':_<-scanr(:)[]x]เป็นเท็จ (ไม่มีศูนย์)

ตัวละคร 0จะถูกตรวจพบว่าเป็นดังต่อไปนี้,หรือเมื่อเทียบกับจำนวนเช่น[ 20การแสดงออกscanr(:)[]xสร้างพอเพียงทั้งหมดlและจับผู้ที่มีตัวละครที่สองคือc:'0':_<- '0'จากนั้นelem c"[,"ตรวจสอบไม่ว่าจะเป็นตัวอักษรตัวแรกเป็นหรือ,[

ผมถือว่านี่เป็นที่ที่รายการ Haskell สไตล์ไม่ได้มีช่องว่าง แต่ถ้าเป็นเช่นนั้นก็สามารถถูกแทนที่ด้วย','' '

ต่อไปนี้เป็นวิธีการ 48- ไบต์ที่ตรงกว่าแม้ว่ามันจะสร้าง0และ1ไม่ได้เป็น Truthy / Falsey ใน Haskell

f"[]"=0
f(c:'0':_)|elem c"[,"=0
f(_:t)=f t
f _=1

5

เยลลี่ 4 ไบต์

F;LẠ

ลองออนไลน์!

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

F;LẠ  Main link. Argument: A (array)

F     Flatten A.
  L   Yield A's length.
 ;    Concatenate.
   Ạ  All; Tell if all elements of the resulting 1D array are truthy.

โปรดทราบว่าẠอะตอมมีพฤติกรรมเหมือน Python allและค่อนข้างแตกต่างจาก anned ที่ถูกแบน


8
หัวขึ้น: นี้ไม่ได้เป็นเพียง 4 L;FẠไบต์แก้ปัญหาวุ้นนอกเหนือจากที่เห็นได้ชัด ใครสามารถหาอีกคนหนึ่งได้บ้าง
Dennis

4

JavaScript (ES6), 34 ไบต์

a=>a.length&&+!~`,${a}`.search`,0`

กรณีทดสอบ


คุณอาจจะสามารถใช้แทน!!a[0] a.length(คุณไม่ต้องกังวลเกี่ยวกับa[0]การเป็นศูนย์เนื่องจากผลลัพธ์จะต้องเป็นเท็จในกรณีนี้ต่อไป)
Neil

ไม่เป็นไรฉันเห็น Qwerty มาถึงแล้ว
Neil

4

จูเลีย 45 ไบต์

a(x)=all(a,x);a(x::Int)=x!=0;g(x)=x!=[]&&a(x)

นี้จะสร้างฟังก์ชั่นgที่บ่งชี้ว่าȦจะเป็น 1 หรือ 0 aโดยการเรียกฟังก์ชั่น เพื่อให้เหมาะสมaเราใช้การจัดส่งหลายแบบ:

# A method for scalar values
a(x::Int) = x != 0

# A recursive fallback for arrays
a(x) = all(a, x)

ฟังก์ชันallรับอาร์กิวเมนต์ของฟังก์ชันดังนั้นเราจึงเรียกaใช้แต่ละองค์ประกอบของอินพุต จากนั้นเราก็กำหนดฟังก์ชั่นสำหรับการส่งเป็น

g(x) = x != [] && a(x)

โดยทั่วไปเราเพียงแค่ต้องแต่มีการตรวจสอบเพื่อการจัดการอย่างถูกต้องa[]

ลองออนไลน์!


คุณสามารถกำหนดฟังก์ชั่นa(x)หรือg(x)เป็น!xแทน?
Cyoce

4

Grime , 16 14 11 ไบต์

ขอบคุณ Zgarb สำหรับการบันทึก 5 ไบต์

e`s\0v#|!..

ลองออนไลน์!

The eGrime บอกให้ลองและจับคู่อินพุตทั้งหมดและพิมพ์0หรือ1ขึ้นอยู่กับว่าเป็นไปได้หรือไม่

ตัวดำเนินการ|!อย่างมีประสิทธิภาพคือ "ไม่" เนื่องจากx|!y(x|y)!เป็นชวเลข ดังนั้นเราจึงตรวจสอบให้แน่ใจว่าอินพุตไม่ประกอบด้วยศูนย์นำหน้าด้วยสัญลักษณ์หรือเป็นสตริงของอักขระสองตัวเท่านั้น ( [])

หมายเหตุเกี่ยวกับครึ่งหลัง: P#จับคู่สี่เหลี่ยมที่มีการแข่งขันอย่างน้อยหนึ่งPรายการ อย่างไรก็ตามในกรณีของเราPประกอบด้วยทั้งสองอย่างsและ\0โดยปกติแล้วจะต้องใช้วงเล็บ: (s\0)#(เพราะลำดับความสำคัญของ#สูงเกินไป) แต่สิ่งสกปรกมีคุณสมบัติอย่างจริงๆที่คุณสามารถปรับเปลี่ยนลำดับความสำคัญของผู้ประกอบการที่มีและ^ vดังนั้นโดยใช้v#เราลด#ความสำคัญลงเพื่อให้มันต่ำกว่าตัวดำเนินการอื่น ๆ (รวมถึงการต่อข้อมูล) ซึ่งช่วยให้เราสามารถบันทึกไบต์บนวงเล็บได้


3

Pipขนาด 12 ไบต์

#Va&`\b0`NIa

รับอาร์เรย์เป็นอาร์กิวเมนต์บรรทัดคำสั่งในรูปแบบที่พิมพ์[1;[2;3]]ซ้ำของ Pip ผลตอบแทน1สำหรับความจริง0สำหรับเท็จ ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

              a is 1st cmdline arg (implicit)
 Va            Eval a (converting from a string to a list)
#              Take the length (0 if empty, nonzero if nonempty)
   &          Logical AND
    `\b0`      Regex pattern: word boundary followed by 0 (avoids things like 10)
         NIa   Not in a (0 if `\b0` matches in a, 1 if it doesn't)
              Autoprint

คำตอบโบนัส 12 ไบต์

นี่คือฟังก์ชันที่ใช้แทนรายการ:

#_>0=0N_Js^s

#_            Len(arg)
  >0          is greater than 0
    =         which also equals the following (comparison operators chain like Python's):
     0N       Count of 0's in
       _Js^s  arg, joined on space and then split on space (a hacky way to flatten)

TIO


3

Röda , 59 44 ไบต์

f a{[1]if{g(a)[[]!=a]}}g a{[a!=0];try a|g _}

ลองออนไลน์!

fใช้อินพุตจากสตรีมเป็นรายการที่สามารถมีรายการและจำนวนเต็มอื่น ๆ มันจะกลับมา1ถ้าaเป็นจริงและไม่มีอะไรเป็นอย่างอื่น ฟังก์ชั่นตัวช่วยgตรวจสอบว่าaมีศูนย์หรือไม่

คำอธิบาย:

f a{[1]if{g(a)[[]!=a]}}
f a{                  } /* Function declaration */
          g(a)          /* Call g -> pushes some booleans to the stream */
              [[]!=a]   /* Push value []!=a to the stream */
       if{           }  /* If all booleans in the stream are true: */
    [1]                 /*   Push 1 to the stream */
                        /* Otherwise return nothing */

g a{[a!=0];try a|g _}   /* Helper function */
g a{                }   /* Function declaration */
    [a!=0];             /* Push value a!=0 to the output stream */
           try          /* Ignore errors in the following if a is not a list */
               a        /* Push values in a to the stream */
                |g _    /* Pull values from the stream and */
                        /*   call g for each of them */
                        /*   (pushes boolean values to the output stream) */

วิธีแก้ปัญหาที่ทำให้การใช้ regexes อาจจะสั้นกว่ามาก

คำตอบนี้อาจสั้นกว่านี้หากอนุญาตให้ส่งคืนค่าได้หลายค่า สิ่งนี้ได้ถูกกล่าวถึงในคำตอบของฉันก่อนหน้านี้และได้ข้อสรุปว่าอนุญาตให้ใช้กฎเริ่มต้นในการส่งคืนค่าความจริงและค่าเท็จที่แตกต่างกันสำหรับอินพุตที่ต่างกัน แต่ด้วยเหตุผลบางอย่าง OP ห้ามที่นี่และที่นั่น :(


3

สงสัย 15 ไบต์

@&#0! iO0flat#0

การใช้งาน:

(@&#0! iO0flat#0)[1;2;3;[8;9;0]]

การป้อนข้อมูลแบบเรียบรับการเกิดขึ้นทั้งหมด 0, โลจิคัล NOT, โลจิคัลและพร้อมกับอินพุต


3

Haskell , 62 ไบต์

import Data.List
(%)=isInfixOf
f x=not(",0"%x||"[0"%x)&&x<"[]"

ลองออนไลน์!

String -> Boolนี้เป็นฟังก์ชั่น รายการของ Haskell นั้นมีความหลากหลายดังนั้นจึงไม่มีวิธีการแสดงรายการใน[0, [0]]ตัว


ขึ้นอยู่กับกฎ re-worded อินพุตไม่ควรมีช่องว่างเนื่องจาก Haskell arrays จะไม่มีค่าเริ่มต้น อย่างน้อยฉันคิดว่านั่นเป็นการตีความแม้ว่า Haskell จะไม่อนุญาตให้มีอาร์เรย์ขรุขระ แต่ดูเหมือนว่ารหัสของคุณจะทำงานเหมือนกันกับ,``
xnor

2
ขณะที่ผมกำลังพูดคลุมเครือขึ้นในความคิดเห็นคำถาม Haskell ไม่มีอาร์เรย์หยัก (และรายการ) - เป็นเพียงว่ามันไม่พอจริงๆสำหรับสิ่งที่คำถามนี้ต้อง
Ørjan Johansen

3

Python 2 , 45 39 38 ไบต์

lambda a:(a>[])^(' 0'in`a`or'[0'in`a`)

ลองออนไลน์!

-6 ขอบคุณ @BenFrankel


รุ่นก่อนหน้าโดยไม่ต้องแปลงรายการเป็นการพิมพ์ซ้ำสตริง 68 ​​ไบต์:

lambda a:(len(a)and g(a))*1
g=lambda b:all(map(g,b))if b>[]else b!=0

[]นี้จะช่วยให้ในเชิงบวกเท็จ ข้อมูลต่อไปนี้ช่วยประหยัด 6 ไบต์และประสบความสำเร็จใน[]:lambda a:bool(a)^(' 0'in`a`or'[0'in`a`)
Ben Frankel

2

MATLAB, 49 ไบต์

เนื่องจาก MATLAB (เช่นเดียวกับระดับอ็อกเทฟ) ไม่อนุญาตให้มีอาร์เรย์ที่ซ้อนกันเหล่านี้เราจึงตีความว่าเป็นสตริง

ก่อนอื่นเราจะแทนที่ตัวละครที่ไม่ใช่ตัวเลขทั้งหมดด้วยช่องว่าง จากนั้นเราใช้str2numในการแปลงเป็นอาร์เรย์ (1D) ซึ่งเราสามารถนำไปใช้all(ซึ่งได้รับอนุญาตเนื่องจากมันไม่ได้แก้ปัญหานี้ด้วยตัวเองอย่างสมบูรณ์)

s=input('');s(s<45|s>57)=32;disp(all(str2num(s)))

2

egrep, 7 + 3 = 10 ไบต์

\<0|^.]

+3 ไบต์สำหรับที่ต้องการ -vตั้งค่าสถานะที่เพื่อกลับผลลัพธ์

Grep ไม่มีแนวคิดเกี่ยวกับอาร์เรย์ดังนั้นจึงใช้การแทนค่าสตริงตามที่กำหนดในคำถาม รับอินพุตในหนึ่งบรรทัดจาก stdin ส่งคืนผ่านโค้ดทางออก (ละเว้น stdout)

(ตอนนี้ใช้เวอร์ชันที่ไม่ได้คำนึงถึง01และคล้ายกันเนื่องจาก word-of-god คือมันใช้ได้)

รายการ bash / grep ดั้งเดิม:

grep -Ev '\<0+\>|^.]'

ค้นหา0ทุกที่ (ใช้การตรวจสอบขอบเขตของคำ\<และ\>ลดสิ่งต่าง ๆ เช่น10หรือa1) หรือการจับคู่สตริงทั้งหมด[]จากนั้นกลับการจับคู่

ทำให้พังถล่ม:

grep
     -E \    # extended regular expression syntax
     -v \    # invert match
     \<0+\>  # a number of 0s with alphanumeric boundaries on both sides
     |^.\]   # or ']' as the second character (implies '[]')

ไม่โกงแค่เล่นกอล์ฟเก่ง :) Btw, grep สามารถทดสอบเบื้องต้นได้ดังนั้นจึงเป็นภาษาการเขียนโปรแกรมเท่าที่ PPCG เกี่ยวข้อง \<0\|^.]บวก-vจะนับเป็นวิธีแก้ปัญหา 11 ไบต์
Dennis

1
@ เดนนิสเจ๋งขอบคุณ! (ผมเปลี่ยนไปegrepมากกว่าgrepที่จะประหยัดไบต์เพิ่มเติม; ชื่อภาษาไม่ถูกนับรวมไบต์นับ!)
เดฟ

2

Javascript ES6, 24 ตัวอักษร

ทำงานร่วมกับอาร์เรย์ผลตอบแทน1หรือ0:

a=>!!a[0]&!/\b0/.test(a)

ทดสอบ:

f=a=>!!a[0]&!/\b0/.test(a)

console.log([
  [1],
  [10],
  [[]],
  [[[[1]]]],
  [[], [1], [1, 2]],
  [[1], [1, [2]], [1, [2, [3]]]],
  [[8], [8, [9]], [8, [9, [10]]]],
].every(x => f(x)===1))

console.log([
  [],
  [0],
  [0, -1],
  [-1, 0],
  [[[[0]]]],
  [[0], [1, 2], [3, 4, 5]],
  [[8], [8, [9]], [8, [9, [1, 0]]]],
].every(x => f(x)===0))


เนื่องจากค่าส่งคืนอาจเป็นจริง / เป็นเท็จคุณสามารถวาง!!(แม้ว่าคุณจะต้องเปลี่ยน&เป็น&&) บันทึกหนึ่งไบต์
Brian McCutchon

@BrianMcCutchon &ไม่มีเป็นมีไบนารี ในกรณีของการ&&ได้โดยไม่ต้อง!!ส่งออกที่สอดคล้องกันจะถูกหัก: undefinedสำหรับ[], 0สำหรับ[0]และ[0,1,2]และfalseสำหรับคนอื่น ๆ
Qwertiy

ฉันไม่เห็นว่าการทำลายผลลัพธ์ที่สอดคล้องกันนั้นไม่ดีในความท้าทายนี้อย่างไร จุดของฉันกับการเปลี่ยนไปคือการที่คุณจะต้องถ้าคุณใช้คำแนะนำแรกของฉันตั้งแต่&& 2 & 1 == 0
Brian McCutchon

@BrianMcCutchon จุดแรกของคำถาม: "ค่าความจริงและเท็จต้องสอดคล้องกันสำหรับอินพุตทั้งหมดเช่นอาร์เรย์ทั้งหมดที่Ȧส่งคืน 1 ต้องแมปค่าความจริงเดียวกันและอาร์เรย์ทั้งหมดที่Ȧส่งคืน 0 ต้องจับคู่ ในค่าที่ผิดพลาดเหมือนกัน "
Qwertiy

อาฉันขาดมันไปเร็วเกินไป ไม่เป็นไร.
Brian McCutchon

2

√åı¥®ÏØ¿ , 12 4 ไบต์

i0Bu

คำอธิบาย

i            › Take input as a list and automatically flatten it. If empty, push 0.
 0           › Push 0 to the stack
  B          › Pop 0 and push the number of times it appears
   u         › convert top value to its boolean 

หากผลลัพธ์จะต้องมีการแสดงผล ...

i0Buo        › same as above; o outputs the top value on the stack

วิธีแก้ไขก่อนหน้า

ฉันโพสต์สิ่งนี้ก่อนที่จะตระหนักว่าภาษาที่ใช้สแต็กอาจทำให้ค่าบนสแต็กเป็นรูปแบบของเอาต์พุต

i0B¿0oP?!¿o?

คำอธิบาย

i            › Take input as a list and automatically flatten it. If empty, push 0.
 0           › Push 0 to the stack
  B          › Pop 0 and push the number of times it appears
   ¿         › If the top value is true ...
    0        › Push 0
     o       › Output the top value on the stack
      P      › Pop the top value from the stack
       ?     › End if statement
        !    › Boolean opposite of top value
         ¿   › If the top value is true ...
          o  › Output the top value
           ? › End if statement

2

Haskell, 45

ดังที่Lynnและxnorกล่าวไว้ Haskell ไม่ได้มาพร้อมกับชนิดรายการแบบซ้อน แต่มันง่ายที่จะเพิ่มพวกเขาเป็นประเภทข้อมูลที่กำหนดเองและให้ฟังก์ชั่นทำงานในประเภทนั้นและนี่เป็นสิ่งที่ดีกว่าในการใช้งาน (urgh!)สตริง

data L=L Int|T[L]
f(L n)=n/=0
f(T l)=all f l

เพื่อให้สามารถเขียนรายการเช่นตัวอักษรที่มี[1, [2]]ไวยากรณ์คุณจำเป็นต้องพิมพ์ดีดบางอย่าง กรณีทดสอบเต็มรูปแบบ:

{-# LANGUAGE OverloadedLists, TypeFamilies #-}
import GHC.Exts (IsList(..))

instance Num L where
  fromInteger = L . fromInteger
  negate (L n) = L $ negate n
instance IsList L where
  type Item L = L
  fromList = T
main = mapM_ (print . f) (
                    [ [1]
                    , [[[[0]]]]
                    , [[8], [8, [9]], [8, [9, [1, 0]]]]
                    ] :: [L])

ลองออนไลน์!


2

เป็นกลุ่ม 23 ไบต์

:g/0\|^..$/d
:s/.\+/1/<CR>

ลองออนไลน์!

ส่งออกสตริงว่างเปล่าสำหรับเท็จหรือ1เป็นความจริง สิ่งนี้อาจสั้นกว่านี้ถ้าฉันสามารถส่งออกสตริงว่างเปล่าหรือ []เท็จ



1

Lithp , 74 ไบต์

(def f #L::((foldl(flatten L)(?(>(length L)0)1 0)#N,A::((?(== N 0)0 A)))))

ลองออนไลน์!

นี่กลับกลายเป็นนานกว่าที่ฉันคาดไว้ []กรณีสะดุดฉันขึ้นและเพิ่มไม่กี่ไบต์ มันจะทำให้รายการแบนและพับเป็นซ้ายและถ้าพบ 0 มันจะตั้งค่าตัวสะสมเป็น 0


1

Ruby , 24 22 ไบต์

->a{a[0]&&a*?!!~/\b0/}

ลองออนไลน์!

ใช่ฉันรู้ว่ามีวิธีแก้ปัญหาที่ดีกว่าใน Ruby แต่ฉันต้องการหาคนรับอาร์เรย์ในอินพุตแทนที่จะเป็นสตริง


1

tinylisp , 70 64 ไบต์

(load library
(d _(q((X)(i(c()X)(all(map _ X))X
(q((L)(i L(_ L)0

บรรทัดสุดท้ายเป็นฟังก์ชั่นแลมบ์ดาชื่อที่จะนำรายชื่อและผลตอบแทน1สำหรับ "truthy อันเดอร์Ȧ" และ0สำหรับ falseyลองออนไลน์!

Ungolfed

(load library)

(def _Ȧ
 (lambda (val)
  (if (equal? (type val) List)
   (all (map _Ȧ val))
   val)))

(def Ȧ
 (lambda (ls)
  (if ls
   (_Ȧ ls)
   0)))

ฟังก์ชั่นตัวช่วยแบบเรียกซ้ำทำงานส่วนใหญ่ หากการโต้เถียงเป็นรายการเราmap จะพิจารณาองค์ประกอบของมันและกลับมา1หากพวกเขาเป็นความallจริง0หากมีการเท็จ (สะดวกallส่งกลับ1เมื่อได้รับรายการที่ว่างเปล่า) มิฉะนั้นอาร์กิวเมนต์ต้องเป็นจำนวนเต็ม เราคืนค่าตามที่เป็น ( 0เป็นเท็จและจำนวนเต็มอื่น ๆ ทั้งหมดเป็นจริงใน tinylisp)

ฟังก์ชั่นหลักȦตรวจสอบว่ารายการไม่ว่างเปล่า ถ้าเป็นเช่นนั้นจะเรียก; ถ้าไม่มันกลับ0มา

รุ่นแข็งแรงเล่นกอล์ฟใช้ประโยชน์จากพฤติกรรมที่ไม่ได้กำหนดบางอย่างมากกว่าที่จะใช้(e(type X)List)ในการทดสอบว่าXเป็นจำนวนเต็มหรือรายการก็ไม่(c()X)ซึ่งพยายามที่จะcons(ย่อหน้า) Xรายการที่ว่างเปล่าบน หากXเป็นรายการผลลัพธ์นี้จะอยู่ในรายการที่ไม่ว่างเปล่าซึ่งเป็นความจริง หากXเป็นจำนวนเต็ม tinylisp จะส่งข้อความแสดงข้อผิดพลาดและส่งคืนรายการว่างซึ่งเป็นเท็จ เนื่องจาก stderr ถูกละเว้นวิธีการนี้จึงถูกต้อง


0

PHP, 63 54 ไบต์

บันทึก 9 ไบต์โดย @ user63956

function a($a){return$a&&!strpos(print_r($a,1)," 0");}

รับอาร์เรย์เป็นอินพุต return trueหรือfalse: ถ้า$aไม่ว่าง
ตรวจสอบว่าprint_routput มี0ค่าหรือไม่

วิธีแก้ปัญหาอาร์เรย์ 83 ไบต์

function b($a,$r=0){$r|=$a;foreach($a as$v)$r|=is_array($v)?b($v,1):!!$v;return$r;}

ส่งกลับฟังก์ชัน recursive หรือ10

ทำให้พังถล่ม

function b($a,$r=0)
{
    $r|=$a;         # if $a is not empty, set $r (no effect in recursion)
    foreach($a as$v)    # loop through elements:    
        $r&=is_array($v)    # 2. if test failed, clear $r
            ?b($v,1)        # 1. if array, recurse
            :!!$v;          #    else test element <>0
    return$r;           # return $r
}

1
คุณสามารถบันทึกไม่กี่ไบต์ที่มีแทนstrpos(print_r($a,1)," 0") preg_match(...)
user63956

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