Herhangi bir 1D hücresel otomasyonu simüle edin


14

Meydan okuma

STDIN'den yedi sayı alan ve hücresel otomasyonun (CA) iki boyutlu geçmişini STDOUT'a yazdıran eksiksiz bir program yazmalısınız. Bu kod golf.

Girdi Biçimlendirme Girdi, virgülle ayrılmış yedi tamsayı / dize olacaktır. İlk sayı, Wolfram koduna göre kuralın numarasıdır (her kural için standart ad). İkincisi ilk başlangıç ​​yapılandırmasıdır. Üçüncü ve dördüncüsü, başlangıç ​​yapılandırmasının soluna hangi kalıbı ve kaç kez ekleneceğini açıklar. dolgu olarak. Beşinci ve altıncı sağ taraf için de aynısını yapar. Son sayı, simülasyonu çalıştıracak nesillerdir.

Yani, girdi örneği 90,11,0,4,0,4,5. Bu, programınıza kural 90'ı çalıştırdığınızı söylemelidir . Ayrıca programa, başlangıç ​​yapılandırmasının her iki uca 4 kez eklenmiş 11dize olmasını istediğinizi belirtmelidir 0, böylece gerçek başlangıç ​​deseni olur 0000110000. Ayrıca programınıza bu simülasyonu 5 nesil boyunca çalıştırmasını söyler.

Çıktı Programınız, her nesil (yeni satırlarla ayrılmış olarak) tüm hücre dizisini yazdırmalıdır, böylece çıktı CA'nın uzay-zaman diyagramı olur. Her bir nesil için, her hücrenin durumu, girdi olarak sağlanan kurala göre durumu ve hemen sol ve sağdaki hücrelerin durumları tarafından belirlenir. Simülasyon kenarları sarmalıdır. Yazdırılan ilk şey gen olarak başlangıç ​​dizisi olmalıdır. 0.

Giriş 90,11,0,4,0,4,5, aşağıdaki çıktıya mümkün olduğunca tam olarak çıkmalıdır.

0000110000
0001111000
0011001100
0111111110
1100000011
0110000110

Başlangıç ​​durumunun beş kuşakta yer almadığına dikkat edin. Ayrıca simülasyonun kenarlara sarıldığına dikkat edin.

Daha fazla örnek

giriş:

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

çıktı:

0101110001
1011101000
0111010100
0110101010
0101010101

giriş:

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

çıktı:

10110
00000
00000

1D CA'ların nasıl çalıştığı ve nasıl numaralandırıldıkları hakkında daha fazla bilgi


Kural 0'ı bir test senaryosu olarak dahil etmek için aferin.
Peter Taylor

Kural 90'ın bir Sierpinski Contası olması beni büyüledi. Özellikle bu testin bir parçası olduğu için başka bir Codegolf projesi için yaptım .
JoeFish

@JoeFish Bunu denememe neden olan senin resmin. Bir 8086 cevap vermek istedim - 2 kuş öldürmek - ama muhtemelen dize işlemlerine ihtiyaç duyacaktır, bu yüzden emülatörüm (henüz) çalıştıramayacaktı.
luser droog

Yanıtlar:


5

Golfscript, 77 73 70 karakter

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

4 karakterden nasıl tasarruf edileceğini belirten @Howard'a teşekkürler.


Açık bir tane kaydedebilirsiniz 48--> 1&ve ayrıca üç tane daha düşünüyorum. )Bloktan önce atlayabilirsiniz (sayacı artırmayın) ve bu nedenle son iki patlamayı da kaydedebilirsiniz.
Howard

@Howard, teşekkürler. Sonunda ortaya çıkan poplar daha önceki bir yinelemede faydalıydı, ancak onları ortadan kaldırmak artık mantıklı.
Peter Taylor

5

APL (153 karakter)

∇ 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]
∇

Ve daha az okunabilir, biraz daha kısa formda:

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

