Simulatore di Turing Machine


15

Scrivi un simulatore di macchine Turing .

Per semplicità possiamo assumere stati come numeri interi, simboli come carattere, il simbolo vuoto è uguale allo spazio bianco

5 tuple sotto forma di stato corrente, simbolo di input, stato successivo, simbolo di output, direzione (sinistra o destra) l'ordine non è obbligatorio ma specificare se lo si scambia

La macchina deve arrestarsi quando viene raggiunto uno stato sconosciuto, non sono consentite altre condizioni di arresto.

Il nastro è infinito in entrambe le direzioni e puoi sempre leggere un carattere vuoto.

Input: il nastro iniziale, uno stato iniziale e un programma. sei libero di leggere i dati ovunque nel formato che preferisci

Output: il nastro dopo l'esecuzione del programma

Obbligatorio: un programma di esempio eseguito sul simulatore

Questo è un code-colf quindi vince il codice più corto.

Pubblicherò un'implementazione e alcuni programmi di esempio nelle prossime ore.


Risposte:


2

GolfScript, 92 caratteri

~:m;n\+{:^.n?)>1<]m{2<1$=},.{~2>~^n/~1>[@\+]n*1$%n/~\1$1<+[\1>.!{;" "}*]n*\%@}{;;^0}if}do n-

La macchina Turing in GolfScript è diventata molto più lunga del previsto. Ancora giocando con diverse rappresentazioni del nastro.

La prima riga dell'ingresso è lo stato originale, la seconda riga il nastro iniziale, seguito da una matrice di transizioni (con stato corrente dell'ordine, simbolo di input, stato successivo, direzione, simbolo di output).

Esempio ( disponibile anche online )

> 0
> '101'
> [[0 '0' 0 1 '0']
>  [0 '1' 0 1 '1']
>  [0 ' ' 1 -1 ' ']
>  [1 '0' 2 1 '1']
>  [1 '1' 3 -1 '0']
>  [3 '0' 2 1 '1']
>  [3 ' ' 2 1 '1']
>  [3 '1' 3 -1 '0']] 

110 

hai battuto la mia implementazione di sed con un carattere, è ora di vedere se posso fare di meglio
Geoff Reedy,

7

GNU sed con -r- 133 117 111 93 caratteri

Sì, sed è al completo. GNU sed e -r(regexps esteso) serve solo per salvare alcuni caratteri, è solo una piccola modifica a lavorare con POSIX sed.

