(중력 기반) 당구 공 유형 컴퓨터 시뮬레이션


12

기계

당구 공 유형 기계는 \ _ /대문자와 소문자, 공백 및 숫자와 함께 기호로만 구성됩니다 1.

\그리고 /경사로입니다. 위에서 오는 공은 각각 오른쪽 또는 왼쪽으로 편향됩니다. 두 경사로 모두 볼이 양쪽에서 나오면 아래쪽으로 편향됩니다.

_논리 요소입니다. 이것에 의해 수행되는 논리는 컴퓨터에서 가장 당구와 같은 부분입니다. 첫째, 왼쪽 또는 오른쪽에서 나오는 공은 같은 방향으로 계속됩니다. 위에서 오는 공이 멈 춥니 다. 그런 다음 실행이 끝난 후 (아래 기계 작동 참조) 볼이 가로 지르거나 내려 오는 볼 수가 양의 짝수이면 단일 볼이 요소의 맨 아래에서 분리됩니다.

공간은 아무것도하지 않습니다. 모든 방향에서 나오는 공은 중력으로 인해 곧게 떨어집니다.

소문자가 입력됩니다. 모든 입력은 단일 1 또는 0입니다.

대문자가 출력됩니다. 출력되는 숫자는 해당 위치에 닿은 당구 공의 수입니다.

이 번호 1는 해당 위치에서 추가 당구 공을 출시합니다. 논리 1을 나타냅니다.

그 밖의 모든 문자는 \_/중력으로 인해 어떤 방향에서든 공이 똑바로 떨어지게합니다.

공은 절대로 결합하거나 쪼개지거나 충돌하지 않습니다. 입력, a _또는 a 에서 해제 된 경우에만 작성됩니다 1. 그들은 똑바로 넘어 질 때만 파괴됩니다 _.

기계 예

1 a
\_/ b
  \_/
 \/
 /\ /
_  _
A  B

기계에 빈 줄이없는 것은 아니지만 _빈 줄이있는 것처럼 보일 수 있습니다.

기계 작동

머신은 레이어 또는 행으로 실행됩니다. 상단 레이어의 모든 당구 공 이동은 두 번째 레이어에서 어떤 일이 발생하기 전에 수행됩니다.

기계

ab
\_A
 C

다음과 같이 실행됩니다.

먼저, a형식 의 입력 을 요구합니다 a:. 그런 다음 사용자는 1 또는 0을 입력합니다 (뒤에 enter). 입력에 대해 이것을 반복합니다 b. 이것이 첫 번째 레이어의 끝입니다. 사용자가 두 입력에 모두 1을 입력했다고 가정합니다.

그런 다음 첫 번째 공 (에서의 경로 추적 한 a를 따라 간다), \어 크로스, _로를, A그리고 아래 자리까지 떨어진다 A. 그런 다음 두 번째 공의 경로 (에서 b) 를 추적합니다 _. 이것이 두 번째 레이어의 끝입니다.

이제 세 번째 레이어 이전에 _두 개의 볼이 교차했기 때문에 하나의 볼을 해제합니다. 출력 A은 그 위에 하나의 볼이 교차하여 출력 A:1합니다.

세 번째 레이어의 경우 첫 번째 공의 경로를 추적합니다 ( _) C. 두 번째 공 (을 통해 A떨어짐)도 똑바로 떨어집니다.

이제 네 번째 레이어 이전에는 출력 C에 하나의 공이 이동했기 때문에 출력 C:1됩니다.

네 번째 계층이 비어 있기 때문에 프로그램이 종료됩니다.

총 결과는 다음과 같아야합니다

a:1     (the user entered the one)
b:1     (same here)
A:1
C:1

목표

목표는 STDIN에서 기계를 가져와 STDOUT에 입력을 입력하고 인쇄하여 시뮬레이션하는 것입니다. 프로그램 입력의 첫 번째 부분은 실행할 기계와 빈 줄로 구성됩니다. 입력 문자가 있으면 프로그램이 입력 이름 형식으로 입력하고 콜론을 입력하라는 메시지를 표시해야합니다. 모든 출력은 출력 이름, 콜론, 해당 지점을 통과하는 볼 수의 형태로 표시되어야합니다.

이것은 골프입니다.

와이어 크로싱

ab
\/
AB

XOR 게이트

ab1
\_/
 C

완전 가산기

1 a
\_/ b
  \_/
 \/
 /\
_ __/
 \_/ 
  \/c
 \\_/ 
  _S1
\  \/
 __/
  /
 _
\__
 C

첫 번째 예에서 첫 번째 공이 A 아래로 떨어지는 이유는 무엇입니까? 공이 아닌 캐릭터를 지나갈 때 공이 멈추는 기록되지 않은 규칙이 \_/있습니까?
피터 테일러

@PeterTaylor 예, 공에 영향을 줄 때 모든 문자가 빈 공간으로 작동하고 중력이 공을 아래로 당깁니다.
PhiNotPi

1
우연히 당신은 '빌라 드'가 아닌 '플리퍼'를 의미합니까?
사용자가 알 수 없음

ESOLANG을 만들어
Matthew Roh

1
@AlexL. 관련성 : Marbelous
PhiNotPi

답변:


3

자바 스크립트 ( 392423 )

machine이라는 변수에 machine이 설정되었다고 가정 m하고 최종 출력을 경고합니다.

l=m.split(q='\n');o='';for(r=Array(z=l[i=0].length);i<l.length;i++){L=l[i];n=Array(z);for(c=0;c<z;n[c]=N,r[c++]=R){C=L[c];N=~~n[c];R=~~r[c];if(C>'`'){N+=x=~~prompt(C);R+=x;o+=C+': '+x+q}else if(C=='\\'||C=='/'){for(d=c+(g=C=='/'?-1:1);L[d]=='_';r[d]+=R,d+=g);if(L[d]>'@'&L[d]<'[')r[d]+=r[c];n[d]=~~n[d]+R}else if(C<'2')N+=R+=~~C;else if(C!='_')o+=C+': '+R+q}for(c=0;c<z;c++)if(L[c]=='_')n[c]+=(r[c]%2)?0:r[c]>0;r=n}alert(o)

샘플 소스 (가산기 실행, 골프가 적은 소스의 이력 참조) : http://jsfiddle.net/96yLj/12/

스포일러:

- r현재 행에서 볼 수를 추적하고 n다음 행에서 볼 수를 추적합니다.
-알고리즘 : 각 행 문자를 문자별로 처리하지만 _마지막은 처리 합니다.
-알고리즘 : \->를 따르고 비가 될 때까지 _증가시킵니다 . 반대 방향으로 동일합니다 . 결국 공을 잡아 당기는 중력 증가 . 방향을 유지합니다. - 에 언급 된 버그입니다 편집 1 . 우리가 말할 수없는 이유가 있기 때문입니다 처리 할 때 볼 카운트 두 배로 - 핸들을 두 경우 와 , 회전을 1과 0으로 각각.r_/ng
if(L[d]>'@'&L[d]<'[')r[d]+=r[c];r[d]+=r[c];\_//
else if(C<'2')'1'' '~~C


편집 1 : 샘플 코드에 _포함되지 않은 볼이 실행되는 버그 수정 A.


STDIN 및 STDOUT 요구 사항은 관심없는 제한 사항이므로 항상 무시합니다. 내가 사용하고 prompt입력 및 alert:-) 자바 스크립트 꽤 표준 출력
mellamokb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.