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


24

와이어 월드 는 와이어를 통해 흐르는 전자와 유사하게 설계된 셀룰러 오토 마톤입니다. 간단한 메커니즘으로 디지털 회로를 구성 할 수 있습니다. 심지어는 전체 컴퓨터 의 구성을 허용했습니다 .

당신의 임무는 선택한 언어로 가장 짧은 Wireworld 구현을 만드는 것입니다.

그리드의 각 셀에는 4 가지 상태 중 하나가 있습니다. 네 가지 상태는 "공백", "구리", "전자 헤드"또는 "전자 테일"입니다.

  • 빈 셀은 항상 빈 셀로 유지됩니다
  • 전자 헤드는 항상 전자 테일이됩니다
  • 전자 꼬리는 항상 구리가 될 것입니다
  • 구리 셀은 8 개의 이웃 중 정확히 하나 또는 두 개가 전자 헤드 인 경우 전자 헤드가됩니다. 그렇지 않으면 구리로 유지됩니다

이 경쟁은 최단 게임 게임 경쟁 과 비슷한 스타일 이지만 약간의 변화가 있습니다.

  • 격자는 40 x 40 셀 이상이어야합니다.
  • 그리드의 가장자리가 감겨서는 안됩니다 (원환이 아님). 필드 외부의 세포를 끊임없이 "비워 둔"것으로 취급하십시오.
  • 사용자가 자신의 시작 구성을 입력 할 수 있어야합니다.
  • 빈 화면을 응시하는 것은 재미 있지 않습니다. 프로그램은 시뮬레이션이 실행될 때 시각적으로 표시해야합니다.

이것은 코드 골프이며, 가장 적은 바이트가 이깁니다.

답변:


6

APL, 디아 로그 (131)

{h t c←1↓⍵∘=¨F←' htc'⋄⎕SM∘←1 1,⍨⊂N←F[1+⊃+/H h(t∨c≠H←c∧S↑1 1↓1 2∊⍨⊃+/+/K∘.⊖(K←2-⍳3)∘.⌽⊂¯1⌽¯1⊖h↑⍨2+S←25 79)ר⍳3]⋄∇N⊣⎕DL÷4}↑{79↑⍞}¨⍳25

출력이 ⎕SM창에 표시됩니다 . 시뮬레이션은 끝없이 진행됩니다. 격자는 ⎕SM창의 기본 크기이므로 79x25 입니다. 전자 헤드는 h, 꼬리는 t, 구리는 c입니다. 프로그램은 키보드에서 시작 구성을 25 줄로 읽습니다.

설명:

  • ↑{79↑⍞}¨⍳25: 79x25 그리드 읽기
  • h t c←1↓⍵∘=¨F←' htc': 하나는 머리, 하나는 꼬리, 구리는 3 개의 행렬을 얻는다. 또한 F를 문자열로 설정하십시오 ' htc'.

  • ⎕SM∘←1 1,⍨⊂N←F[1+⊃+/... ר⍳3]: "..."부분은 길이가 3 인 벡터로, 요소는 각각 새 머리, 꼬리 및 구리를 나타내는 행렬입니다. 머리에 1, 꼬리에 2, 구리에 3을 곱한 다음이 행렬을 합하고 1을 더하여에 행렬을 제공합니다 F. N입력과 같은 형식으로 새로운 상태가되고 ⎕SM왼쪽 상단에서 시작 하여 화면에 표시됩니다 .

  • ¯1⌽¯1⊖h↑⍨2+S←25 79: h두 행과 열로 자른 다음 오른쪽과 아래쪽으로 회전하여 공백의 경계를 추가하십시오 .

  • ⊃+/+/K∘.⊖(K←2-⍳3)∘.⌽⊂: 행렬을 8 개의 방향으로 모두 회전 한 다음 결과 행렬을 합산하여 각 위치의 머리에 인접한 이웃의 양을 지정합니다.

  • 1 2∊⍨: 1 개 또는 2 개의 이웃이있는 위치 만 1로 설정하십시오.

  • S↑1 1↓: 앞서 추가 한 테두리를 제거하십시오.

  • H←c∧: 새로운 헤드는 1 개 또는 2 개의 헤드 이웃이있는 구리 셀입니다.

  • t∨c≠H: 새로운 구리 전지는 모두 오래된 꼬리이며 머리가되지 않은 모든 오래된 구리 전지입니다.

  • H h(... ): 새 헤드는 H위에서 계산 한대로, 새 테일은 오래된 헤드로, 새 구리 셀은 위에서 계산 한대로입니다.

  • ∇N⊣⎕DL÷4: 1/4 초 기다린 다음에 기능을 다시 실행하십시오 N.


