Simule una computadora de tipo bola de billar (basada en la gravedad)

12

La máquina

Una máquina de tipo bola de billar se compone solo de los símbolos \ _ /junto con letras mayúsculas y minúsculas, espacios y el número 1.

\y /son rampas. Una pelota que viene de arriba será desviada hacia el lado derecho o izquierdo, respectivamente. Para ambas rampas, si una pelota viene de cualquier lado, se desviará hacia abajo.

_Es un elemento lógico. La lógica realizada por él es la parte más poco parecida al billar de la computadora. Primero, una pelota que viene de izquierda o derecha continúa en la misma dirección. Se detendrá una pelota que viene de arriba. Luego, después del final de su ejecución (ver Ejecución de la máquina a continuación), si el número de bolas que cruzan / aterrizan es un número par positivo, entonces se libera una sola bola desde la parte inferior del elemento.

Un espacio no hace nada. Cualquier bola que provenga de cualquier dirección cae directamente hacia abajo debido a la gravedad.

Las letras minúsculas son entradas. Todas las entradas serán un solo 1 o 0.

Las letras mayúsculas son salidas. El número que saldrá será el número de bolas de billar que lleguen a su ubicación.

El número 1libera una bola de billar extra en ese lugar. Representa un 1 lógico.

Todos los personajes además \_/hacen que cualquier bola que venga de cualquier dirección caiga directamente hacia abajo debido a la gravedad.

Las bolas nunca se combinan, se dividen o chocan. Solo se crean cuando se liberan de una entrada, a _o a 1. Solo se destruyen cuando caen directamente sobre a _.

Ejemplo de máquina

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

Nunca habrá líneas en blanco en una máquina, pero _puede que parezca que hay una línea en blanco.

Corriendo la máquina

Una máquina se ejecuta en capas o filas. Todo el movimiento de la bola de billar en la capa superior se realiza antes de que ocurra algo en la segunda capa.

La máquina

ab
\_A
 C

se ejecuta de la siguiente manera:

Primero, solicita la entrada aen el formulario a:. El usuario ingresará un 1 o 0 (seguido de enter). Repite esto para la entrada b. Este es el final de la primera capa. Voy a suponer que el usuario ingresó un 1 para ambas entradas.

Luego traza el camino de la primera bola (desde a), que va a lo largo de \, a través de _, hacia el A, y cae al punto debajo del A. Luego traza el camino para la segunda bola (desde b), que va directamente hacia abajo _y termina. Este es el final de la segunda capa.

Ahora, antes de la tercera capa, ya que _ha tenido dos bolas cruzadas sobre ella, suelta una bola. La salida Aha tenido una bola cruzada sobre ella, por lo que sale A:1.

Para la tercera capa, traza el camino de la primera bola (desde la _), que atraviesa Cy cae directamente hacia abajo. La segunda bola (que cayó a través del A) también cae directamente hacia abajo.

Ahora, antes de la cuarta capa, dado que la salida Ctenía un recorrido de bola sobre ella, sale C:1.

Como la cuarta capa está en blanco, el programa termina.

El resultado total debería verse como

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

La meta

Su objetivo es tomar una máquina de STDIN y simularla tomando entradas e imprimiendo salidas según sea necesario para STDOUT. La primera parte de la entrada a su programa consistirá en la máquina a ejecutar, seguida de una línea en blanco. Cualquier letra de entrada encontrada debe hacer que su programa solicite la entrada en forma del nombre de entrada seguido de dos puntos. Cualquier salida debe mostrarse en la forma del nombre de salida, seguido de dos puntos, seguido del número de bolas que pasan sobre ese punto.

Esto es golf.

Ejemplos

Un cruce de alambre

ab
\/
AB

Una puerta XOR

ab1
\_/
 C

Una víbora completa

1 a
\_/ b
  \_/
 \/
 /\
_ __/
 \_/ 
  \/c
 \\_/ 
  _S1
\  \/
 __/
  /
 _
\__
 C
PhiNotPi
fuente
En tu primer ejemplo, ¿por qué la primera bola cae debajo de la A? ¿Existe una regla no escrita de que las bolas se detienen cuando pasan a un personaje que no lo es \_/?
Peter Taylor
@PeterTaylor Sí, debo agregar que todas las letras se comportan como un espacio vacío cuando se trata de afectar la pelota, y la gravedad tira la pelota hacia abajo.
PhiNotPi
1
¿Por casualidad quieres decir 'flipper', no 'billard'?
usuario desconocido el
HACER DIS UN ESOLANG
Matthew Roh
1
@AlexL. También relevante: Marbelous
PhiNotPi

Respuestas:

3

JavaScript ( 392 423)

Asume que la máquina está configurada en una variable llamada m, luego alerta la salida final.

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)

Fuente de muestra (ejecuta la máquina sumadora, consulte el historial de fuentes menos golfizadas): http://jsfiddle.net/96yLj/12/

Spoilers:

- rrastrea el número de bolas en la fila actual, nrastrea el número de bolas en la fila siguiente.
- Algoritmo: procesa cada fila carácter por carácter, pero procesa _el último.
- Algoritmo: \-> seguir _y aumentar rhasta que no _. Lo mismo para /pero en dirección inversa. Al final aumenta la ngravedad tirando bolas hacia abajo. gmantiene la dirección.
- if(L[d]>'@'&L[d]<'[')r[d]+=r[c];es para el error mencionado en Editar 1 . La razón por la que no podemos decir r[d]+=r[c];es porque \_/contará las bolas dos veces al procesar /
: else if(C<'2')maneja ambos casos '1'y ' ', que se ~~Cconvierte en 1 y 0, respectivamente.


Edición 1: se corrigió el error con la bola corriendo _no incluida en el Acódigo de muestra.

mellamokb
fuente
Tenga en cuenta que siempre ignoro los requisitos STDIN y STDOUT porque son restricciones poco interesantes. Estoy usando promptpara entrada y alertsalida, que es bastante estándar para JavaScript :-)
mellamokb