จำลองหุ่นยนต์เซลลูล่าร์ 1D ใด ๆ


14

ความท้าทาย

คุณต้องเขียนโปรแกรมที่สมบูรณ์ซึ่งใช้ตัวเลขเจ็ดตัวจาก STDIN และพิมพ์ประวัติสองมิติของหุ่นยนต์อัตโนมัติ (CA) ไปยัง STDOUT นี่คือรหัสกอล์ฟ

การจัดรูปแบบ อินพุตอินพุตจะเป็นเจ็ดจำนวนเต็ม / สตริงคั่นด้วยเครื่องหมายจุลภาค หมายเลขแรกคือจำนวนของกฎตามรหัส Wolfram (ชื่อมาตรฐานสำหรับแต่ละกฎ) ประการที่สองคือการกำหนดค่าเริ่มต้นเริ่มต้น ที่สามและสี่อธิบายรูปแบบและจำนวนครั้งที่ควรผนวกเข้ากับด้านซ้ายของการกำหนดค่าเริ่มต้น เป็นช่องว่างภายใน ที่ห้าและหกทำเช่นเดียวกันสำหรับด้านขวา ตัวเลขสุดท้ายคือจำนวนรุ่นที่รันการจำลอง

90,11,0,4,0,4,5ดังนั้นตัวอย่างของการป้อนข้อมูลเป็น นี้ควรบอกโปรแกรมที่คุณกำลังเรียกใช้กฎ 90 นอกจากนี้ยังควรบอกโปรแกรมที่คุณต้องการกำหนดค่าเริ่มต้นที่จะ11มีสตริง0ผนวก 4 0000110000ครั้งเพื่อให้ปลายทั้งสองเพื่อให้รูปแบบเริ่มต้นที่เกิดขึ้นจริง นอกจากนี้ยังบอกให้โปรแกรมของคุณรันการจำลองนี้เป็นเวลา 5 ชั่วอายุ

เอาท์พุทโปรแกรมของคุณควรพิมพ์อาร์เรย์ทั้งหมดของเซลล์แต่ละรุ่น (คั่นด้วยบรรทัดใหม่) เพื่อให้เอาต์พุตเป็นไดอะแกรมสเปซ - เวลาของ CA สำหรับแต่ละรุ่นสถานะของแต่ละเซลล์จะถูกกำหนดโดยสถานะและสถานะของเซลล์ไปทางซ้ายและขวาทันทีตามกฎที่ให้ไว้เป็นอินพุต การจำลองควรล้อมรอบขอบ สิ่งแรกที่พิมพ์ควรเป็นอาร์เรย์เริ่มต้นเป็น gen 0

อินพุต90,11,0,4,0,4,5ควรส่งผลให้ผลลัพธ์ต่อไปนี้ตรงตามที่เป็นไปได้

0000110000
0001111000
0011001100
0111111110
1100000011
0110000110

โปรดสังเกตว่าสถานะเริ่มต้นจะไม่รวมอยู่ในห้าชั่วอายุคน สังเกตว่าการจำลองล้อมรอบขอบ

ตัวอย่างเพิ่มเติม

การป้อนข้อมูล:

184,1100,01,2,01,1,4

เอาท์พุท:

0101110001
1011101000
0111010100
0110101010
0101010101

การป้อนข้อมูล:

0,1011,1,0,0,1,2

เอาท์พุท:

10110
00000
00000

ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของ 1D CA และวิธีการกำหนดหมายเลข


ทำได้ดีสำหรับการรวมกฎ 0 เป็นกรณีทดสอบ
Peter Taylor

ฉันรู้สึกทึ่งที่กฎ 90 คือ Sierpinski Gasket โดยเฉพาะอย่างยิ่งตั้งแต่ที่เป็นส่วนหนึ่งของการทดสอบที่ฉันได้สำหรับโครงการ Codegolf อื่น
JoeFish