:s
s/^(.*@)(.*)>(.)(.*#\1\3([^@]*@)(..))/\5\2\6>\4/
T
s/(..)l>|r>/>\1/
s/>@/@> /
s/>#/> #/
bs

Il formato di input è

[initial state]@[non-empty tape with > marking head position]#[state]@[input symbol][next state]@[output symbol][direction l or r]#...

I delimitatori @, #e il carattere di testa >non può essere usato come un simbolo sul nastro. Le etichette di stato non possono contenere @ >o #.

Eseguirà tutti i programmi nell'input, uno per riga

Esempi:

Marco è un n b n programma

Ingresso

0@>aaabbb#0@a1@ r#0@ 4@ r#1@a1@ar#1@b1@br#1@ 2@ l#2@b3@ l#2@a5@al#3@b3@bl#3@a3@al#3@ 0@ r#4@ 5@Tr

Produzione

5@    T>  #0@a1@ r#0@ 4@ r#1@a1@ar#1@b1@br#1@ 2@ l#2@b3@ l#2@a5@al#3@b3@bl#3@a3@al#3@ 0@ r#4@ 5@Tr

Ciao Marco! programma

Ingresso

0@> #0@ 1@Hr#1@ 2@er#2@ 3@lr#3@ 4@lr#4@ 5@or#5@ 6@!r

Produzione

6@Hello!> #0@ 1@Hr#1@ 2@er#2@ 3@lr#3@ 4@lr#4@ 5@or#5@ 6@!r

7

Quindi sono un po 'in ritardo, ma ho pensato di lasciarlo qui ...

Turing Machine Simulazione di un Turing Machine: 370 byte?

Qui sto usando la struttura utilizzata da Turing nella sua carta del 1936. Sto usando un simbolo = un byte, inclusi m-configs e operazioni.

╔═══════════════╦═══════╦═══════════════════╦═══════════════╗
║    m-config    ║ Symbol ║     Operations      ║ Final m-config ║
╠═══════════════╬═══════╬═══════════════════╬═══════════════╣
║ currentCommand ║ Any    ║ L                   ║ currentCommand ║
║                ║ *      ║ MR                  ║ readCommand    ║
╠----------------╬--------╬---------------------╬----------------╣
║ nextCommand    ║ Any    ║ L                   ║ nextCommand    ║
║                ║ *      ║ E  R  R  R  P* R    ║ readCommand    ║
╠----------------╬--------╬---------------------╬----------------╣
║ readCommand    ║ P      ║ R                   ║ readCommandP   ║
║                ║ M      ║ R                   ║ readCommandM   ║
║                ║ G      ║ R                   ║ readCommandG   ║
║                ║ E      ║ R                   ║ MHPNone        ║
╠----------------╬--------╬---------------------╬----------------╣
║ readCommandP   ║ 0      ║                     ║ MHP0           ║
║                ║ 1      ║                     ║ MHP1           ║
║                ║ e      ║                     ║ MHPe           ║
║                ║ x      ║                     ║ MHPx           ║
║                ║ None   ║                     ║ MHPNone        ║
╠----------------╬--------╬---------------------╬----------------╣
║ readCommandM   ║ R      ║                     ║ MHMR           ║
║                ║ L      ║                     ║ MHML           ║
╠----------------╬--------╬---------------------╬----------------╣
║ readCommandG   ║ 1      ║                     ║ G2<1           ║
║                ║ 2      ║                     ║ G2<2           ║
║                ║ 3      ║                     ║ G2<3           ║
║                ║ 4      ║                     ║ G2<4           ║
║                ║ 5      ║                     ║ G2<5           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G2<1           ║ int(1) ║ L  P@ R  R  R  P* R ║ GTS            ║
║                ║ <      ║                     ║ G21            ║
║                ║ *      ║ E  L                ║ G2<1           ║
║                ║ @      ║ E  L                ║ G2<1           ║
║                ║ Any    ║ L                   ║ G2<1           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G2<2           ║ int(2) ║ L  P@ R  R  R  P* R ║ GTS            ║
║                ║ <      ║                     ║ G22            ║
║                ║ *      ║ E  L                ║ G2<2           ║
║                ║ @      ║ E  L                ║ G2<2           ║
║                ║ Any    ║ L                   ║ G2<2           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G2<3           ║ int(3) ║ L  P@ R  R  R  P* R ║ GTS            ║
║                ║ <      ║                     ║ G23            ║
║                ║ *      ║ E  L                ║ G2<3           ║
║                ║ @      ║ E  L                ║ G2<3           ║
║                ║ Any    ║ L                   ║ G2<3           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G2<4           ║ int(4) ║ L  P@ R  R  R  P* R ║ GTS            ║
║                ║ <      ║                     ║ G24            ║
║                ║ *      ║ E  L                ║ G2<4           ║
║                ║ @      ║ E  L                ║ G2<4           ║
║                ║ Any    ║ L                   ║ G2<4           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G2<5           ║ int(5) ║ L  P@ R  R  R  P* R ║ GTS            ║
║                ║ <      ║                     ║ G25            ║
║                ║ *      ║ E  L                ║ G2<5           ║
║                ║ @      ║ E  L                ║ G2<5           ║
║                ║ Any    ║ L                   ║ G2<5           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G21            ║ int(1) ║ L  P@ R             ║ GTS            ║
║                ║ Any    ║ R                   ║ G21            ║
╠----------------╬--------╬---------------------╬----------------╣
║ G22            ║ int(2) ║ L  P@ R             ║ GTS            ║
║                ║ Any    ║ R                   ║ G22            ║
╠----------------╬--------╬---------------------╬----------------╣
║ G23            ║ int(3) ║ L  P@ R             ║ GTS            ║
║                ║ Any    ║ R                   ║ G23            ║
╠----------------╬--------╬---------------------╬----------------╣
║ G24            ║ int(4) ║ L  P@ R             ║ GTS            ║
║                ║ Any    ║ R                   ║ G24            ║
╠----------------╬--------╬---------------------╬----------------╣
║ G25            ║ int(5) ║ L  P@ R             ║ GTS            ║
║                ║ Any    ║ R                   ║ G25            ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTS            ║ ^      ║ R                   ║ TS             ║
║                ║ Any    ║ R                   ║ GTS            ║
╠----------------╬--------╬---------------------╬----------------╣
║ TS             ║ 0      ║                     ║ RL0            ║
║                ║ 1      ║                     ║ RL1            ║
║                ║ e      ║                     ║ RLe            ║
║                ║ x      ║                     ║ RLx            ║
║                ║ None   ║                     ║ RLNone         ║
╠----------------╬--------╬---------------------╬----------------╣
║ RL0            ║ @      ║ R  R                ║ GTS0           ║
║                ║ Any    ║ L                   ║ RL0            ║
╠----------------╬--------╬---------------------╬----------------╣
║ RL1            ║ @      ║ R  R                ║ GTS1           ║
║                ║ Any    ║ L                   ║ RL1            ║
╠----------------╬--------╬---------------------╬----------------╣
║ RLe            ║ @      ║ R  R                ║ GTSe           ║
║                ║ Any    ║ L                   ║ RLe            ║
╠----------------╬--------╬---------------------╬----------------╣
║ RLx            ║ @      ║ R  R                ║ GTSx           ║
║                ║ Any    ║ L                   ║ RLx            ║
╠----------------╬--------╬---------------------╬----------------╣
║ RLNone         ║ @      ║ R  R                ║ GTSNone        ║
║                ║ Any    ║ L                   ║ RLNone         ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTS0           ║ 0      ║ R  P*  R            ║ readCommand    ║
║                ║ Any    ║ R                   ║ GTS0           ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTS1           ║ 1      ║ R  P*  R            ║ readCommand    ║
║                ║ Any    ║ R                   ║ GTS1           ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTSe           ║ e      ║ R  P*  R            ║ readCommand    ║
║                ║ Any    ║ R                   ║ GTSe           ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTSx           ║ x      ║ R  P*  R            ║ readCommand    ║
║                ║ Any    ║ R                   ║ GTSx           ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTSNone        ║ _      ║ R  P*  R            ║ readCommand    ║
║                ║ Any    ║ R                   ║ GTSNone        ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHP0           ║ ^      ║ R                   ║ Print0         ║
║                ║ Any    ║ R                   ║ MHP0           ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHP1           ║ ^      ║ R                   ║ Print1         ║
║                ║ Any    ║ R                   ║ MHP1           ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHPe           ║ ^      ║ R                   ║ Printe         ║
║                ║ Any    ║ R                   ║ MHPe           ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHPx           ║ ^      ║ R                   ║ Printx         ║
║                ║ Any    ║ R                   ║ MHPx           ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHPNone        ║ ^      ║ R                   ║ PrintNone      ║
║                ║ Any    ║ R                   ║ MHPNone        ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHMR           ║ ^      ║ R  R                ║ MHR            ║
║                ║ Any    ║ R                   ║ MHMR           ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHML           ║ ^      ║ L                   ║ MHL            ║
║                ║ Any    ║ R                   ║ MHML           ║
╠----------------╬--------╬---------------------╬----------------╣
║ Print0         ║ ^      ║ R                   ║ Print0         ║
║                ║ None   ║ P0                  ║ nextCommand    ║
║                ║ Any    ║ E                   ║ Print0         ║
╠----------------╬--------╬---------------------╬----------------╣
║ Print1         ║ ^      ║ R                   ║ Print1         ║
║                ║ None   ║ P1                  ║ nextCommand    ║
║                ║ Any    ║ E                   ║ Print1         ║
╠----------------╬--------╬---------------------╬----------------╣
║ Printx         ║ ^      ║ R                   ║ Printx         ║
║                ║ None   ║ Px                  ║ nextCommand    ║
║                ║ Any    ║ E                   ║ Printx         ║
╠----------------╬--------╬---------------------╬----------------╣
║ Printe         ║ ^      ║ R                   ║ Printe         ║
║                ║ None   ║ Pe                  ║ nextCommand    ║
║                ║ Any    ║ E                   ║ Printe         ║
╠----------------╬--------╬---------------------╬----------------╣
║ PrintNone      ║ ^      ║ R                   ║ PrintNone      ║
║                ║ None   ║                     ║ nextCommand    ║
║                ║ Any    ║ E                   ║ PrintNone      ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHL            ║ ^      ║ R  R                ║ MHL            ║
║                ║ [      ║                     ║ SBL            ║
║                ║ Any    ║ L  P^ R  R  E       ║ nextCommand    ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHR            ║ ^      ║ R  R                ║ MHR            ║
║                ║ ]      ║                     ║ SBR            ║
║                ║ None   ║ P^ L  L  E          ║ nextCommand    ║
╠----------------╬--------╬---------------------╬----------------╣
║ SBR            ║ ]      ║ E  R  R  P]         ║ currentCommand ║
╠----------------╬--------╬---------------------╬----------------╣
║ SBL            ║ ]      ║ R                   ║ SBLE           ║
║                ║ Any    ║ R                   ║ SBL            ║
╠----------------╬--------╬---------------------╬----------------╣
║ SBLE           ║ [      ║                     ║ currentCommand ║
║                ║ None   ║ L                   ║ SBLE           ║
║                ║ Any    ║ E  R  R  P] L       ║ SBLE           ║
╚═══════════════╩═══════╩═══════════════════╩═══════════════╝