40 x 40 격자를 포함 할 수 있다면 더 좋을 것이라고 생각합니다.
mbomb007

6

알파카, 82 자

ALPACA는 셀룰러 오토 마톤을 위해 특별히 설계된 언어입니다.

o는 아무것도 아니다. c는 도체이고; e는 전자이고; t는 전자 꼬리이다.

state o " ";
state c "c" to e when 1 e or 2 e;
state e "e" to t;
state t "t" to c.

이 언어는 언제 발표 되었습니까? 언어에 대한 링크가 있습니까?
Optimizer

@Optimizer 여기에 간다! 나는 언어를 만들지 않았다.
DanTheMan

4
시원한. 올바른 도전에 적합한 언어 ..
Optimizer

4

GolfScript ( 125 개 120 105 개 100 문자)

n%{.,,{1${.0=,:w[1,*]\+2*>3<}:^~`{zip^''+.4=5%'`X '@{+}*(7&1>'iX'>+=}+w,%}%"\033[H\033[J"@n*+puts 6.?.?}do

\033리터럴 ESC문자 로 대체 될 수 있기 때문에 각 문자를 하나의 문자로 계산합니다 . 이것은 ANSI 제어 코드를 사용하므로 호환되는 tty에 의존합니다. 또한 입력 격자부터 프레임이 인쇄됩니다.

무어 이웃도 사용하는 합계 그리드 생성 과 겹칩니다 .

인코딩 : 공백 => ; 전자 헤드 => i; 전자 테일 => `; 구리 => X.

반복 사이의 중지는 46656 46656 을 계산하는 데 필요한 시간 입니다. 6.?.?다른 표현으로 변경 하면 속도를 제어 할 수 있습니다. 동일한 문자 수에 대해 다음으로 가장 느린 것은 7.?.?입니다.이 속도 는 훨씬 느립니다 (출력이 22 배 더 크고 선형 복잡도 계산이 아님).

테스트 케이스의 경우

`iXXXXXXXXX
X   X      
   XXX     
X   X      
i`XX XXXXXX

Rosetta Code Wireworld 챌린지에서


3

파이썬 371 341 자

네, 짧지는 않지만 대화식 GUI가 있습니다!

import matplotlib.pylab as l,scipy.ndimage as i
r=round
w=l.zeros((40,40),int)-1
p=l.matshow(w,vmax=2)
c=p.figure.canvas
def h(e):
 try:w[r(e.ydata),r(e.xdata)]=[0,2,-1][e.button-1]
 except:x=i.convolve(w==2,l.ones((3,3)),int,'constant');w[:]=w/2+((w==0)&(x>0)&(x<3))*2
 p.set_data(w);c.draw()
c.mpl_connect('button_press_event',h)
l.show()

명령:

마우스 왼쪽 버튼으로 클릭하여 와이어 배치

마우스 오른쪽 버튼으로 클릭하여 삭제

마우스 가운데 버튼으로 클릭하여 전자 헤드 배치

축 외부를 클릭하여 오토 마톤을 밟습니다.


(x>0)&(x<3)-> (0<x<3). :)
beary605

3

파이썬 ( 243214 )

사용 성과 캐릭터 사이를 교차하려고했습니다. 격자는 40x40입니다. 입력은 stdin에 제공됩니다. 전자 헤드는 h전자 꼬리는 t구리이며 c다른 것은 아무것도 없습니다.

import os
f=raw_input()
while 1:f=''.join('h'if(i=='c')&(0<sum(1 for i in[-1,1,-39,-40,-41,39,40,41]if f[e+i:e+i+1]=='h')<3)else't'if i=='h'else'c'if i=='t'else f[e]for e,i in enumerate(f));os.system('cls');print f

압축되지 않은 while 루프 (라인 3) (코드에 배치하면 작동하지 않음) :

while 1:
 for e,i in enumerate(f):
  if(i=='c')&(0<sum(1 for i in[-1,1,-39,-40,-41,39,40,41]if f[e+i:e+i+1]=='h')<3):f[e]='h'
  elif i=='h':f[e]='t'
  elif i=='t':f[e]='c'
  else:f[e]=f[e]  #redundant, but Python needs this to run
 os.system('cls') #cls is shorter than clear, so I used that
 print f

5-7 행을 단일 표현식으로 바꿀 수 있다고 생각합니다 g[e]='h'if(t=='c')&...else't'if i=='h'else'c'if i=='t'else i. 그것이 정확하게 작동하는지 확실하지 않지만, 그 라인을 따라 뭔가 작동해야합니다
Strigoides

2

C, 355 347 300 294 문자

편집 : 필요가 없다는 것을 깨달았습니다. feof()

편집 : 47 문자를 저장했습니다! 수면을 제거하고 거의 모든 버팀대를 제거하고 많은 작업을 결합했습니다.

편집 : 마지막으로 오늘은 300자를 마쳤습니다. 변경 printfputs첫 번째 비교 귀여운 작은 최적화를 발견했다.

C는 이런 종류의 문제에 잘 맞지 않지만 골프는 재미있다. 이것은 꽤 무차별 한 구현이지만, 얼마나 멀리 골프를 칠 수 있는지 알고 싶었습니다.

입력은이라는 텍스트 파일 i입니다. *구리, +전자 헤드, -전자 꼬리, 빈 셀 공간 의 시작 상태를 나타냅니다 . 테스트를 위해 위키 페이지의 XOR 게이트를 사용하고 있습니다.

   ****-+**
  +        ******
   -*******      *
                ****
                *  *****
                ****
   ********      *
  +        ******
   -****+-*

char*p,t[42][42],s[42][42];
main(i,r,c,n,j)
{
  for(p=fopen("i","r");fgets(s[i++]+1,40,p););

  for(;;getch(),memcpy(s,t,1764))
    for(j=1;j<41;puts(s[j++]+1))
      for(i=1;i<41;)
      {
        p=t[j]+i;
        r=s[j][i++];
        *p=r==43?45:r;
        if(r==45)
          *p=42;
        if(r==42)
          for(r=-1,n=0;r<2;++r,*p=n&&n<3?43:42)
            for(c=-2;c<1;)
              n+=s[j+r][i+c++]==43;
      }
}

cond?43:42쓸 수 있었 42+(cond)습니까? 그리고 나는 확신 r=s[j][i++];*p=r==43?45:r;if(r==45)*p=42;줄일 수있다 r=s[j][i++];*p=r==43?45:r==45?42:r;하지 않을 경우에r=s[j][i++]-43;*p=!r?45:r==2?42:r;
피터 테일러

1

Python, 234218

import time
I=input
C=I()
H=I()
T=I()
R=range(40)
while 1:
 for y in R:print''.join(' CHT'[(C+H+2*T).count(x+y*1j)]for x in R)
 H,T=[c for c in C if 0<sum(1 for h in H if abs(c-h)<2)<3and c not in H+T],H;time.sleep(.1)

보드를 구리 셀 (헤드 및 테일 목록을 포함해야 함), 헤드 및 테일의 좌표를 나타내는 3 개의 복소수 목록으로 입력합니다. 예를 들면 다음과 같습니다.

[3+2j+x for x in range(8)] + [3+4j+x for x in range(8)] + [11+3j+x for x in range(6)] + [2+3j]
[3+2j]
[2+3j]

우리 있습니다 eval복잡한 숫자의 목록에 대한 임의의 복잡한 식을 사용할 수 있도록 입력합니다.


1

Q 기본, 309 바이트

경고 : 골프 버전은 사용자에게 친숙하지 않습니다. 이상한 입력 방법이 있고 무한 루프로 실행되며 지연이 없습니다 (따라서 일부 시스템에서는 너무 빠르게 실행 됨). QBasic 환경에서 프로그램을 종료하는 방법을 알고있는 경우에만 실행하십시오. ungolfed 버전이 권장됩니다 (아래 참조).

INPUT w,h
SCREEN 9
FOR y=1TO h
FOR x=1TO w
PSET(x,y),VAL(INPUT$(1))
NEXT
NEXT
DO
FOR y=1TO h
FOR x=1TO w
SCREEN,,0
c=POINT(x,y)
d=c
IF c=7THEN d=1
IF c=1THEN d=6
IF c=6THEN
n=0
FOR v=y-1TO y+1
FOR u=x-1TO x+1
n=n-(POINT(u,v)=7)
NEXT
NEXT
d=7+(n=0OR n>2)
END IF
SCREEN,,1,0
PSET(x,y),d
NEXT
NEXT
PCOPY 1,0
LOOP

실행하려면 입력 프롬프트에서 구성의 width w및 height를 지정하십시오 h. 1 그런 다음 w*h셀의 한 자리 코드를 입력합니다 (왼쪽에서 오른쪽으로 이동 한 다음 위에서 아래로 이동)

  • 0 = 비어 있음
  • 6 = 와이어
  • 7 = 신호 헤드
  • 1 = 신호 꼬리

모든 셀을 입력하면 시뮬레이션이 시작됩니다 (프로그램을 종료 할 때까지 계속 진행).

언 골프

보다 사용자 친화적 인 버전입니다. 레이아웃을 수정하려면 DATA끝에 있는 명령문을 수정하십시오 .

이 코드는 POINT화면에서 픽셀의 색상 값을 읽는 기능을 활용 합니다. 즉, 셀을 별도로 배열로 저장할 필요가 없습니다. 모든 셀이 동시에 업데이트되도록 두 번째 "페이지"에서 업데이트를 수행합니다. SCREEN명령문 버전을 사용하여 활성 페이지를 토글하고 명령문을 사용하여 한 페이지의 컨텐츠를 다른 페이지로 복사 할 수 있습니다 PCOPY.

SCREEN 9

EMPTY = 0 ' Black
HEAD = 7  ' Light gray
TAIL = 1  ' Blue
WIRE = 6  ' Brown/orange

' First two data values are the width and height
READ w, h
' The rest are the initial configuration, row by row
' Read them and plot the appropriately colored pixels
FOR y = 1 TO h
  FOR x = 1 TO w
    READ state$
    IF state$ = "" THEN value = EMPTY
    IF state$ = "H" THEN value = HEAD
    IF state$ = "T" THEN value = TAIL
    IF state$ = "W" THEN value = WIRE
    PSET (x, y), value
  NEXT x
NEXT y

' Loop the simulation until user presses a key
DO UNTIL INKEY$ <> ""
  ' Store current time for delay purposes
  t# = TIMER

  FOR y = 1 TO h
    FOR x = 1 TO w
      ' Active page = display page = 0
      SCREEN , , 0
      ' Get the color value of the pixel at x,y
      oldVal = POINT(x, y)
      IF oldVal = EMPTY THEN
        newVal = EMPTY
      ELSEIF oldVal = HEAD THEN
        newVal = TAIL
      ELSEIF oldVal = TAIL THEN
        newVal = WIRE
      ELSEIF oldVal = WIRE THEN
        neighbors = 0
        FOR ny = y - 1 TO y + 1
          FOR nx = x - 1 TO x + 1
            IF POINT(nx, ny) = HEAD THEN neighbors = neighbors + 1
          NEXT nx
        NEXT ny
        IF neighbors = 1 OR neighbors = 2 THEN
          newVal = HEAD
        ELSE
          newVal = WIRE
        END IF
      END IF
      ' Active page = 1, display page = 0
      SCREEN , , 1, 0
      ' Plot the new value on page 1
      PSET (x, y), newVal
    NEXT x
  NEXT y

  ' Copy page 1 to page 0
  PCOPY 1, 0

  ' Delay
  WHILE TIMER >= t# AND t# + 0.2 > TIMER
  WEND
LOOP

DATA 8,5
DATA T,H,W,W,W,W,W,W
DATA W, , , ,W, , , 
DATA  , , ,W,W,W, , 
DATA W, , , ,W, , , 
DATA H,T,W,W, ,W,W,W

1 너비와 높이의 최대 값은 사용되는 화면 모드에 따라 다릅니다. 에서는 SCREEN 9, 폭 (638)까지 일 수 있고 (348)까지의 높이 최대 SCREEN 7DOS QBASIC 또는 도스 박스 에뮬레이터 (참조하는 것이 용이 작은 해상도 (최대 설정 크기 198 318)를 가지고 있지만, 화소는 더 큰 및 - 불행히도 QB64 그냥 더 작은 창을 제공합니다).

예제 실행

화면 모드가 7 인 archive.org의 ungolfed 버전 :

QBasic의 Wireworld

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.