@ JoeFish ภาพของคุณทำให้ฉันลองดู ฉันต้องการคำตอบ 8086 - ฆ่านก 2 ตัว - แต่มันอาจจะต้องมีการใช้สายอักขระดังนั้นโปรแกรมจำลองการของฉันจึงไม่สามารถเรียกใช้งานได้ (ยัง)
luser droog

มีคนทำแล้ว: pouet.net/prod.php?which=60478
luser droog

คำตอบ:


5

Golfscript, 77 73 70 ตัวอักษร

','/)~\(~:?;~~*@@~*@+\+{1&}/]({[.,{.[3<?256+]{2base}/\~=\(+}*])n@)\+}*

ขอบคุณ @Howard ที่ชี้ให้เห็นวิธีการบันทึก 4 ตัวอักษร


คุณสามารถบันทึกอันที่ชัดเจน48--> 1&และฉันคิดอีกสามอย่าง คุณอาจละเว้น)หน้าบล็อก (ไม่เพิ่มตัวนับ) และดังนั้นจึงบันทึกสองครั้งล่าสุด
Howard

@Howard ขอบคุณ ป๊อปเหล่านั้นในตอนท้ายมีประโยชน์ในการทำซ้ำก่อนหน้านี้ แต่คุณถูกต้องแล้ว
Peter Taylor

5

APL (153 ตัวอักษร)

∇ cellularautomaton
  i               ← ⍞
  s               ← (i=',') / ⍳ ⍴i
  (b a x c)       ← {i[s[⍵]↓⍳s[⍵+1]-1]} ¨ ⍳4
  (z x x l x r n) ← ⍎i
  y               ← ⍎ ¨ ⊃ ,/ (l / ⊂a) , b , r / ⊂c
  (n+1) (⊃⍴,y) ⍴ '01'[1+⊃ ,/ y,{({(z ⊤⍨ 8/2)[8 - 2⊥¨ 3 ,/ (⊃⌽⍵),⍵,⊃⍵]}⍣⍵)y} ¨ ⍳n]
∇

และในรูปแบบที่อ่านได้สั้นลงเล็กน้อยน้อยกว่า:

i←⍞⋄s←(i=',')/⍳⍴i⋄b a x c←{i[s[⍵]↓⍳s[⍵+1]-1]}¨⍳4⋄z x x l x r n←⍎i⋄y←⍎¨⊃,/(l/⊂a),b,r/⊂c⋄'01'[1+⊃,/y,{({(z⊤⍨8/2)[8-2⊥¨3,/(⊃⌽⍵),⍵,⊃⍵]}⍣⍵)y}¨⍳n]⍴⍨(1+n),⊃⍴,y

ตัวอย่าง:

      cellularautomaton
26,00110,01,4,10,6,7
0101010100110101010101010
1000000011100000000000001
0100000110010000000000011
0010001101101000000000110
0101011001000100000001101
0000010110101010000011000
0000100100000001000110100
0001011010000010101100010

ฉันแน่ใจว่ามีห้องพักสำหรับการปรับปรุง (ฉันยังพบการเปลี่ยนแปลงเล็กน้อยในขณะที่เขียนบทความนี้!) แต่บางอย่างอาจเกี่ยวข้องกับการเปลี่ยนแปลงพื้นฐานและฉันไม่สามารถยืนมอง APL ได้อีกต่อไป ตัวแปรของ APL ใช้ที่นี่เป็นDyalog APL


4

Ruby, 165 159 ตัวอักษร

a=gets.split ?,
b=a.map &:to_i
c=(x=a[2]*b[3]+a[1]+a[4]*b[5]).chars.map &:hex
(0..b[6]).map{puts c*''
c=(1..w=x.size).map{|i|b[0]>>c[i-1]*2+c[i%w]+c[i-2]*4&1}}

แก้ไข:ฉันพบบางสถานที่สำหรับการปรับปรุงเล็กน้อย