Ecco uno degli esempi di Turing dal documento sopra per la mia macchina:

['<', None, 1, '0', None, 'P', 'e', None, 'M', 'R', None, 'P', 'e', None, 'M', 'R', None, 'P', '0', None, 'M', 'R', None, 'M', 'R', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
                      '1', None, 'P', 'e', None, 'M', 'R', None, 'P', 'e', None, 'M', 'R', None, 'P', '0', None, 'M', 'R', None, 'M', 'R', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
                      'e', None, 'P', 'e', None, 'M', 'R', None, 'P', 'e', None, 'M', 'R', None, 'P', '0', None, 'M', 'R', None, 'M', 'R', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
                      'x', None, 'P', 'e', None, 'M', 'R', None, 'P', 'e', None, 'M', 'R', None, 'P', '0', None, 'M', 'R', None, 'M', 'R', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
                      '_', None, 'P', 'e', None, 'M', 'R', None, 'P', 'e', None, 'M', 'R', None, 'P', '0', None, 'M', 'R', None, 'M', 'R', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',

             None, 2, '1', None, 'M', 'R', None, 'P', 'x', None, 'M', 'L', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
                      '0', None, 'G', '3',

             None, 3, '0', None, 'M', 'R', None, 'M', 'R', None, 'G', '3',
                      '1', None, 'M', 'R', None, 'M', 'R', None, 'G', '3',
                      '_', None, 'P', '1', None, 'M', 'L', None, 'G', '4',

             None, 4, 'x', None, 'E', 'E', None, 'M', 'R', None, 'G', '3',
                      'e', None, 'M', 'R', None, 'G', '5',
                      '_', None, 'M', 'L', None, 'M', 'L', None, 'G', '4',

             None, 5, '0', None, 'M', 'R', None, 'M', 'R', None, 'G', '5',
                      '1', None, 'M', 'R', None, 'M', 'R', None, 'G', '5',
                      'e', None, 'M', 'R', None, 'M', 'R', None, 'G', '5',
                      'x', None, 'M', 'R', None, 'M', 'R', None, 'G', '5',
                      '_', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
        None, '[', '^', None, ']', None]

