Escreva um simulador de máquina de Turing .
Para simplificar, podemos assumir status como inteiro, símbolos como char, símbolo em branco igual a espaço em branco
5 tuplas na forma de estado atual, símbolo de entrada, próximo estado, símbolo de saída, direção (esquerda ou direita), a ordem não é obrigatória, mas especifique se você a troca
A máquina deve parar quando um estado desconhecido é atingido, nenhuma outra condição de parada é permitida.
A fita é infinita nas duas direções e você sempre pode ler um caractere vazio.
Entrada: a fita inicial, um estado inicial e um programa. você pode ler os dados de qualquer lugar no formato que quiser
Saída: a fita após a execução do programa
Necessário: um programa de exemplo executado em cima do seu simulador
Este é um código-colf, portanto, o código mais curto vence.
Vou postar uma implementação e alguns programas de exemplo nas próximas horas.
fonte
Respostas:
GolfScript, 92 caracteres
A máquina de Turing no GolfScript ficou muito mais longa do que o pretendido. Ainda brincando com diferentes representações da fita.
A primeira linha da entrada é o estado original, a segunda linha a fita inicial, seguida por uma matriz de transições (com estado atual da ordem, símbolo de entrada, próximo estado, direção, símbolo de saída).
Exemplo (também disponível online )
fonte
GNU sed com
-r
-13311711193 caracteresSim, o sed está completo. O GNU sed e
-r
(regexps estendidos) serve apenas para salvar alguns caracteres; é apenas uma pequena alteração para trabalhar com o POSIX sed.O formato de entrada é
Os delimitadores
@
,#
e caráter cabeça>
não pode ser usado como um símbolo na fita. Os rótulos de estado não podem conter@
>
ou#
.Ele executará todos os programas na entrada, um por linha
Exemplos:
Marco é um n b n programa
Olá do Marco! programa
fonte
Estou um pouco atrasado, mas pensei em deixar isso aqui ...
Máquina de Turing Simulando uma máquina de Turing: 370 bytes?
Aqui estou usando a estrutura que Turing usou em seu artigo de 1936. Estou usando um símbolo = um byte, incluindo m-configs e operações.
Aqui está um dos exemplos de Turing do artigo acima para minha máquina:
Experimente online! (Usa o Python 3 como intérprete) --Edit: Acabei de verificar o TIO, e ele parece não funcionar direito ... Experimente na sua máquina local e deve (espero) funcionar. Faz no meu.
fonte
APL (110)
(Não é tão curto assim ...)
Ele lê duas linhas do teclado: a primeira é o programa e a segunda é a fita inicial.
O formato é
e todos eles devem estar na mesma linha. 'Movimento' é 0 para mover para a direita e 1 para mover para a esquerda.
Exemplo de programa (quebras de linha inseridas para maior clareza, elas devem estar todas em uma linha).
O programa adiciona dois números unários, por exemplo:
Exemplo 2 (adaptado do programa de incremento binário da entrada de Marco Martinelli):
fonte
Python,
101189152142 142b e p são as entradas, b é a fita inicial, p codifica as regras como (representação de sequência de) um ditado de tupla (no estado, em fita) para tupla (fora do estado, movimento da cabeça, fita fora) . Se o movimento for 0, o programa termina, 1 é o movimento para a direita e -1 é o movimento para a esquerda.
Este programa de amostra testa se a última letra da string (antes da fita vazia) é 'a'; nesse caso, ele grava 'Y' no final da string (primeiro espaço vazio).
Editar 1:
A fita foi alterada para ser representada como um ditado, pois parecia a maneira mais curta de gravar uma estrutura de dados extensível. A penúltima linha está principalmente transformando-a novamente em forma legível para saída.
Edição 2:
Obrigado ao Strigoides por muitas melhorias.
Edição 3:
Eu tinha feito desnecessariamente 0, pois a saída deixaria o local como está. Eu removi isso, pois sempre podemos escrever a saída da mesma forma que a entrada.
fonte
r=0;s=0
pode se tornarr=s=0
(e o ponto-e-vírgula no final dessa linha é desnecessário), você pode remover a funçãow
, pois não é usada, os colchetes podem ser removidos(s,m,t)=r[s,c]
, o blocotry
/except
pode ser reduzido using dict.get;c=a.get(i,' ')
, comom
0 ou 1, você pode usarif m-1:
e reduzir a suamap()
chamada convertendo-a em uma lista de compreensão.Postscript
(205)(156)(150)(135)Provavelmente, isso é trapaça, mas a tabela de transição contém código para realizar as transições. E como a fita é representada por um mapeamento de números inteiros para números inteiros, eu representei estados como um mapeamento de nomes para dicionários, para que a fita e o programa coexistam no mesmo dicionário anônimo.
Economias extras, tornando todos os nomes de estados executáveis, para que eles sejam carregados automaticamente .
Sem jogar com o programa "Hello" incorporado.
52 caracteres extras compram um loop para ler a fita de stdin.Corra comgsnd -q tm.ps
.Portanto, o formato da tabela é
onde
in-state
é um nomein-tape
eout-tape
são caracteres (inteiros ou expressões que produzem números inteiros)movement
é-1
para esquerda ou1
para direita eout-state
é um nome executável . Ain-tape
transição múltipla para o mesmo estado deve ser combinada como acima.fonte
currentdict{search-for-min-and-max}forall juggle-params-for-for
. :(0 1 0 not{(%stdin)(r)file read not{exit}if def}for
. Não sei por que pensei que poderia me safar omitindo isso da versão do golfe. : P0 not
deveria ser16#7fffffff
. Desculpe. Aha! por isso foi comentado! Ele saiu direto do notebook, não foi testado e eu cortei todos os comentários sem olhar quando o joguei. Não conte ao cara do Python! : PC (ainda não jogou golfe)
Suponho que não posso ganhar com isso, ainda assim foi divertido fazê-lo funcionar. Isto é ainda mais verdade agora que ele realmente faz o trabalho. :)
Exceto que é apenas infinito em uma direção. Suponho que também precise de uma fita negativa. Suspiro....
Negativo não foi tão ruim. Entrelaçamos os dois lados como pares e probabilidades. Agora a complicação precisa exibir a fita em ordem seqüencial , pois o arquivo em si agora está confuso. Esta é uma alteração legítima a ser feita, eu acho. Turing se simplificou dessa maneira.
E aqui está o teste:
O programa gera a fita em ordem sequencial, mas o arquivo representa os lados negativo e positivo intercalados.
fonte
0 'a' 0 'b' R; 0 'b' 0 'a' R
pela entrada aaa, a saída é bab em vez de bbb. E há problemas se movendo para a esquerda.Groovy
234228154153149139124Formatado para facilitar a leitura
t é a função que define a fita e é a função que avalia o programa
Exemplo 1 - Imprimir "Olá!" na fita :)
Exemplo 2 - Deixar um T na fita, se a cadeia inicial é na forma de um n b n , parada de outro modo.
Exemplo 3 - Incremento de um número binário
nos exemplos 1 significa mover para a direita e -1 significa mover para a esquerda
fonte