ตัวอย่างการเรียกใช้:

> 30,1,0,20,0,20,20
00000000000000000000100000000000000000000
00000000000000000001110000000000000000000
00000000000000000011001000000000000000000
00000000000000000110111100000000000000000
00000000000000001100100010000000000000000
00000000000000011011110111000000000000000
00000000000000110010000100100000000000000
00000000000001101111001111110000000000000
00000000000011001000111000001000000000000
00000000000110111101100100011100000000000
00000000001100100001011110110010000000000
00000000011011110011010000101111000000000
00000000110010001110011001101000100000000
00000001101111011001110111001101110000000
00000011001000010111000100111001001000000
00000110111100110100101111100111111100000
00001100100011100111101000011100000010000
00011011110110011100001100110010000111000
00110010000101110010011011101111001100100
01101111001101001111110010001000111011110
11001000111001111000001111011101100010001

3

ค, 303 305 301 294 292

305 แก้ไข: โอ๊ะโอ ลืมที่calloc()ใช้เวลาสอง args มันระเบิดขึ้นเมื่อมีขนาดใหญ่ขึ้น

301 แก้ไข: อ่าฮา! ใช้ของฉันcalloc() boo-booเพื่อประหยัดอีก 2 ไบต์โดยการเพิ่มขนาดบล็อกของหน่วยความจำที่ร้องขอ

294 แก้ไข: ยากจน 300! กำจัดหนึ่งในstrcat() s และ tweaked tweaked ต้องใช้แทะเล็มสูงสุดซึ่งสนุกมากที่จะพูดตามการใช้งาน

292 แก้ไข: ไม่ต้องการ +2จัดสรรหน่วยความจำใน

ฉันใช้คำตอบของ luser droogเป็นแนวคิดพื้นฐาน แต่เปลี่ยนอัลกอริธึมการห่อรวมถึงการปรับแต่งและการแยกค่าคงที่ออกมามากมาย

r,A,C,n,j;main(){char*s,*p,*t,a[9],b[9],c[9];scanf("%d,%[01],%[01],%d,%[01],%d,%d",&r,b,a,&A,c,&C,&n);for(s=calloc(A+++C,9);A--;)strcat(s,A?a:b);for(;C--;)strcat(s,c);p=strdup(s);for(C=strlen(s);A++<n;puts(s),t=p,p=s,s=t)for(j=C;j--;)p[j]=(1<<(s[j?j-1:C-1]*4+s[j]*2+s[(j+1)%C])-336)&r?49:48;}

r,A,C,n,j;
main(){
    char*s,*p,*t,a[9],b[9],c[9];
    scanf("%d,%[01],%[01],%d,%[01],%d,%d",&r,b,a,&A,c,&C,&n);
    for(s=calloc(A+++C,9);A--;)
        strcat(s,A?a:b);
    for(;C--;)
        strcat(s,c);
    p=strdup(s);
    for(C=strlen(s);A++<n;puts(s),t=p,p=s,s=t)
        for(j=C;j--;)
            p[j]=(1<<(s[j?j-1:C-1]*4+s[j]*2+s[(j+1)%C])-336)&r?49:48;
}

screenshot1

screenshot2


1
คุณลืมที่จะทำให้มันเริ่มต้นC,A,! :)
luser droog

สำหรับการโหลดหน่วยความจำแล้วมันเกี่ยวกับbrk()อะไร? แล้วp=s+C+1;ที่ไหนสักแห่ง
luser droog

1
+1 อีกครั้งสำหรับการใช้+++!
luser droog

ฮ่าฮ่า! เปลี่ยนทั้งหมด%[01]ไป%s! -9 (... หลายปีต่อมา)
luser droog

1
@luserdroog สิ่งนี้ไม่ทำงานเนื่องจาก% s เป็นโลภและกินคอมมาและตัวเลขอื่น ๆ เช่นกัน
JoeFish

2

