1D 셀룰러 오토 마톤 시뮬레이션


14

도전

STDIN에서 7 개의 숫자를 가져 와서 셀룰러 오토 마톤 (CA)의 2 차원 히스토리를 STDOUT으로 인쇄하는 완전한 프로그램을 작성해야합니다. 이것은 코드 골프입니다.

입력 형식 입력은 쉼표로 구분 된 7 개의 정수 / 문자열입니다. 첫 번째 숫자는 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

시작 상태는 5 세대에 포함되지 않습니다. 또한 시뮬레이션이 가장자리를 감싸는 것을 볼 수 있습니다.

더 많은 예

입력:

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을 테스트 사례로 포함하는 것이 좋습니다.
피터 테일러

나는 규칙 90이시 에르 핀 스키 개스킷이라는 것을 매우 기쁘게 생각합니다. 특히 테스트의 일부 였으므로 다른 Codegolf 프로젝트에서 수행했습니다 .
JoeFish

@JoeFish이 이미지를 시험해 본 것은 당신의 이미지였습니다. 8086 답변을하고 싶었습니다 .2 마리의 새를 죽이십시오.하지만 아마도 문자열 작업이 필요할 수 있으므로 에뮬레이터에서 실행할 수 없습니다 (아직).
luser droog

누군가가 이미 그것을했다 : pouet.net/prod.php?which=60478
LUSER의 droog을

답변:


5

골프 스크립트, 77 73 70 자

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

@Howard 덕분에 4자를 저장하는 방법을 지적했습니다.


당신은 명백한 것을 저장할 수 있습니다 48-->1& 그리고 나는 또한 세 가지를 더 생각합니다. )블록 앞을 생략 하고 (카운터를 늘리지 않음) 마지막 두 팝을 저장할 수도 있습니다.
Howard

@Howard, 감사합니다. 마지막 팝은 초기 반복에서 유용했지만 지금은 팝을 제거하는 것이 합리적입니다.
피터 테일러

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

루비, 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

C, 303305301 294 292

305 편집 : 죄송합니다. 잊어 버렸습니다calloc() 두 개의 인수를합니다. 더 큰 입력으로 인해 폭파했습니다.

301 편집 : 아하! 내 사용calloc() boo-boo를 사용하여 요청 된 메모리의 블록 크기를 늘려 2 바이트를 더 절약했습니다.

294 편집 : 파산 300! 중 하나를 제거strcat() 하고 몇 가지 루프를 조정했습니다. 최대 뭉크를 사용해야합니다. 이것은 사용만큼 재미 있습니다.

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

스크린 샷 1

스크린 샷 2


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)

* JoeFish의 도움으로 66 을 떨어 뜨림 *

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
ca를 만들다
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 ~
$ 에코 90,11,0,4,0,4,5 | ca
-bash : ca : 명령을 찾을 수 없습니다

josh @ Z1 ~
$ 에코 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++){죄송합니다, 지금 멈춰
주세요

좋아, 거짓말 하나 더. 를 제거하여 2 개의 바이를 제거 --C;하십시오 p=malloc((C=strlen(s)-1)+2);. 골프 코드가 처음부터 나오는 것보다 재미 있다고 생각합니다!
JoeFish

#includesince 를 제거하는 것에 대해 확신이 없었습니다 scanf. 그러나 한 번만 호출되기 때문에 아마도 괜찮을 것입니다. ... 어제 오래된 기계가 죽었고 여전히 Cygwin을 설치하고 있습니다. 테스트하자마자 변경 사항을 통합하겠습니다. 감사!
luser droog 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.