APL, 36 34 39 36 33 29 27
*+/x={(∇⍣(⊃x>¯1↑⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕
เอาท์พุท1
ถ้าคี ธ0
มิฉะนั้น
GolfScript นัดหยุดงานอีกครั้ง !!
แก้ไข
+/x={(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕
ใช้ Right-Reduction ( ⊢/
) แทน Take ลบ 1 ( ¯1↑
), ประหยัด 1 char โดยตรงและอ้อม 1 บันทึกจาก Disclose ( ⊃
)
คำอธิบาย
⍎¨⍕x←⎕
ใช้เวลาการประเมินการป้อนข้อมูล (ถือว่าเป็นตัวเลข) x
และกำหนดให้ แปลงเป็นอาร์เรย์อักขระ (aka "string" ในภาษาอื่น ๆ ) และวนซ้ำอักขระแต่ละตัว (หลัก) แปลงเป็นตัวเลข ดังนั้นนี่จะส่งผลให้มีตัวเลขที่เป็นตัวเลข
{(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}
เป็นฟังก์ชั่น "loop" หลัก:
+/⍵↑⍨-⍴⍕x
ใช้ตัวเลข⍴⍕x
(ไม่ใช่ของตัวเลขx
) ตัวสุดท้ายจากอาร์เรย์และสรุปผลรวม
⍵,
เชื่อมต่อกับส่วนท้ายของอาร์เรย์
(x>⊢/⍵)
ตรวจสอบว่าหมายเลขสุดท้ายของอาร์เรย์ (ซึ่งยังไม่ได้+/⍵↑⍨-⍴⍕x
ต่อกันอยู่) มีขนาดเล็กกว่าx
และส่งกลับ1
หรือ0
∇⍣
เรียกใช้ฟังก์ชันนี้ในอาร์เรย์ใหม่ที่หลายต่อหลายครั้ง ดังนั้นหากจำนวนสุดท้ายมีขนาดเล็กกว่าx
ฟังก์ชั่นนี้จะเกิดขึ้นอีก มิฉะนั้นเพียงส่งคืนอาร์เรย์ใหม่
หลังจากที่ดำเนินการฟังก์ชันอาร์เรย์มีผลบวกขึ้นไปยังจุดที่ 2 ของตัวเลขที่มีค่ามากกว่าหรือเท่ากับx
(เช่น14
จะสร้าง1 4 5 9 14 23
, 13
จะสร้าง1 3 4 7 11 18 29
)
สุดท้ายตรวจสอบว่าแต่ละหมายเลขจะมีค่าเท่ากับx
และผลผลิตรวมของไบนารีที่เกิด แถว
แก้ไข
1=+/x={(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕
เพิ่ม 2 ตัวอักษร :-( เพื่อสร้างเอาต์พุต0
หากอินพุตเป็นหนึ่งหลัก
ยังแก้ไขอีก
+/x=¯1↓{(∇⍣(x>⊢/⍵))1↓⍵,+/⍵}⍎¨⍕x←⎕
คำอธิบาย
ตอนนี้ฟังก์ชั่นจะลดจำนวนแรก ( 1↓
) จากอาร์เรย์แทนการรับ⍴⍕x
( ↑⍨-⍴⍕x
) ครั้งสุดท้าย
อย่างไรก็ตามวิธีนี้1=
ไม่เพียงพอที่จะจัดการกับตัวเลขหลักเดียว ดังนั้นตอนนี้จะลดจำนวนสุดท้ายจากอาร์เรย์ก่อนที่จะตรวจสอบความเท่าเทียมกันเพื่อx
เพิ่ม 1 อักขระ
คุณเดา: แก้ไข
+/x=1↓{1↓⍵,+/⍵}⍣{x≤+/⍵}⍎¨⍕x←⎕
เปรียบเทียบx
กับรายการที่เพิ่มใหม่แทนที่จะเป็นรายการสุดท้ายเก่าดังนั้นให้วางรายการแรก (แทนที่จะเป็นรายการสุดท้าย) ก่อนที่จะตรวจสอบความเท่าเทียมกันว่าx
เพียงพอแล้วบันทึกเครื่องหมายลบ บันทึกอีก 3 โดยใช้รูปแบบอื่นของตัวดำเนินการพลังงาน ( ⍣
)
และคำตอบ 25-char gs ปรากฏขึ้น (Orz)
แก้ไขล่าสุด
x∊1↓{1↓⍵,+/⍵}⍣{x≤+/⍵}⍎¨⍕x←⎕
ไม่อยากเชื่อเลยว่าฉันพลาดไป
ไม่สามารถเล่นกอล์ฟได้อีกต่อไป