Provalo online! (Usa Python 3 come interprete) - Modifica: ho appena controllato il TIO, e non sembra funzionare davvero bene ... Provalo sul tuo computer locale e dovrebbe (si spera) dovrebbe funzionare. Lo fa sul mio.


Nessun danno previsto, basta allineare i bordi sul tavolo.
Greg Bacon,

@GregBacon Senza offesa ... forse c'è qualche differenza tra il modo in cui i diversi computer visualizzano i blocchi di codice, ma la tua modifica ha peggiorato molto l'allineamento nella mia schermata di modifica ... Sono sicuro che sembrava aver ragione quando hai suggerito la modifica; non sono sicuro di quale sia il problema
bendl

3

APL (110)

(Non è nemmeno così corto ...)

0(''⍞){×⍴X←0~⍨⍺∘{x y S T s m t←⍺,⍵⋄S T≡x,⊃⊃⌽y:s,⊂(⊃y){m:(¯1↓⍺)(⍵,⍨¯1↑⍺)⋄(⍺,⊃⍵)(1↓⍵)}t,1↓⊃⌽y⋄0}¨⍵:⍵∇⍨⊃X⋄,/⊃⌽⍺}⎕

Legge due righe dalla tastiera: il primo è il programma e il secondo è il nastro iniziale.

