บทนำ
ในความท้าทายนี้เราจะจำลองหุ่นยนต์เคลื่อนที่อัตโนมัติที่น่าจะเป็นไปได้โดยใช้ตัวเลขเทียมปลอมที่แย่มาก หุ่นยนต์เซลลูลาร์ถูกกำหนดบนสตริงไบนารีโดยกฎโลคัลต่อไปนี้ สมมติว่าเพื่อนบ้านซ้ายของเซลล์และเซลล์ของตัวเองมีรัฐและab
- หากmin(a,b) == 0แล้วรัฐใหม่ของมีที่bmax(a,b)
- หากmin(a,b) == 1แล้วรัฐใหม่ของที่ถูกเลือกโดยการสุ่มจากb{0,1}
ภาพต่อไปนี้แสดงให้เห็นถึงวิวัฒนาการ 10 ขั้นตอนเดียวที่เป็น1ไปได้
1
11
101
1111
11001
101011
1111111
10001001
110011011
1010111101
สังเกตว่า1บางครั้ง s สองอันที่อยู่ติดกันพัฒนาไป1มาและบางครั้งถึง0และบิตที่ขอบสุดจะเป็น1s เสมอ งานของคุณคือผลิตวิวัฒนาการออโตมาตาเซลในรูปแบบนี้
ปัจจัยการผลิต
อินพุตของคุณเป็นจำนวนเต็มบวกnแสดงถึงจำนวนแถวที่จะแสดงและรายการบิตที่ไม่ว่างLซึ่งเราใช้เป็นแหล่งของการสุ่ม
เอาท์พุต
การส่งออกของคุณคือรายชื่อของรายการหรืออาร์เรย์ 2 มิติของบิตภาพวาดวิวัฒนาการของเดียว1สำหรับnขั้นตอนเวลาในรูปดังกล่าวข้างต้น คุณสามารถวางผลลัพธ์ด้วย0s เพื่อให้ได้แถวที่มีความยาวเท่ากันหากต้องการ แต่จะต้องไม่มีการนำหน้า0s
ตัวเลือกแบบสุ่มในหุ่นยนต์เซลลูล่าร์จะต้องดึงออกมาจากรายการLแล้วกระโดดกลับไปที่จุดเริ่มต้นเมื่อหมดแล้ว อย่างชัดเจนยิ่งขึ้นถ้าผลลัพธ์ถูกส่งผ่านหนึ่งแถวในรูปแบบเวลาจากบนลงล่างจากซ้ายไปขวาจากนั้นตัวเลือกสุ่มที่ต่อเนื่องจะสร้างรายการLซ้ำหลาย ๆ ครั้งตามที่จำเป็น
ตัวอย่าง
สมมติว่าปัจจัยการผลิตที่มีและn = 7 L = [0,1,0]จากนั้นหุ่นยนต์เซลลูล่าร์จะค่อยๆพัฒนาดังต่อไปนี้ในช่วง 7 ขั้นตอนที่เราวางตัวเลือกไว้vเหนือตัวเลือกแบบสุ่ม:
[1]
[1,1]
   v
[1,0,1]
[1,1,1,1]
   v v v
[1,1,0,0,1]
   v
[1,1,1,0,1,1]
   v v   v
[1,0,0,1,1,1,1]
หากเราอ่านบิตทั้งหมดที่มีเครื่องหมาย a vเราจะได้รับ01001001ซึ่งLทำซ้ำ 2.66 ครั้ง 0บิตสุ่มต่อไปจะ
กฎและเกณฑ์การให้คะแนน
คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น จำนวนไบต์ต่ำสุดที่ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต รูปแบบที่แน่นอนของอินพุตและเอาต์พุตนั้นไม่สำคัญ (ภายในเหตุผล)
กรณีทดสอบ
รุ่นที่กำหนดได้ทุกบิตแบบสุ่มคือ0:
Inputs: 10 [0]
Output:
1
11
101
1111
10001
110011
1010101
11111111
100000001
1100000011
ทุก ๆ การสุ่มคือ1:
Inputs: 6 [1,1]
Output:
1
11
111
1111
11111
111111
รุ่น Pseudorandom:
Inputs: 10 [0,0,1]
Output:
1
11
101
1111
10101
111111
1010011
11110101
101011111
1111101001
Inputs: 10 [1,0,0,1]
Output:
1
11
111
1001
11011
111111
1001101
11010111
111111101
1011001111
Inputs: 15 [1,1,1,0,0,0]
Output:
1
11
111
1111
10001
110011
1110111
11011001
111111011
1100011111
11100100011
111101100101
1001111101111
11011000111111
101101001011101
min(a,b)ด้วยa+b>1และmax(a,b)ด้วยa+b? ฉันรู้ว่าคุณอาจต้องทำบางสิ่งบางอย่างเพื่อจัดการกับกรณีแรกของ1->11(ฉันคิดว่าคุณสามารถทำได้L=[1]+f()...หรือหาวิธีแทรก 1 ข้างหน้าLเพราะมันจะโผล่ 1 สำหรับบรรทัดที่สองเสมอ)