Simula un computer (a gravità) di tipo biliardo


12

La macchina

Una macchina del tipo a palla da biliardo è composta solo da simboli \ _ /insieme a lettere maiuscole e minuscole, spazi e numero 1.

\e /sono rampe. Una palla che viene dall'alto verrà deviata sul lato destro o sinistro, rispettivamente. Per entrambe le rampe, se una palla proviene da entrambi i lati, verrà deviata verso il basso.

_è un elemento logico. La logica eseguita da essa è la parte del computer più simile al biliardo. Innanzitutto, una palla proveniente da sinistra o destra continua nella stessa direzione. Una palla proveniente dall'alto verrà fermata. Quindi, dopo la fine della sua esecuzione (vedi Far funzionare la macchina di seguito), se il numero di palline che attraversano / atterrano su di esso è un numero pari positivo, allora una singola pallina viene rilasciata dalla parte inferiore dell'elemento.

Uno spazio non fa nulla. Qualsiasi palla proveniente da qualsiasi direzione cade verso il basso a causa della gravità.

Le lettere minuscole sono input. Tutti gli ingressi saranno 1 o 0 singoli.

Le lettere maiuscole sono emesse. Il numero emesso sarà il numero di palle da biliardo che colpiscono la sua posizione.

Il numero 1rilascia una palla da biliardo in più in quella posizione. Rappresenta un 1 logico.

Inoltre, tutti i personaggi fanno \_/cadere qualsiasi palla proveniente da qualsiasi direzione per gravità.

Le palle non si combinano, si dividono o si scontrano mai. Vengono creati solo quando rilasciati da un input, a _o a 1. Vengono distrutti solo quando cadono direttamente su a _.

Esempio di macchina

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

Non ci saranno mai linee vuote in una macchina, ma _potrebbe far sembrare che ci sia una linea vuota.

Far funzionare la macchina

Una macchina viene eseguita in strati o righe. Tutto il movimento della palla da biliardo sul livello superiore viene eseguito prima che accada qualcosa sul secondo livello.

La macchina

ab
\_A
 C

viene eseguito come segue:

Innanzitutto, richiede l'inserimento anel modulo a:. L'utente inserirà quindi 1 o 0 (seguito da invio). Lo ripete per l'input b. Questa è la fine del primo strato. Presumo che l'utente abbia inserito un 1 per entrambi gli ingressi.

Quindi traccia il percorso della prima palla (da a), che percorre il \, attraverso il _, nel A, e cade nel punto sotto il A. Quindi traccia il percorso per la seconda palla (da b), che scende dritta sulla _e termina. Questa è la fine del secondo strato.

Ora, prima del terzo strato, dal momento che _ha avuto due palle incrociate su di esso, rilascia una palla. L'uscita Aha una croce incrociata su di essa, quindi viene emessa A:1.

Per il terzo strato, traccia il percorso della prima palla (dal _), che procede attraverso il Ce cade dritto. Anche la seconda palla (che è caduta attraverso A) cade dritta.

Ora, prima del quarto strato, poiché l'output Cha una corsa della sfera su di esso, viene emesso C:1.

Poiché il quarto livello è vuoto, il programma termina.

Il risultato totale dovrebbe apparire come

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

L'obiettivo. il gol

Il tuo obiettivo è prendere una macchina da STDIN e simularla prendendo input e stampando l'output secondo necessità su STDOUT. La prima parte dell'input per il programma sarà costituita dalla macchina da eseguire, seguita da una riga vuota. Eventuali lettere di input rilevate dovrebbero indurre il programma a richiedere input sotto forma di nome di input seguito da due punti. Qualsiasi output dovrebbe essere mostrato sotto forma del nome dell'output, seguito da due punti, seguito dal numero di palline che passano sopra quel punto.

Questo è il golf.

Esempi

Un incrocio di filo

ab
\/
AB

Un cancello XOR

ab1
\_/
 C

Un sommatore completo

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

Nel tuo primo esempio, perché la prima palla cade sotto la A? Esiste una regola non scritta che le palle si fermano quando passano su un personaggio che non lo è \_/?
Peter Taylor,

@PeterTaylor Sì, dovrei aggiungere che tutte le lettere si comportano come uno spazio vuoto quando si tratta di colpire la palla e la gravità la tira giù.
PhiNotPi,

1
Per caso, vuoi dire "pinna", non "biliardo"?
utente sconosciuto

FAI DIS UN ESOLANG
Matthew Roh,

1
@AlexL. Rilevante anche: Marbelous
PhiNotPi

Risposte:


3

JavaScript ( 392 423)

Presuppone che la macchina sia impostata in una variabile chiamata m, quindi avvisa l'output finale.

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)

Fonte di esempio (esegue la macchina adder, vedere la cronologia per le fonti meno giocate a golf): http://jsfiddle.net/96yLj/12/

Spoiler:

- rtraccia il numero di palline nella riga corrente, ntraccia il numero di palline nella riga successiva.
- Algoritmo: elabora ogni riga carattere per carattere, ma elabora _l'ultimo.
- Algoritmo: \-> segui _e aumenta rfino a non- _. Lo stesso per /ma in direzione opposta. Alla fine aumentare nper gravità tirando le palle verso il basso. gtiene la direzione.
- if(L[d]>'@'&L[d]<'[')r[d]+=r[c];è per il bug menzionato in Modifica 1 . Il motivo che non possiamo semplicemente dire r[d]+=r[c];è perché \_/conterrà il doppio conteggio delle palle durante l'elaborazione /
: else if(C<'2')gestisce entrambi i casi '1'e ' ', che ~~Csi trasforma rispettivamente in 1 e 0.


Modifica 1: risolto il bug con la palla che ricadeva _non inclusa nel Acodice di esempio.


Nota che ignoro sempre i requisiti STDIN e STDOUT perché sono restrizioni poco interessanti. Sto usando promptper l'input e alertper l'output che è abbastanza standard per JavaScript :-)
mellamokb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.