Il formato è

(in-state in-tape out-state movement out-tape) 

e dovrebbero essere tutti sulla stessa linea. 'Movimento' è 0 per spostarsi a destra e 1 per spostarsi a sinistra.

Programma di esempio (interruzioni di riga inserite per chiarezza, dovrebbero essere tutte su una riga.)

(0 ' ' 1 0 '1')
(0 '1' 0 0 '1')
(1 '1' 1 0 '1')
(1 ' ' 2 1 ' ')
(2 '1' 3 1 ' ')

Il programma aggiunge due numeri unari insieme, ad esempio:

in:  1111 111
out: 1111111

Esempio 2 (adattato dal programma di incremento binario dalla voce di Marco Martinelli):

(0 '0' 0 0 '0')
(0 '1' 0 0 '1')
(0 ' ' 1 1 ' ')
(1 '0' 2 0 '1')
(1 '1' 3 1 '0')
(3 '0' 2 0 '1')
(3 ' ' 2 0 '1')
(3 '1' 3 1 '0')

Come posso provarlo? Sto usando Linux e ho provato con aplus ma non funziona (token indefinito :(). Quale interprete / compilatore dovrei provare?
Marco Martinelli,

Sto usando Dyalog APL. Non sono a conoscenza dell'uso di alcuna funzione specifica di Dyalog ma A + non è completamente la stessa cosa. C'è una versione gratuita di Dyalog ma è solo per Windows. (Potrebbe funzionare con Wine ma usa il suo metodo di input in modo da poter digitare APL.) Se fai funzionare Dyalog, inserisci / incolla il codice APL (su una riga), quindi il programma di Turing machine (su una seconda riga ), quindi il nastro iniziale (sulla terza riga).
Marin

ok, ci proverò, grazie
Marco Martinelli,

3

Python, 101 189 152 142

a=dict(zip(range(len(b)),b))
r=eval(p)
i=s=0
while 1:
 c=a.get(i,' ')
 s,m,a[i]=r[s,c]
 if 0==m:exit([x[1]for x in sorted(a.items())])
 i=i+m

b e p sono gli input, b è il nastro iniziale, p codifica le regole come (rappresentazione in stringa di) un dict dalla tupla (in-state, in-tape) alla tupla (out-state, head move, out-tape) . Se move è 0 il programma termina, 1 si sposta a destra e -1 si sposta a sinistra.

b="aaba"

p="""{(0, 'a'): (1, 1, 'a'),
      (0, 'b'): (0, 1, 'b'),
      (1, 'a'): (1, 1, 'a'),
      (1, 'b'): (0, 1, 'b'),
      (1, ' '): (1, 0, 'Y'),
      (0, ' '): (0, 0, 'N')}"""

Questo programma di esempio verifica se l'ultima lettera della stringa (prima del nastro vuoto) è "a", in tal caso scrive "Y" alla fine della stringa (primo spazio vuoto).

Modifica 1:

Modificato il nastro per essere rappresentato come un dict, in quanto sembrava il modo più breve per scrivere una struttura di dati estensibile. La penultima riga lo sta principalmente trasformando in forma leggibile per l'output.

Modifica 2:

Grazie a Strigoides per molti miglioramenti.

Modifica 3:

L'avevo reso inutilmente così 0 poiché l'uscita avrebbe lasciato il posto così com'è. Ho rimosso questo dato che possiamo sempre scrivere l'output come l'input.


Non penso che questa sia una soluzione valida perché nella tua implementazione il nastro è limitato. In questo modo è necessario conoscere in anticipo il consumo di memoria del programma. E ci sono problemi a spostarsi a sinistra. Suggerimento: è possibile creare un nastro da due stack modificati in cui è sempre possibile far apparire un simbolo vuoto.
Marco Martinelli,

Ah vero. Scusa, non ci ho pensato troppo.
shiona,

Uhm .. afaik il nastro è infinito in entrambe le direzioni e puoi sempre leggere un carattere vuoto. Lo specificherò nella risposta.
Marco Martinelli,

Avevi ragione (avevamo avuto regole più severe nei nostri esercizi). Ho risolto almeno alcuni dei difetti.
shiona,

È possibile rimuovere lo spazio nella prima riga, r=0;s=0diventare r=s=0(e il punto e virgola alla fine di quella riga non è necessario), è possibile rimuovere la funzione w, poiché non viene utilizzata, le parentesi possono essere rimosse (s,m,t)=r[s,c], il blocco try/ exceptpuò essere ridotto usando dict.get; c=a.get(i,' '), poiché mè 0 o 1, puoi utilizzare if m-1:e puoi abbreviare la map()chiamata convertendola in una comprensione dell'elenco.
Strigoides,

3

poscritto (205) (156) (150) (135)

<<
>>begin
/${stopped}def([){add dup{load}${exit}if}def
0 A{1 index{load}${pop( )}if
get{exec}${exit}if}loop
3{-1[pop}loop{1[print}loop

Questo è probabilmente un imbroglio, ma la tabella delle transizioni contiene codice per eseguire le transizioni. E poiché il nastro è rappresentato da una mappatura da numeri interi a numeri interi, ho rappresentato gli stati come una mappatura da nomi a dizionari in modo che il nastro e il programma coesistano nello stesso dizionario anonimo.

Ulteriori risparmi rendendo eseguibili tutti i nomi di stato, in modo da caricarli automaticamente .

Non registrato con il programma "Hello" incorporato. Altri 52 caratteri acquistano un loop per leggere il nastro da stdin.Corri con gsnd -q tm.ps.

%!
<<
    /A<<( ){dup(H)def 1 add B}>>
    /B<<( ){dup(e)def 1 add C}>>
    /C<<( ){dup(l)def 1 add D}>>
    /D<<( ){dup(l)def 1 add E}>>
    /E<<( ){dup(o)def 1 add F}>>
>>begin %ds: int-keys=tape name-keys=prog
0 A %pos state
{ %loop
    1 index{load}stopped{pop( )}if  %pos state tape(pos)
    get    {exec}stopped{exit  }if  %new-pos new-state
} loop
% Loop from tape position 0 to left until left tape end is found
0{                                  %pos
  -1 add                            %new-pos
  dup{load}stopped{exit}if          %new-pos tape(new-pos)
  pop                               %new-pos tape(new-pos)
}loop
% Move to the right and print all chars until right end is hit
{                                   %pos
  1 add                             %new-pos
  dup{load}stopped{exit}if          %new-pos tape(new-pos)
  print                             %new-pos tape(new-pos)
}loop

Quindi il formato tabella è

/in-state<<in-tape{dup out-tape def movement add out-state}
           in-tape2{dup out-tape2 def movement2 add out-state2}>>

dove in-stateè un nome in-tapee out-tapesono caratteri (es. numeri interi o espressioni che producono numeri interi), movementè -1per sinistra o 1per destra ed out-stateè un nome eseguibile . La in-tapetransizione multipla per lo stesso stato deve essere combinata come sopra.


Un altro problema è che non ci sono disposizioni per scoprire quale parte del nastro è interessante. Costerà un bel po 'fare un currentdict{search-for-min-and-max}forall juggle-params-for-for. :(
luser droog

Ho provato il mio, ma era ben oltre la tua concisione. Ma ho suggerito alcuni miglioramenti al tuo codice.
Thomas W.

A proposito, che dire del nastro iniziale? Ho rimosso la riga commentata dal codice non golfato perché non sembrava fare il lavoro. ("0 not" restituisce -1, quindi nessuna iterazione del loop)
Thomas W.

Ottimi miglioramenti! ... A proposito del codice nastro iniziale, penso di averlo scritto male dal mio notebook. SB 0 1 0 not{(%stdin)(r)file read not{exit}if def}for. Non sono sicuro del motivo per cui pensavo di riuscire a cavarmela omettendo la versione golf. : P
luser droog

Oh, aspetta, -1! Quindi 0 notdovrebbe essere 16#7fffffff. Scusa. Aha! ecco perché è stato commentato! È uscito direttamente dal notebook, non è stato testato e ho eliminato tutti i commenti senza guardare quando l'ho provato. Non dirlo al ragazzo Python! : P
luser droog

2

C (non ancora giocato a golf)

Suppongo di non poter vincere con questo, eppure è stato divertente farlo funzionare. Questo è ancora più vero oggi che in realtà fa il lavoro. :)

Tranne che è solo infinito in una direzione. Suppongo che abbia bisogno anche di un nastro negativo. Sospiro....

Il negativo non era poi così male. Interlacciamo i due lati come pari e dispari. La complicazione ora è necessario per visualizzare il nastro in ordine sequenziale , poiché il file stesso è ora confuso. Questa è una modifica legittima da apportare, credo. Turing stesso si è semplificato in questo modo.

#include<stdio.h>
int main(int c, char**v){
    int min=0,max=0;
    int pos=0,qi;sscanf(v[1],"%d",&qi);
    FILE*tab=fopen(v[2],"r");
    FILE*tape=fopen(v[3],"r+");
    setbuf(tape,NULL);
    do {
        min = pos<min? pos: min;
        max = pos>max? pos: max;
        fseek(tape,(long)(abs(pos)*2)-(pos<0),SEEK_SET);
        int c = fgetc(tape), qt=qi-1,qr;
        fseek(tape,(long)(abs(pos)*2)-(pos<0),SEEK_SET);
        char x = c==EOF?' ':c, xt=x-1,xr,d[2];
        if (x == '\n') x = ' ';
printf("%d '%c' %d (%d)\n", qi, x, pos, (int)ftell(tape));
        while((qt!=qi)||(xt!=x)){
            fscanf(tab, "%d '%c' %d '%c' %1[LRN]", &qt, &xt, &qr, &xr, d);
            if (feof(tab)){
                goto HALT;
            }
printf("%d '%c' %d '%c' %s\n", qt, xt, qr, xr, d);
        }
        qi=qr;
        rewind(tab);
        fputc(xr,tape);
        pos+=*d=='L'?-1:*d=='R'?1:0;
    } while(1);
HALT:
printf("[%d .. %d]:\n", min, max);
    for (pos = min; pos <= max; pos++){
        fseek(tape,(long)(abs(pos)*2)-(pos<0),SEEK_SET);
        //printf("%d ",pos);
        putchar(fgetc(tape));
        //puts("");
    }
    return qi;
}

Ed ecco il test-run:

522(1)04:33 AM:~ 0> cat bab.tm
0 'a' 0 'b' R
0 'b' 0 'a' R
523(1)04:33 AM:~ 0> echo aaaaa > blank; make tm ; tm 0 bab.tm blank; echo; cat blank
make: `tm' is up to date.
0 'a' 0 (0)
0 'a' 0 'b' R
0 'a' 1 (2)
0 'a' 0 'b' R
0 'a' 2 (4)
0 'a' 0 'b' R
0 ' ' 3 (6)
0 'a' 0 'b' R
0 'b' 0 'a' R
[0 .. 3]:
bbbÿ
babab

Il programma emette il nastro in ordine sequenziale, ma il file rappresenta i lati negativo e positivo interlacciati.


Ci sono problemi con la tua implementazione. Prova questo programma che scambia aeb 0 'a' 0 'b' R; 0 'b' 0 'a' Rcon input aaa l'output è bab anziché bbb. E ci sono problemi a spostarsi a sinistra.
Marco Martinelli,

Grazie per l'attenzione! L'aggiornamento risolve entrambi, credo (spero).
Luser droog

uhm .. sto ancora ricevendo bab
Marco Martinelli il

sì, ma questa volta è corretto! 'aaa' corrisponde alle posizioni [0, -1,1] sul nastro. Ma l'output che dovrebbe mostrare questo ha chiaramente bisogno di lavoro.
Luser droog

1

Groovy 234 228 154 153 149 139 124

n=[:];i=0;t={it.each{n[i++]=it};i=0};e={p,s->a=p[s,n[i]?:' '];if(a){n[i]=a[1];i+=a[2];e(p,a[0])}else n.sort()*.value.join()}

Formattato per leggibilità

n=[:];
i=0;
t={it.each{n[i++]=it};i=0};
e={p,s->
    a=p[s,n[i]?:' '];
    if(a){
        n[i]=a[1];
        i+=a[2];
        e(p,a[0])
    }else n.sort()*.value.join()
}

t è la funzione che imposta il nastro e è la funzione che valuta il programma

Esempio 1 - Stampa "Ciao!" sul nastro :)

t('')
e([[0,' ']:[1,'H',1],
   [1,' ']:[2,'e',1],
   [2,' ']:[3,'l',1],
   [3,' ']:[4,'l',1],
   [4,' ']:[5,'o',1],
   [5,' ']:[6,'!',1]],0)

Esempio 2: lasciare una T sul nastro se la stringa iniziale ha la forma di un n b n , altrimenti interrompere.

t('aaabbb')
e([[0,'a']:[1,' ',1],
   [0,' ']:[4,' ',1],
   [1,'a']:[1,'a',1],
   [1,'b']:[1,'b',1],
   [1,' ']:[2,' ',-1],
   [2,'b']:[3,' ',-1],
   [2,'a']:[5,'a',-1],
   [3,'b']:[3,'b',-1],
   [3,'a']:[3,'a',-1],
   [3,' ']:[0,' ',1],
   [4,' ']:[5,'T',1]],0)

Esempio 3 - Incremento di un numero binario

t('101')
e([[0,'0']:[0,'0',1],
   [0,'1']:[0,'1',1],
   [0,' ']:[1,' ',-1],
   [1,'0']:[2,'1',1],
   [1,'1']:[3,'0',-1],
   [3,'0']:[2,'1',1],
   [3,' ']:[2,'1',1],
   [3,'1']:[3,'0',-1]],0)

negli esempi 1 significa spostarsi a destra e -1 significa spostarsi a sinistra

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.