ความท้าทายนี้เหมาะอย่างยิ่งสำหรับ Unreadable
รุ่นแรกของรุ่นนี้คือ 3379 ไบต์เพียงเพื่อให้คุณทราบว่าฉันเล่นกอล์ฟนี้มากแค่ไหน
โปรแกรมรับอินพุตตรงตามที่อธิบายไว้ในความท้าทาย: รายการคำที่คั่นด้วยช่องว่าง (ซึ่งอาจมีตัวเลขและเครื่องหมายวรรคตอนเช่นกัน) ตามด้วยช่องว่างและจำนวนเต็มอย่างน้อย 4 (ตัวเลขที่ต่ำกว่าจะสร้างลูปไม่สิ้นสุด) .
' '' '' ''' "" "" "" "" " '' ' ' '''' ' ' '''' ' ' ''''" '' "" '' ''"" " " ' '' '' '''" " '' ' ' '' '' '' '' '''' '' '' ' ' '' '' '''' '' '' ''" " "" " ' '''" "" "" "" ' '' '' '' ''' "" " ' '' '' '' '''" "" "" "" """"" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" " ''""" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' '' ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ' '"'' ''' "" """ " ''"" "" " ' '' '' '''" "" "" "" " ' '' ' ' '' '' '' '''' '' '' '''" "" "" "" " ''" ' '' "' '' '' "" '' '' '' ' ' '' '' '''' '' '' ''" " '' ' '"'' '' "" "" ' '' '' '' ''' "" " ' '' '''" "" " ' '' '' '''" " ''" " '' ''""" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' "' ''""" ' ''' "" "" "" ' ''' " ' '' ' ' '' '' '' '''' '' '' ''' "" '"' "" "' "" "" "" '"' "" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''"" " '' '' '' " '"'" "" ' '' '' ''' "" '"' "" " ' '' '' ' ' '' '' '''' '' '' '''"""" "" "" ' '' ' ' '' '' '' '''' '' '' ''' "" "" "" " ' '' '' '' '''" "" "" "" "" " '"'" "" ' ''' "" "" "" " '"'" "" " '' '' ' ' '' '' ''''" '' " ' '' '' '' ''' "" "" "" " '"'" "" ' '' '' ''' "" """ ' '' "' '' ''"" "" ' '' '' '' "' '' ' ' '' ' ' '' '' '''' ' ' '''' ' '"'' '''' " '"' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" "" "" ' ''' "" ' ''' "" "" " '' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' ''''" " ''' ''' "" ' ''' "" ' ''' "" ' ''' "" "" "" ' ''' "" '' ' ' '''' ' ' ''''" "" "" ' '' '' '' ''' "" " ' '''" " ' '''" " ' '''" " ' '' ''"'" """ ''" ' '' '' ' ' '' '' '' ' ' '''' '' '' '''' '' '' '' "' '' ' ' '' '''' ''" """ "" ' '' '' "' '' '' '' ' ' '' '' '''' '' '' ''" ' '' ' ' '''' '' '' ''' "" "" "" "" ' '' ' ' '' '' "'' ''' "" "" "" "" ' '' '' ''"' '' "" '' ''" "" "" ' '' '' ''' " ' '' ' ' '' '' '' ' ' '''' '' '' '''' '' '' ''"'"" " ' '' ''"'" "" ' '' '' '' ''' "" "" "" "" ''" ' '' "' '' ''" " '' '' "" " ' '' '' '''" "" "" "" " ' '' ' ' '' '' '' '''' '' '' '''" "" "" "" "' "" "" '' ' ' '' '' '''' ' ' '''' ' '' "' '' '' '' '' "" '' '' ''" """" "" "" "" ' '' '' '' ' ' '''' ' '"'' ''' "" """ " ''" ' '' '' '' ''' "" "" "" "" ''" ' '' '' ''"' '' ' ' '' '''' '' "" '' '' '' ''"" '' '' '' " ' '''" " '"'" "" ' ' ' '' '' '' ' ' '''' ' ' '''' ' '"'' '''' '''"" "" "" '' '' '' ' ' '' '' '''' '' '' '' ' ' '' ' ' '''' '' '' '''' '' '' "" "" ''"" ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''"'"" ' ''' "" "" "" " ' '' '' '' ' ' '' '' '' '''' '''" "" "" "" "" " '' ''" "" '"' "" """ " '' '' '' ' ' '''' ' ' ''''" '' "" '' ' ' '' '''' ''"" "" "" "" "" " ' '' '' '' ' ' '''' ' '"'' '''" "" ' '' ''' "" """ ''"" ' '' '''" "" "" ' '' '' '' ''' "" "" "" " ' '' ''"'" "" ' ''' "" "" "" " ''" ' '' "' '' '' '' '' ' ' '' '' '' ' '"'' '''' '' '' " '' ' ' '''' "" "" "" ' '' "' ''" " '' '' ' ' '''' '' '' ' '' ' ' '''' '' '' ''"'"" " ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' ''''" '"' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' '' '' '' ' ' '' '' '''' '' '' '' ' ' '' ' ' '''' '' '' '''' '' '' '' "'""" '"' """ ' '' '' "' '' '' '' ' ' '' '' '''' '' '' '' "" '' ' ' '''' ''" "" " ' '' '' '' '''" "" ' ''' "" " '' '' '' ' ' '''' ' ' ''''" '' "" ''" "" "" "" ' '' '' '' ' '"'' '''" " '' '' '' ' ' '''' ' ' '''' ' ''"'"" """" '' '' '' ' ' '''' " '' ' ' '' '' '' '''' '' ''" '' "" '' "
คำอธิบาย
thyme horseradish peppermint 10
ฉันจะเดินคุณผ่านวิธีการที่โปรแกรมประมวลผลการป้อนข้อมูล thyme,\nhorser...,\npeppermint
การส่งออกที่คาดไว้คือ
ก่อนอื่นเราเริ่มที่เซลล์ # 7 และอ่านอินพุตทั้งหมด แต่ลบ 32 จากตัวละครทุกตัวเพื่อให้ช่องว่างกลายเป็นศูนย์

ด้วยเหตุผลที่ชัดเจนสิ่งนี้จะทำให้ตัวชี้ที่กำลังทำงานอยู่ (ชื่อpที่นี่เก็บไว้ในเซลล์ # 0) ในตอนท้าย เราใช้หนึ่งในขณะที่วงเพื่อค้นหาช่องว่างสุดท้ายซึ่งเป็นจุดเริ่มต้นของจำนวนที่กำหนดความกว้างของการส่งออก (เซลล์ # 36 ในตัวอย่างนี้)
ตอนนี้เราต้องการถอดรหัสตัวเลข (เช่นแปลงจากทศนิยม) ผลสุดท้ายจะเป็นทั้งในเซลล์TและR เราพึ่งพาความจริงที่ว่าพวกเขาเริ่มต้นที่ศูนย์
สำหรับตัวเลขทุกหลักให้ทำดังต่อไปนี้:
- ตั้งค่าtเป็น −15
- ใน a while loop, decrement r (ซึ่งมีผลลัพธ์จนถึง) ถึง −1 (เพราะเราต้องการการวนซ้ำrแต่เนื่องจากการลดลงเกิดขึ้นก่อนที่มันจะถูกตรวจสอบว่าเป็นเงื่อนไขของ while loop การลดลงถึง 0 จะทำให้ซ้ำน้อยลงหนึ่งครั้ง) และแต่ละซ้ำเพิ่ม 10 ตัน ตอนนี้tมี 10 เท่าของผลลัพธ์ก่อนหน้าลบ 15
- อีกครั้งในขณะที่ห่วงพร่องp * 0 และสำหรับแต่ละซ้ำเพิ่ม 1 ถึงที หลังจากtนี้มีผลลัพธ์ระดับกลางที่ถูกต้องจนถึง: อักขระ
'0'
ที่'9'
มีรหัส ASCII 48–57 ดังนั้นหลังจากการลบ 32 ก่อนหน้านี้คือ 16–25 ดังนั้นเราจึงบวก 15–24 เป็นtซึ่งยกเลิกด้วย −15 เราตั้งค่าไว้ก่อนหน้า นอกจากนี้ยังเป็นสิ่งสำคัญที่ศูนย์นี้เซลล์ที่ใช้ในการประกอบด้วยอักขระหลักเพื่อให้รหัสที่ตามมาสามารถจดจำจุดสิ้นสุดของรายการของคำ
- ชุดRเพื่อผลกลางใหม่เพื่อให้ซ้ำไปพบมันในR (โปรดทราบว่าเราไม่จำเป็นต้องอ่านจากtอีกครั้งเราสามารถใช้ค่าสุดท้ายจากก่อนหน้าขณะที่ลูปเพราะเรารู้ว่า* pไม่สามารถเป็นศูนย์ได้ดังนั้นจึงมีการเรียกใช้อย่างน้อยหนึ่งครั้ง)
ในที่สุดเราใช้อีกอย่างง่าย ๆ ในขณะที่วน (ลดค่าtเป็นตัวนับ) เพื่อแปลงจำนวนที่เราเพิ่งคำนวณเป็นเอกภาพ เราเก็บสตริงของ 1s ที่เหลือจากเซลล์ # 0 สิ่งนี้ขึ้นอยู่กับข้อเท็จจริงที่ว่าเซลล์ # 1 ซึ่งเป็นตัวชี้การทำงานของเราสำหรับสิ่งนี้ ( q ) เริ่มต้นที่ 0 เราได้รับ 1 วินาทีน้อยลงเพราะในขณะที่ลูปใน Unreadable นั้นเป็นเช่นนั้น:

หลังจากนี้เราไม่ต้องการค่าเป็นrดังนั้นเราจึงใช้เซลล์นั้นอีกครั้งเพื่ออย่างอื่น เรารีเซ็ตพอยน์เตอร์pและqและกำหนดค่าเริ่มต้นบางเซลล์ด้วยรหัสอักขระ ASCII ที่เราต้องการในภายหลัง ฉันได้ระบุcและsซึ่งเราจะใช้ในภายหลังและเราจะพึ่งพาความจริงที่ว่าsเริ่มต้นที่ศูนย์:

เดี๋ยวก่อนเดี๋ยวก่อน ทำไมเซลล์ # 0 ถึงมีสีแดง? ... ดีนี่คือการเน้นเคล็ดลับลับ ๆ ล่อ ๆ จำได้ไหมว่าเราให้ผลลัพธ์ 1 น้อยเกินไป เคล็ดลับคือเราใช้เซลล์ # 0 เป็น "ส่วนขยาย" เพื่อแก้ไขให้ถูกต้อง มันใช้งานได้เพราะเรารู้ว่าpจะไม่เป็น 0 ด้วยวิธีนี้บล็อกสีแดงตอนนี้กว้าง 10 เซลล์ตามจำนวนที่เราต้องการ นอกจากนี้ยังบันทึกอักขระ 9 ตัวเพื่อให้สามารถเริ่มต้นqเป็น 1 แทน 0
ตอนนี้เราเข้าสู่ห่วงขณะที่ผ่านคำและเอาท์พุทพวกเขาทั้งหมด
ขั้นตอนที่ 1: ค้นหาว่าคำถัดไปจะพอดีกับบรรทัดปัจจุบันหรือไม่ เราทำสิ่งนี้โดยเพียงแค่เลื่อนpไปทางขวาและqเหลือด้วย a วนรอบจนกว่าpจะไปถึงช่องว่างถัดไป:

ตอนนี้pอยู่ทางขวาของคำเราสามารถตรวจสอบว่านี่เป็นคำสุดท้ายในรายการโดยตรวจสอบว่า* (p + 1)เป็นศูนย์หรือไม่ เราเก็บค่านั้นไว้ด้วย (ซึ่งในตัวอย่างของเราคือ 72 เพราะมันคือ "h" จาก "พืชชนิดหนึ่ง" ลบ 32) ในcเพราะเราจะต้องการมันอีกครั้งในภายหลัง ในกรณีนี้มันไม่เป็นศูนย์ดังนั้นเราจะต้องส่งออกเครื่องหมายจุลภาคพร้อมกับคำดังนั้นคำจึงยาวหนึ่งตัวอักษร พิจารณาเรื่องนี้โดยการลดqอีกครั้ง ในที่สุดให้ใช้อีกอันหนึ่งขณะวนซ้ำเพื่อย้ายpกลับไปที่จุดเริ่มต้นของคำ

ตอนนี้เรารู้แล้วว่าคำจะพอดีกับบรรทัดปัจจุบันเนื่องจากqชี้ไปที่ค่าที่ไม่ใช่ศูนย์ดังนั้นสิ่งที่เราต้องทำคือ:
- เลื่อนหน้าไปข้างหน้าผ่านคำอีกครั้งพิมพ์ตัวละครแต่ละตัว (บวก 32 เพราะทุกรหัส ASCII จะปิดโดย 32)
- หากcไม่ใช่ศูนย์ให้พิมพ์เครื่องหมายจุลภาค (โดยใช้ค่าในเซลล์ # 5)
- ตั้งค่าเป็นค่าที่ไม่ใช่ศูนย์เพื่อระบุการวนซ้ำครั้งถัดไปที่เราไม่ได้อยู่ที่จุดเริ่มต้นของบรรทัดอีกต่อไปดังนั้นจึงจำเป็นต้องแสดงอักขระเว้นวรรคก่อนคำถัดไป (เราใช้ค่าส่งคืนของคำสั่งพิมพ์ด้านบนสำหรับสิ่งนี้ซึ่งคือ 44 สำหรับเครื่องหมายจุลภาค)
จนถึงปัจจุบัน: thyme,
จากนั้นการวนซ้ำครั้งต่อไปของลูปใหญ่จะเริ่มขึ้น ก่อนหน้านี้เราตรวจสอบว่าคำถัดไปเหมาะกับส่วนที่เหลือของบรรทัดโดยการลดqเมื่อเราอ่านคำจากซ้ายไปขวาหรือไม่ โปรดทราบว่าqยังคง −5 จากการวนซ้ำก่อนหน้านี้ติดตามจำนวนอักขระที่เราได้พิมพ์ไปแล้วในบรรทัดปัจจุบัน หลังจากการนับตัวอักษรใน "พืชชนิดหนึ่ง", บวกหนึ่งสำหรับเครื่องหมายจุลภาค, บวกหนึ่งเพราะsไม่ใช่ศูนย์แสดงว่าเราจำเป็นต้องส่งออกพื้นที่เช่นกันqจะมี overshot จุดสิ้นสุดของบล็อก 1s:

ตอนนี้qชี้ไปที่ศูนย์เซลล์ซึ่งหมายความว่า "พืชชนิดหนึ่ง" จะไม่พอดีกับบรรทัดปัจจุบัน สิ่งที่เราทำตอนนี้ขึ้นอยู่กับว่าsเป็นที่ไม่ใช่ศูนย์ ในกรณีของเราคือซึ่งหมายความว่าเราจำเป็นต้องตัดบรรทัดถัดไป สิ่งที่เราต้องทำคือ:
- พิมพ์ newline (ใช้เซลล์ # 3)
- ตั้งค่าqกลับเป็น 1
- ตั้งค่าเป็น 0
จนถึงปัจจุบัน: thyme,\n

สำหรับการทำซ้ำครั้งต่อไปpอยู่ในตำแหน่งเดิมเหมือนเดิมดังนั้นเราจะดูคำเดิมอีกครั้ง เมื่อก่อนเรานับตัวละครใน“มะรุม” ชุดCถึง 80 อีกครั้งเมื่อเราสังเกตเห็นมีคำอื่นหลังจากนี้พร่องQสำหรับจุลภาคและย้อนกลับหน้ากลับไปยังจุดเริ่มต้นของคำว่า:

เช่นเดียวกับในการทำซ้ำครั้งก่อนเราพบว่า "พืชชนิดหนึ่ง" ยังคงไม่เหมาะสมเพราะqสิ้นสุดลงในเซลล์ที่มีค่าเป็นศูนย์ แต่เวลานี้sเป็นศูนย์ซึ่งหมายความว่าเราทำสิ่งที่แตกต่างจากครั้งที่แล้ว เราจำเป็นต้องเอาท์พุทของคำบางจุดสามจุดและเครื่องหมายจุลภาค ความกว้างของเราคือ 10 ดังนั้นเราต้องเอาท์พุทตัวอักษร 6 ตัว เรามาดูกันว่าเราอยู่ที่ไหนถ้าเรา:
- ค้นหาจุดเริ่มต้นของบล็อกสีแดง 1s เราทำได้โดยไปทางขวาเพราะเรารู้ว่าคิวต้องจากไป
- เพิ่มqอีกครั้งถ้าเราจำเป็นต้องใช้คอมม่า ( c ≠ 0) ด้วย
ตอนนี้เทปดูเหมือนดังนี้:

ฉันทำเครื่องหมายเซลล์ 6 เซลล์ที่นี่ อย่างที่คุณเห็นเราต้องเอาท์พุทอักขระจนกระทั่งq = −1 นี่เป็นโค้ดที่มีประสิทธิภาพในการตรวจสอบ (โดยทั่วไปwhile ((++q)+1) { ... }
) ดังนั้น:
- พิมพ์ตัวอักษรเหล่านั้น (บวก 32 เพราะรหัส ASCII ทั้งหมดปิดด้วย 32) จนกระทั่งถึงคิว −1 pจะอยู่ที่เซลล์ 19 ตรงกลางของคำว่า "พืชชนิดหนึ่ง"
- พิมพ์สามจุด เนื่องจากคำสั่ง print ส่งคืนอาร์กิวเมนต์ของตัวเองเราจึงสามารถเขียนโค้ดได้อย่างมีประสิทธิภาพ (โดยพื้นฐาน
print(print(print('.')))
) เราใช้ค่า ASCII จากเซลล์ # 5 และเพิ่ม 2 เข้าไปเพื่อรับรหัส ASCII ของจุด
- ย้ายpไปยังจุดสิ้นสุดของคำ เนื่องจากเรารู้ว่าเราไม่สามารถไปถึงจุดสิ้นสุดของคำได้แล้ว (เพราะคำนั้นยาวเกินไปและเราต้องลบอย่างน้อย 3 ตัวอักษรออกจากมันเพื่อให้พอดีกับจุด) วงนี้มีการวนซ้ำอย่างน้อยหนึ่งครั้งดังนั้น มันสั้นกว่าในรหัสเพื่อให้เนื้อความของ while loop คำนวณค่า ASCII สำหรับจุดแล้วส่งค่าส่งคืนของ while loop ไปยังฟังก์ชันการพิมพ์
- พิมพ์เครื่องหมายจุลภาคหากcไม่ใช่ศูนย์
หลังจากทั้งหมดนี้เรายังพิมพ์ newline (โดยใช้เซลล์ # 3) และตั้งค่าqกลับเป็น 1 เรายังสามารถตั้งค่าsเป็น 0 แม้ว่ามันจะเป็น 0 อยู่แล้วซึ่งทำให้สิ่งนี้เหมือนกับที่เราเคยทำเมื่อก่อน บรรทัดถัดไป (เมื่อsคือไม่ใช่ศูนย์) ดังนั้นเพื่อหลีกเลี่ยงการทำซ้ำรหัสที่เราทำมันหลังจากที่มีเงื่อนไขว่าการตรวจสอบของ
จนถึงปัจจุบัน: thyme,\nhorser...,\n
เหลืออีกหนึ่งรอบเท่านั้น เวลานี้หลังจากนับตัวอักษรของคำเราได้รับ:

เวลานี้มีอะไรหลังจากที่พีดังนั้นเราจึงตั้งค 0 เพื่อบ่งบอกถึง“ไม่มีเครื่องหมายจุลภาค” และตามที่เราทำไม่ได้ลดลงคิวเป็นเวลาต่อไป เนื่องจากqตอนนี้ชี้ไปที่เซลล์ที่ไม่เป็นศูนย์เรารู้ว่าคำจะพอดีดังนั้นรหัสเดียวกันจะถูกดำเนินการในการทำซ้ำครั้งแรกยกเว้นว่าเวลานี้cเป็นศูนย์ดังนั้นมันจะไม่พิมพ์เครื่องหมายจุลภาค
เอาท์พุท: thyme,\nhorser...,\npeppermint
ในคำแนะนำนี้ฉันไม่ได้รวมกรณีที่รหัสจะพิมพ์ช่องว่าง แต่ฉันคิดว่ามันควรจะชัดเจนในขณะนี้ หากรหัสพบว่าคำที่เหมาะกับ ( * q ≠ 0) และsไม่เป็นศูนย์มันจะส่งออกช่องว่างก่อนคำ