บทนำ
ในความท้าทายนี้เราจะจำลองหุ่นยนต์เคลื่อนที่อัตโนมัติที่น่าจะเป็นไปได้โดยใช้ตัวเลขเทียมปลอมที่แย่มาก หุ่นยนต์เซลลูลาร์ถูกกำหนดบนสตริงไบนารีโดยกฎโลคัลต่อไปนี้ สมมติว่าเพื่อนบ้านซ้ายของเซลล์และเซลล์ของตัวเองมีรัฐและa
b
- หาก
min(a,b) == 0
แล้วรัฐใหม่ของมีที่b
max(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
และบิตที่ขอบสุดจะเป็น1
s เสมอ งานของคุณคือผลิตวิวัฒนาการออโตมาตาเซลในรูปแบบนี้
ปัจจัยการผลิต
อินพุตของคุณเป็นจำนวนเต็มบวกn
แสดงถึงจำนวนแถวที่จะแสดงและรายการบิตที่ไม่ว่างL
ซึ่งเราใช้เป็นแหล่งของการสุ่ม
เอาท์พุต
การส่งออกของคุณคือรายชื่อของรายการหรืออาร์เรย์ 2 มิติของบิตภาพวาดวิวัฒนาการของเดียว1
สำหรับn
ขั้นตอนเวลาในรูปดังกล่าวข้างต้น คุณสามารถวางผลลัพธ์ด้วย0
s เพื่อให้ได้แถวที่มีความยาวเท่ากันหากต้องการ แต่จะต้องไม่มีการนำหน้า0
s
ตัวเลือกแบบสุ่มในหุ่นยนต์เซลลูล่าร์จะต้องดึงออกมาจากรายการ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 สำหรับบรรทัดที่สองเสมอ)