คำปฏิเสธ
ในขณะที่ฉันรู้ว่ามีคำถามที่เกี่ยวข้องโดยเฉพาะคำถามของฉันใช้ประตูโรงรถสองบานส่วนประกอบแบบสุ่มและฉันยังอ้างอิงเหตุการณ์นี้ในชีวิตจริงโดยเห็นลูกชายของฉันลดประตูโรงรถหนึ่งประตูขณะที่ฉันเดินออกจากประตู โรงจอดรถเมื่อสัปดาห์ที่แล้ว ... ไม่มีอะไรที่เหมือนกับการจ้องไปที่ศีรษะเพื่อให้น้ำไหลออกมาอย่างสร้างสรรค์! ;)
พื้นหลัง
ลูคัส (ลูกชายวัย 15 เดือนของฉัน) ชอบเล่นกับรีโมทโรงรถ รีโมตนี้มีสองปุ่มหนึ่งปุ่มสำหรับประตูโรงรถด้านซ้ายและปุ่มหนึ่งสำหรับประตูโรงรถด้านขวา ปุ่มทั้งสองทำงานในลักษณะเดียวกัน กดหนึ่งครั้งเพื่อให้ประตูเริ่มเปิดกดอีกครั้งเพื่อหยุดกดอีกครั้งเพื่อเริ่มปิดกดอีกครั้งเพื่อหยุดอีกครั้งและต่อไป
ลูคัสชอบรีโมทนี้เขาจะสุ่มกดปุ่มใดปุ่มหนึ่งหรือทั้งสองอย่างหรือไม่มีเลย หากกดทั้งคู่จะไม่มีการส่งสัญญาณ แต่การกดปุ่มเพียงปุ่มเดียวจะเป็นการส่งสัญญาณ
ดังนั้นความท้าทายของโค้ดกอล์ฟแบ่งออกเป็นสองส่วน:
ส่วนที่หนึ่ง
สร้างสตริงที่มีความยาว 60 ตัวอักษรแทนปุ่มสุ่มของลูคัสในเวลาหนึ่งนาที "สุ่ม" ในกรณีนี้หมายถึง "มีโอกาสเท่ากันของอินพุตแต่ละตัวที่แต่ละขีด" ตัวละครมีดังนี้:
- 0: Lucas กดปุ่มไม่ทั้งหรือกดทั้งสองปุ่ม ไม่ว่าจะด้วยวิธีใดไม่มีการส่งสัญญาณ
- 1: Lucas ปุ่มสำหรับประตูโรงรถด้านซ้ายถูกกด
- 2: Lucas ปุ่มสำหรับประตูโรงรถด้านขวาถูกกด
ส่วนที่สอง
ใช้สตริงที่สร้างขึ้นในส่วนที่หนึ่งจำลองการเปิดและปิดโรงจอดรถสองคันโดยใช้ตัวเลขเป็นตัวกระตุ้นการเปิดหยุดและปิดประตูเหล่านี้
ประตูโรงรถของฉันค่อนข้างเร็ว (ดูข้อความปฏิเสธความรับผิดชอบข้างต้นว่าเป็นเพราะอะไร) เมื่อคุณกดปุ่มจะใช้เวลาสี่วินาทีในการเปิดหรือปิดทั้งหมด
ดังนั้นหากปิด:
- 0 วินาที: เปิด 0% (ปิด); เมื่อกดปุ่มประตูจะเริ่มเปิดขึ้น
- 1 วินาที: เปิด 25%
- 2 วินาที: เปิด 50%
- 3 วินาที: เปิด 75%
- 4 วินาที: เปิด 100% หยุดประตู
ดังนั้นถ้าเปิด:
- 0 วินาที: เปิด 100% เมื่อกดปุ่มประตูจะเริ่มปิด
- 1 วินาที: เปิด 75%
- 2 วินาที: เปิด 50%
- 3 วินาที: เปิด 25%
- 4 วินาที: เปิด 0% (ปิด), หยุดประตู
หากประตูใดกำลังเคลื่อนไหวสัญญาณไปที่ประตูเดียวกันนั้นจะหยุด สัญญาณถัดไปที่ส่งไปที่ประตูเดียวกันหลังจากนั้นจะส่งสัญญาณไปในทิศทางตรงกันข้าม หากประตูหยุดเมื่อก่อนหน้านี้มีการเคลื่อนไหวและขณะนี้เปิดเต็มที่หรือปิดอย่างเต็มที่เมื่อได้รับสัญญาณ "หยุด" ประตูจะลงทะเบียนเป็น "หยุด" ในสถานะเต็มเปิดหรือปิดเต็มพร้อมที่จะ ไปในทิศทางตรงกันข้ามเมื่อได้รับสัญญาณใหม่
ด้วยการจำลองนี้ประตูโรงรถทั้งสองจะเริ่มต้นในตำแหน่งปิด ลองดูรายการคำสั่ง 10 วินาทีและดูว่าเกิดอะไรขึ้นถ้าลูคัสกำลังทำคำสั่งบนรีโมท:
2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)
เอาท์พุต
ส่วนแรกของเอาต์พุตต้องการการแสดงสตริงที่มีความยาว 60 อักขระแบบสุ่มของ "0", "1" และ "2" อักขระที่สร้างจากส่วนที่หนึ่ง เช่น.
212022112021202211202120221120212022112021202211202120221120
ด้านล่างของสายนี้คือการประมวลผล "สัญญาณ" เหล่านี้ตามกฎที่กล่าวถึงข้างต้นว่าประตูโรงรถจะทำงานอย่างไรกับตัวละครแต่ละตัว (ตามลำดับที่สองตามลำดับ) คุณควรลงท้ายด้วย 60 บรรทัดซึ่งเป็นผลลัพธ์ด้านล่างของสตริงการแสดงผลเริ่มต้น
แต่ละบรรทัดที่ประมวลผลเหล่านี้จะอยู่ในรูปแบบของ:
N: (L:X% XXXXXXX, R:Y% YYYYYYY)ที่ไหน:
- N คืออักขระที่ n จากสตริงสุ่มที่เกี่ยวข้องซึ่งจะอยู่ในรูปแบบของ 0, 1 หรือ 2
- X% คือเปอร์เซ็นต์ของการเปิดกว้างของประตูด้านซ้าย (ไม่มีระยะห่างระหว่างศูนย์)
- XXXXXXX เป็นสถานะของประตูด้านซ้าย หากประตูไม่เคลื่อนไหว (นั่นคือไม่เปิดหรือปิด) สถานะ "หยุด" ถูกบังคับใช้หมายความว่าประตูหยุดนิ่ง (เป็นไปได้ที่ 25%, 50% หรือ 75%) หรือหยุดเมื่อเปิดเต็มที่ (100% ) หรือปิดอย่างสมบูรณ์ (0%) มิฉะนั้นประตูจะเป็น "เปิด" หรือ "ปิด"
- Y% คือเปอร์เซ็นต์ของการเปิดกว้างของประตูด้านขวา (ไม่มีระยะห่างจากศูนย์)
- YYYYYYY เป็นสถานะของประตูด้านขวา หากประตูไม่เคลื่อนไหว (นั่นคือไม่เปิดหรือปิด) สถานะ "หยุด" ถูกบังคับใช้หมายความว่าประตูหยุดนิ่ง (เป็นไปได้ที่ 25%, 50% หรือ 75%) หรือหยุดเมื่อเปิดเต็มที่ (100% ) หรือปิดอย่างสมบูรณ์ (0%) มิฉะนั้นประตูจะเป็น "เปิด" หรือ "ปิด"
ตัวอย่างที่แสดงด้านล่างโดยใช้ 10 "สัญญาณ" และ 10 บรรทัดที่ประมวลผล
2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)
นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดจะเป็นผู้ชนะที่ชัดเจน ฉันทำให้เรื่องนี้ง่ายขึ้นโดยใช้วลีเช่น "เปิด", "หยุด" และ "ปิด" ซึ่งทั้งเจ็ดตัวอักษร ... ดังนั้นคุณอาจต้องการที่จะทำงานในกลยุทธ์ของคุณ
ขอให้โชคดี!
1คำสั่งสุดท้ายไม่หยุดประตูด้านซ้ายที่ 75% ในตัวอย่างของคุณ