การระบุลำดับสำหรับ Cellular Automata


10

พื้นหลัง

สำหรับจุดประสงค์ของการท้าทายนี้ออnโตมาตาเซลลูลาร์เป็นเพียงฟังก์ชันเลขฐานสองfที่ใช้ตัวเลขสองตัวจากสถานะที่ตั้ง{0, 1, ..., n-1}เป็นอินพุตและส่งกลับตัวเลขอื่นจากชุดนั้นเป็นเอาต์พุต สามารถนำไปใช้กับรายการที่มีความยาวอย่างน้อย 2 ตัวL = [x0, x1, x2, ..., xk-1]

f(L) = [f(x0, x1), f(x1, x2), f(x2, x3), ..., f(xk-2, xk-1)]

โปรดทราบว่ารายการผลลัพธ์มีองค์ประกอบน้อยกว่าองค์ประกอบเดิมหนึ่งรายการ แผนภาพกาลอวกาศของfเริ่มต้นจากการLเป็นรายการของรายการที่ได้รับด้วยซ้ำใช้fไปLและเก็บรวบรวมผลในรายการ รายการสุดท้ายมีความยาว 1. เราบอกว่ารายการLเป็นลำดับที่ระบุสำหรับถ้าทุกรายการสององค์ประกอบมากกว่าชุดที่รัฐเป็นรายการย่อยที่อยู่ติดกันแถวของกาลอวกาศแผนภาพที่เริ่มต้นจากบางส่วนf Lนี่เทียบเท่ากับเงื่อนไขที่ไม่มีnแคลิฟอร์เนีย -state อื่นมีไดอะแกรม spacetime ที่แน่นอน

อินพุต

ปัจจัยการผลิตของคุณเป็นn-by- nเมทริกซ์จำนวนเต็มMรายชื่อของจำนวนเต็มLของความยาวอย่างน้อย 2 nและเลือกหมายเลข เมทริกซ์Mกำหนดn-state CA fโดยf(a,b) = M[a][b](ใช้การจัดทำดัชนีแบบ 0) มันรับประกันได้ว่าn > 0และที่MและLมีองค์ประกอบของชุดรัฐ{0, 1, ..., n-1}เท่านั้น

เอาท์พุต

ผลลัพธ์ของคุณจะเป็นค่าความจริงที่สอดคล้องกันหากLเป็นลำดับการระบุสำหรับ CA fและค่าเท็จที่สอดคล้องกันเป็นอย่างอื่น ซึ่งหมายความว่าสาร "ใช่" ทั้งหมดส่งผลให้มีค่าความจริงเหมือนกันและสารทั้งหมด "ไม่" จะส่งผลให้มีค่าเท็จ

ตัวอย่าง

พิจารณาปัจจัยการผลิตn = 2, และM = [[0,1],[1,0]] L = [1,0,1,1]เมทริกซ์Mกำหนดออโตเมติก XOR แบบไบนารีf(a,b) = a+b mod 2และแผนภาพกาลอวกาศที่เริ่มต้นจากLคือ

1 0 1 1
1 1 0
0 1
1

แผนภาพนี้ไม่ได้มี0 0ในแถวใด ๆ ดังนั้นไม่ได้เป็นลำดับการระบุและการส่งออกที่ถูกต้องคือL Falseถ้าเราใส่L = [0,1,0,0]แทนสเปซไทม์ไดอะแกรมคือ

0 1 0 0
1 1 0
0 1
1

แถวของแผนภาพนี้มีทุกคู่ที่มาจากชุดรัฐคือ0 0, 0 1, 1 0และ1 1เพื่อให้เป็นลำดับการระบุและการส่งออกที่ถูกต้องคือLTrue

กฎระเบียบ

คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น จำนวนไบต์ต่ำสุดที่ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต

กรณีทดสอบ

Trivial automaton
[[0]] [0,0] 1 -> True
Binary XOR
[[0,1],[1,0]] [1,0,1,1] 2 -> False
[[0,1],[1,0]] [1,0,1,0] 2 -> True
[[0,1],[1,0]] [0,1,0,0] 2 -> True
Addition mod 3
[[0,1,2],[1,2,0],[2,0,1]] [0,1,1,0,0,0,1,0,0] 3 -> False
[[0,1,2],[1,2,0],[2,0,1]] [0,1,1,0,0,0,1,0,1] 3 -> True
Multiplication mod 3
[[0,0,0],[0,1,2],[0,2,1]] [0,1,1,2,0,0,1,0,1] 3 -> False
[[0,0,0],[0,1,2],[0,2,1]] [0,1,1,2,2,2,1,0,1] 3 -> True
Some 4-state automata
[[3,2,2,1],[0,0,0,1],[2,1,3,1],[0,1,2,3]] [0,0,0,0,1,1,1,1] 4 -> False
[[3,2,2,1],[0,0,0,1],[2,1,3,1],[0,1,2,3]] [0,0,0,1,0,1,1,1] 4 -> False
[[3,2,2,1],[0,0,0,1],[2,1,3,1],[0,1,2,3]] [0,1,2,3,3,1,2,3,0] 4 -> True
[[0,1,2,1],[1,0,2,0],[2,2,1,0],[1,2,0,0]] [0,0,1,1,2,2,0,2,1] 4 -> False
[[0,1,2,1],[1,0,2,0],[2,2,1,0],[1,2,0,0]] [0,3,1,3,2,3,3,0,1] 4 -> False
[[0,1,2,1],[1,0,2,0],[2,2,1,0],[1,2,0,0]] [0,3,1,3,2,3,3,0,1,2] 4 -> True

คำตอบ:


2

CJam, 53 43 42 ไบต์

l~:M;_,({_[\1>]zW<_{M\{=}/}%}*;](_*\L*_&,=

นี่เป็นการใช้คำจำกัดความที่ตรงไปตรงมามาก (ฉันได้รับแรงบันดาลใจจาก Jakube หลังจากพยายามครั้งแรก) คาดว่าอินพุตในลำดับย้อนกลับบน STDIN โดยใช้อาร์เรย์สไตล์ CJam:

2 [1 0 1 1] [[0 1][1 0]]

นี่คือสายรัดทดสอบงานรหัสกับอินพุตทั้งหมด (แปลงเป็นรูปแบบอินพุตที่ถูกต้องก่อน) ผลลัพธ์ในฟิลด์อินพุตไม่ได้ใช้จริง ลบออกหากคุณไม่เชื่อใจฉัน ;)


5

Python 2: 93 ไบต์

M,L,n=input();a=[]
while L:z=zip(L,L[1:]);a+=z;L=[M[i][j]for i,j in z]
print len(set(a))==n*n

การติดตั้งที่ตรงไปตรงมา: ค้นหาคู่ทั้งหมดด้วยการซิปแล้วจดจำพวกมันไว้ในภายหลังและใช้ M กับ L. Repeat เปรียบเทียบจำนวนคู่ที่ไม่ซ้ำกันที่พบ

[[0,1],[1,0]], [0,1,0,0], 2การป้อนข้อมูลจะอยู่ในรูป


2

Mathematica, 90 83 82 ไบต์

f=Length[Union@@Last@Reap[#2//.l_List:>Extract[#,Sow/@Partition[l+1,2,1]]]]==#3^2&

การดำเนินการตรงไปตรงมาอื่น

การใช้งาน:

f[{{0, 1}, {1, 0}}, {0, 1, 0, 0}, 2]

จริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.