Esistono molti formalismi, quindi mentre potresti trovare utili altre fonti, spero di specificarlo abbastanza chiaramente da non essere necessario.
Un RM è costituito da una macchina a stati finiti e da un numero finito di registri nominati, ognuno dei quali contiene un numero intero non negativo. Per semplicità di input testuale questa attività richiede che anche gli stati siano nominati.
Esistono tre tipi di stato: incremento e decremento, che fanno entrambi riferimento a un registro specifico; e terminare. Uno stato di incremento incrementa il suo registro e passa il controllo al suo unico successore. Uno stato di decremento ha due successori: se il suo registro è diverso da zero, lo decrementa e passa il controllo al primo successore; altrimenti (cioè il registro è zero) passa semplicemente il controllo al secondo successore.
Per "gentilezza" come linguaggio di programmazione, gli stati di terminazione richiedono una stringa codificata per la stampa (in modo da poter indicare una terminazione eccezionale).
L'input proviene da stdin. Il formato di input è costituito da una riga per stato, seguita dal contenuto del registro iniziale. La prima riga è lo stato iniziale. BNF per le linee di stato è:
line ::= inc_line
| dec_line
inc_line ::= label ' : ' reg_name ' + ' state_name
dec_line ::= label ' : ' reg_name ' - ' state_name ' ' state_name
state_name ::= label
| '"' message '"'
label ::= identifier
reg_name ::= identifier
C'è una certa flessibilità nella definizione di identificatore e messaggio. Il tuo programma deve accettare una stringa alfanumerica non vuota come identificatore, ma può accettare stringhe più generali se preferisci (ad es. Se la tua lingua supporta identificatori con caratteri di sottolineatura ed è più facile lavorare con te). Allo stesso modo, per il messaggio è necessario accettare una stringa non vuota di caratteri alfanumerici e spazi, ma è possibile accettare stringhe più complesse che consentono la fuga di nuove righe e caratteri di virgolette doppie se lo si desidera.
L'ultima riga di input, che fornisce i valori iniziali del registro, è un elenco separato da spazi di assegnazioni identificatore = int, che deve essere non vuoto. Non è necessario che inizializzi tutti i registri nominati nel programma: si presume che 0 non sia inizializzato.
Il tuo programma dovrebbe leggere l'input e simulare l'RM. Quando raggiunge uno stato di terminazione, dovrebbe emettere il messaggio, una nuova riga e quindi i valori di tutti i registri (in qualsiasi formato conveniente, leggibile dall'uomo, e in qualsiasi ordine).
Nota: formalmente i registri dovrebbero contenere numeri interi senza limiti. Tuttavia, è possibile, se lo si desidera, supporre che nessun valore del registro superi mai 2 ^ 30.
Alcuni semplici esempi
a + = b, a = 0s0 : a - s1 "Ok"
s1 : b + s0
a=3 b=4
Risultati aspettati:
Ok
a=0 b=7
b + = a, t = 0
init : t - init d0
d0 : a - d1 a0
d1 : b + d2
d2 : t + d0
a0 : t - a1 "Ok"
a1 : a + a0
a=3 b=4
Risultati aspettati:
Ok
a=3 b=7 t=0
Casi di prova per macchine più complicate da analizzare
s0 : t - s0 s1
s1 : t + "t is 1"
t=17
Risultati aspettati:
t is 1
t=1
e
s0 : t - "t is nonzero" "t is zero"
t=1
Risultati aspettati:
t is nonzero
t=0
Un esempio più complicato
Tratto dalla sfida del codice problema Josephus del DailyWTF. L'input è n (numero di soldati) e k (avanzamento) e l'output in r è la posizione (a zero) della persona che sopravvive.
init0 : k - init1 init3
init1 : r + init2
init2 : t + init0
init3 : t - init4 init5
init4 : k + init3
init5 : r - init6 "ERROR k is 0"
init6 : i + init7
init7 : n - loop0 "ERROR n is 0"
loop0 : n - loop1 "Ok"
loop1 : i + loop2
loop2 : k - loop3 loop5
loop3 : r + loop4
loop4 : t + loop2
loop5 : t - loop6 loop7
loop6 : k + loop5
loop7 : i - loop8 loopa
loop8 : r - loop9 loopc
loop9 : t + loop7
loopa : t - loopb loop7
loopb : i + loopa
loopc : t - loopd loopf
loopd : i + loope
loope : r + loopc
loopf : i + loop0
n=40 k=3
Risultati aspettati:
Ok
i=40 k=3 n=0 r=27 t=0
Quel programma come immagine, per coloro che pensano visivamente e troverebbero utile capire la sintassi:
Se ti è piaciuto questo golf, dai un'occhiata al sequel .