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.