ค (487 484 418 เมื่อนำช่องว่างออก)

* ลดลง66ด้วยความช่วยเหลือจาก JoeFish *

C,A,r,n,j;main(){char*s,*p,*t,a[9],b[9],c[9];
    scanf("%d,%[01],%[01],%d,%[01],%d,%d",&r,b,a,&A,c,&C,&n);
    s=malloc(strlen(a)*A+strlen(b)+strlen(c)*C+3);*s=0;
    strcat(s,"0");
    for(;A--;)strcat(s,a);
    strcat(s,b);
    for(;C--;)strcat(s,c);
    strcat(s,"0");
    p=malloc((C=strlen(s)-1)+2);
    for(;n--;){
    *s=s[C-1];
    s[C]=0;
    puts(s+1);
    s[C]=s[1];
    for(j=1;s[j+1];j++)
        p[j]=(1<<(s[j-1]-48)*4+(s[j]-48)*2+s[j+1]-48)&r?49:48;
    t=p;p=s;s=t;
    }
    s[C]=0;
    puts(s+1);
}

สิ่งที่พิมพ์ด้วยพิมพ์ดีด

josh @ Z1 ~
$! m
ทำแคลิฟอร์เนีย
cc ca.c -o ca
ca.c: 1: 1: คำเตือน: การกำหนดข้อมูลไม่มีประเภทหรือคลาสหน่วยเก็บข้อมูล
ca.c: ในฟังก์ชัน 'main':
ca.c: 2: 5: คำเตือน: การประกาศโดยนัยที่เข้ากันไม่ได้ของฟังก์ชันในตัว 'scanf'
ca.c: 3: 7: คำเตือน: การประกาศโดยนัยที่เข้ากันไม่ได้ของฟังก์ชันในตัว 'malloc'
ca.c: 3: 14: คำเตือน: การประกาศโดยนัยที่เข้ากันไม่ได้ของฟังก์ชันในตัว 'strlen'
ca.c: 4: 5: คำเตือน: การประกาศโดยนัยที่เข้ากันไม่ได้ของฟังก์ชันในตัว 'strcat'

josh @ Z1 ~
$ echo 90,11,0,4,0,4,5 | CA
-bash: ca: ไม่พบคำสั่ง

josh @ Z1 ~
$ echo 90,11,0,4,0,4,5 | ./ca
0000110000
0001111000
0011001100
0111111110
1100000011
0110000110


ดี คุณสามารถโกนหนวดได้สองสามไบต์โดยการทำให้intตัวแปรเป็นแบบโกลบอลและลบ#include: r,A,B,C,n,i,j; main(){char *s...
JoeFish

ประหยัดพวงในforลูปของคุณ:for(;A--;)strcat(s,a);
JoeFish

และกลับมาใช้AและCต่อมาเพื่อให้คุณไม่ต้องประกาศiหรือBที่ทุกคน p=malloc((C=strlen(s))+1); --C; strcpy(p,s); for(A=0;A<n;A++){ขออภัยฉันจะหยุดทันที :)
JoeFish

ตกลงฉันโกหกอีกหนึ่ง กำจัด 2 ไบต์โดยการกำจัด--C;: p=malloc((C=strlen(s)-1)+2);. ฉันคิดว่ารหัสสนามกอล์ฟสนุกกว่าการเริ่มเล่นในครั้งแรก!
JoeFish

ฉันไม่แน่ใจเกี่ยวกับการลบ#includeเนื่องจากscanfเป็นตัวแปร แต่มันก็โอเคเพราะมันถูกเรียกเพียงครั้งเดียว ... เครื่องจักรเก่าของฉันเสียชีวิตเมื่อวานนี้และฉันยังคงติดตั้ง Cygwin อยู่ ฉันจะรวมการเปลี่ยนแปลงเหล่านั้นทันทีที่ฉันสามารถทดสอบได้ ขอบคุณ!
luser droog
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.