Vamos definir uma linguagem simples 2D, o que nós vamos dar o nome incrivelmente originais befinge . Befinge tem 5 instruções:
<>^v
, como na maioria dos idiomas 2D, redirecione o ponteiro de instruções nas respectivas direções..
é um não-op.
O ponteiro de instruções começa no canto superior esquerdo, indo para a direita. Se o ponteiro de instruções chegar a uma borda, o programa será interrompido. Todo programa Befinge obviamente irá parar ou entrar em um loop infinito que não faz nada. Aqui estão dois exemplos:
Parada:
>.v
..<
Não-parada:
>....v
..v..<
..>v..
^..<..
O problema da parada não é solucionável para uma linguagem completa de Turing, mas é para esta. Sua tarefa é escrever um programa (ou função) que toma como entrada uma string representando o befinge programa e retorna um valor truthy ou Falsey dependendo se ele pára ou não.
- Você pode assumir que a entrada consistirá apenas desses caracteres e será preenchida com espaços para formar um retângulo.
- Você pode usar qualquer conjunto de cinco caracteres para as instruções (por exemplo
adws
).
Casos de teste
Parada:
.
v>
>^
....v....
....>...v
.^..<....
.......v<
.......v.
....^..<.
v<>v>v^
>v^>^>v
<>>^v<v
v^<>v^<
Não-parada:
>..v
^..<
>v<
v<.
>v.
v<.
>.^
>.>.>.v
.><.<.<
Isso é código-golfe , então o programa mais curto (em bytes) vence.
fonte
>..>.
ou><
.Respostas:
ES6 (JavaScript),
111, 101 bytesEDIT: alterou os valores de saída para true e false , em vez de Y e N , para reduzir mais 10 bytes
Golfe
Teste
Saída de amostra
fonte
Y
eN
como saída, como no JavaScript , ambos são verdadeiros .Python 2 ,
116105 bytesExperimente online!
O desafio é antigo, mas achei que, como esse é o Python mais curto, eu o publicarei. Entrada é uma lista de cadeias, mas os caracteres usados são incomuns.
Por exemplo, o terceiro exemplo de parada se transforma
['LLLLCLLLL', 'LLLLGLLLC', 'LFLLBLLLL', 'LLLLLLLCB', 'LLLLLLLCL', 'LLLLFLLBL']
. A saída é via código de saída, 0 (êxito) para não parar e 1 (erro) para parar. Todas as dicas ou truques apreciados.fonte
Befunge-98 (PyFunge) ,
217209200 bytesExperimente online!
Um problema de parada precisa de uma solução rápida. Retorna 0 para truthy e 1 para falsey. Coloca a entrada na grade a partir de 1,15 e depois se move para cima, substituindo as setas por zeros. Assim que atingimos o zero, sabemos que ele faz um loop. Qualquer coisa além de> <^ v. e zero é considerado para interromper o programa, que inclui a borda dos espaços que contornamos o programa, colocando-o na grade ligeiramente deslocada.
Uma maneira fácil de eliminar algumas mordidas seria usar números em vez de> <^ v. mas não acho que valha a pena.
fonte
A befinge halting problem needs a befunge solution.
Precisamente. +1Turtlèd , 146 bytes
Este programa tem E / S diferente: por favor, termine cada linha com um espaço, incluindo o último. Turtlèd não gosta de novas linhas, pois usa uma grade para sua segunda dimensão de caracteres.
Experimente online!
0 para loops para sempre, 1 para paradas.
Explicação geral:
Ele grava a entrada na grade e, na verdade, segue o caminho que as setas fazem ao redor da grade, substituindo cada seta por um *, além de salvar a direção no char var. Se encontrar um *, uma flecha que atingiu antes, o programa não será interrompido, portanto, definirá char var para
0
sair do loop. Caso contrário, atingirá o final da grade e sairá do loop. Ele escreverá o char var. Se atingir o final da grade, ele usa a direção armazenada no char var para retornar à grade e define o char var como1
, para paradas. Se o char var era realmente 0, não uma direção, ele não precisa voltar, pois ainda está lá, e o define novamente0
. Ele limpa a grade e depois escreve o char var,1
para paradas, caso contrário0
.fonte
JavaScript (Node.js) , 80 bytes
Experimente online!
JavaScript (Node.js) , 86 bytes
Experimente online!
fonte
JavaScript (ES6),
158127 bytesRecebe a entrada como uma matriz de caracteres bidimensional e retorna
true
para interrupção efalse
para um loop infinito. Funciona definindo caracteres de direção visitados como~
como s, medida que os percorre recursivamente. Editar: Salva 31 bytes, atualizando meu vetor de direção antes de recursar.O abuso dos caracteres de instrução (
1=^ 4=< 5=. 6=> 9=v
) me reduz a 101 bytes:fonte
f=
na contagem de bytes, mas não o código ...SmileBASIC,
158145 bytesSe a mesma seta for encontrada mais de uma vez, o programa nunca será interrompido. Quando o ponteiro da instrução passa uma seta, ele é substituído por um símbolo diferente, que fará com que a função retorne 0 se for alcançada novamente. Se o IP sair dos limites, ele retornará 1.
Recebe entrada como uma matriz de seqüências de caracteres.
<any non-digit chracter>
,1
,2
,3
,4
=.
,>
,<
,v
,^
fonte
Python 2, 182 bytes
Toma uma matriz de cadeia de caracteres como entrada. Eu tenho que jogar mais isso, mas por enquanto é hora de me estressar com a eleição.
Ungolfed:
fonte
[-1,1][d=='v'] -> 2*(d>'>')-1
e[-1,1][d=='>'] -> 2*(d>'<')-1
salve um total de 6 bytes.["<>"]
Clojure, 143 bytes
Uma função com 4 argumentos de estado: posição
p
, velocidadev
, índice de etapasi
e tamanho de uma linhas
. Retorna1
se não sairmos dos limites em 10 ^ 9 etapas enil
caso contrário. Na verdade, quantas etapas precisamos verificar para ter certeza(count %)
? Eu acho que é mais do que isso, já que o mesmo NOP pode ser percorrido horizontal e verticalmente.Pode ser chamado assim (usa seqüências de caracteres normais como argumentos,
get
retornanil
quando está fora dos limites):As transições de estado (+1, -1, + s, -s) são codificadas no dicionário
{\> 1\< -1\^(- s)\. v\v s}
.fonte
Python 2/3,
201192 bytesExperimente online!
Dá a resposta correta para
["<>"]
fonte
def f(x):
comx=input()
com 0 diferença de byte, em seguida, remover o avanço adicional (-8 bytes), em seguida, substituirreturn x
comexit(x)
(permitido por consenso meta ), durante mais de 2 bytes. Enfim, ótima solução!Java, 477
Eu sei que isso não está ganhando, n = e provavelmente pode ser mais jogado, mas implementa um método semelhante ao que as outras respostas usam, mas este usa o hashmap para realizar pesquisas. A entrada está usando os símbolos> <^ v e qualquer outra coisa que não seja a do no op. A entrada vem através de argumentos.
GOLFE
UNGOLFED
importar java.util. *;
Explicação em breve!
fonte
String a[]
aString[]a
e omitir o espaço.var
em muitos lugares se usar o Java 10.