Misal:

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

İyileştirme için yer olduğundan eminim (bu yazıyı yazarken birkaç değişiklik bile buldum!), Ancak bazıları temel değişiklikleri içerebilir ve artık APL'ye bakamayacağım. Burada kullanılan APL varyantı Dyalog APL'dir .


4

Yakut, 165 159 karakter

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}}

Düzenleme: Küçük geliştirmeler için bazı yerler buldum.

Örnek çalışma:

> 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

C, 303305301 294292

305 Düzenleme: ayy. calloc()İki argüman almayı unuttum . Daha büyük girdiler patlıyordu.

301 Düzenle: Ah HA! Benim Kullanılan calloc()istenen bellek bloğu boyutunu yükseltiyor tarafından 2 daha bayt kaydetmek için aptalca bir hata.

294 Düzenleme: 300 kırdı! strcat()S birini elendi ve birkaç döngü tweaked. Kullanım olarak söylemek çok eğlenceli olan maksimum munch kullanmak lazım.

Düzenleme: +2Bellek ayırmaya gerek yoktu .

Ben luser droog cevabını kullanılan baz fikir olarak, ancak sabitler dışında sarma algoritması, hem de verdiği bir çok ve faktoring kadar değişti.

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
Başlamayı unuttun C,A,! :)
luser droog

bir sürü bellek için ne olacak brk()? sonra bir p=s+C+1;yere.
luser droog

1
Kullanmak için tekrar +1 +++!
luser droog

Haha! Tüm değiştirin %[01]için %s! -9 (... yıllar sonra)
luser droog

1
@luserdroog işe yaramaz çünkü% s açgözlüdür ve virgül ve diğer rakamları da yer.
JoeFish

2

C (487 484 418 boşluk kaldırılmış olarak)

* Bırakılan 66 JoeFish yardımıyla *

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);
}

daktilo ile yazılmış yazı

josh @ Z1 ~
$! m
ca yap
cc ca.c -o ca
ca.c: 1: 1: uyarı: veri tanımlamasının türü veya depolama sınıfı yok
ca.c: 'main' işlevinde:
ca.c: 2: 5: uyarı: yerleşik 'scanf' işlevinin uyumsuz örtülü bildirimi
ca.c: 3: 7: uyarı: yerleşik 'malloc' işlevinin uyumsuz örtülü bildirimi
ca.c: 3: 14: uyarı: yerleşik 'strlen' işlevinin uyumsuz örtülü bildirimi
ca.c: 4: 5: uyarı: yerleşik 'strcat' işlevinin uyumsuz örtülü bildirimi

josh @ Z1 ~
eko $ 90,11,0,4,0,4,5 | CA
-bash: ca: komut bulunamadı

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


Güzel. intDeğişkenlerinizi global hale #includer,A,B,C,n,i,j; main(){char *s...
getirip aşağıdakileri

forDöngülerinize bir demet kaydedin :for(;A--;)strcat(s,a);
JoeFish

Ve yeniden kullanım Ave Cdaha sonra bu yüzden yok beyan etmek iveya Bhiç. p=malloc((C=strlen(s))+1); --C; strcpy(p,s); for(A=0;A<n;A++){Üzgünüm, şimdi duracağım :)
JoeFish

Tamam, bir tane daha yalan söyledim. Ortadan kaldırarak 2 byes kurtulun --C;: p=malloc((C=strlen(s)-1)+2);. Golf kodu ilk etapta onunla gelmekten daha eğlenceli olduğunu düşünüyorum!
JoeFish

O #includezamandan beri scanfvaryasyon kaldırmadan emin değildim . Ama sadece bir kez çağrıldığından muhtemelen iyi. ... Eski makinem dün öldü ve hala Cygwin'i kuruyorum. Bu değişiklikleri test edebildiğim anda dahil edeceğim. Teşekkürler!
luser droog
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.