Eu amo> <>,> <> é a vida! Os idiomas 2D são incríveis! Neste desafio, você terá que dizer se uma estrada "duvidosa" termina, enquanto pratica golfe.
Definição
Uma estrada de peixe é construída com azulejos, incluindo os seguintes:
v (go down)
> (go right)
^ (go up)
< (go left)
/ (mirror)
\ (mirror)
Qualquer outro personagem (exceto -|+
) pode ser considerado uma distração, como algumas flores (ou cabeças de peixe) na beira da estrada.
Uma estrada sempre começa no canto superior esquerdo de uma grade retangular, delimitada por -|+
símbolos. A estrada tem um fim se, seguindo-a, você acaba em uma borda; caso contrário, você fica preso em um caminho infinito.
Para encontrar o caminho na estrada, siga as instruções dadas por v>^<
e espelhos. Um espelho refletirá 90 °, dependendo de onde você veio. Veja como funciona (usando v>^<
para mostrar instruções):
^ ^
>/< >\<
v v
</> <\>
^ ^
Uma estrada pode ficar assim se terminar:
+--------------------+
|>\/ this way >\/> | this one ends here
| v^ \/ |
| v^ ^.^ |
| \/\ >v |
| /\/ ^< |
+--------------------+
Um loop infinito:
+--------+
|>>\ This|
|\\ is |
| \\ a |
| \ /trap|
+--------+
Específicos
Uma estrada não consiste necessariamente apenas em instruções. Espaços ou letras podem ser usados para completá-lo. Isso significa que você deve continuar se movendo na mesma direção, exceto se você cruzar um personagem <v^>-|
.
Sempre haverá um v>^<
no canto superior esquerdo <
ou ^
implica que esta estrada termina.
Você pode enviar uma função usando uma string como parâmetro ou um programa independente usando STDIN / qualquer que seja a alternativa mais próxima no seu idioma.
Sua submissão deve retornar ou imprimir valores STDUT verdade / falsidade quando terminar. Valores reais que significam que a estrada tem um fim, enquanto falsidade significa que é um loop infinito.
Casos de teste
+--------------------+
|>\/ this way >\/> | this one ends here
| v^ \/ |
| v^ ^.^ |
| \/\ >v |
| /\/ ><> ^< |
+--------------------+
True
+--------+
|>>\ This|
|\\ is |
| \\ a |
| \ /trap|
+--------+
False
+--+
|<v|
|^<|
+--+
True
+--+
|>v|
|^<|
+--+
False
+----------+
|v Hello \ |
|\\/\/ / |
| \/\\ \ |
|/ // >\ |
| ^/\>\\/ |
|\ /\/\/ |
+----------+
False
+-----+
|>\/\\|
|//\\/|
|\/\\\|
|//\//|
|\/\/ |
+-----+
True
2 test cases added as suggested by @MartinBüttner
+----+
|v |
|\\ |
|//\ |
|\\v |
| \/ |
+----+
False
+----+
|v |
|\\ |
|//\ |
|\\^ |
| \/ |
+----+
False
Test case inspired by @ETHproductions
+-------------------------+
|><> |
|something smells fishy...|
+-------------------------+
False
As brechas padrão são proibidas (como sempre).
O vencedor será aquele com o menor código em bytes. (seria incrível ver uma resposta> <> :))
fonte
Respostas:
JavaScript, ES6,
177161145 bytesPodemos detectar um ciclo percorrendo o caminho e detectando uma repetição da tupla
Ou seja, se estamos entrando em alguma posição
(x,y)
vinda de alguma direçãoD
pela segunda vez, sabemos que esse ciclo se repetirá para sempre. Portanto, o código controla todos os locais visitados e de que direção e verifica esse registro sempre que um novo espaço é visitado.As direções para cima, baixo, esquerda e direita são atribuídos os números
1
,2
,3
, e4
. O código considera o símbolo atual sendo visitado (s[i+L]
) e altera a direção atual (D
); a nova direção é usada para chamar recursivamente a função e avaliar o próximo espaço.5
como uma direção indica uma parede e umtrue
término do programa.Aqui está uma explicação do código com menos golfe:
A sequência do modelo
`431255${5-D+'X3412'[D]}`
possui uma expressão aninhada que lida com os espelhos: como as direções são números, elas também podem ser usadas como índices. A expressão é'X3412'[D]
avaliada para o 8º caractere na sequência de direção possível e, portanto, corresponde ao\
8º caractere na sequência de símbolos'><^v-|/\\'
). A expressão diz:D
estiver1
(para cima), a nova direção ao bater no\
espelho será3
(à esquerda)D
for2
(para baixo), a nova direção ao bater no\
espelho será4
(à direita)O outro espelho
/
usaria a expressão'X4321'[D]
, mas como isso é simplesmente uma contagem regressiva ordenada4
, podemos expressá-la mais simplesmente como5-D
.fonte
Não conformidade> <> resposta
Você queria> <>, eu te dou> <>!
Acredito que a única maneira sensata de fazer isso em> <> é copiando a entrada no espaço de código e deixando o intérprete decidir por si mesmo se a entrada leva a algum lugar. Como> <> não implementa mais a segmentação, isso nos deixa com um grande problema: se a entrada tiver um loop, ficaremos presos a ele.
Como essas considerações foram levadas em consideração, decidi tornar uma solução compatível com o intérprete on-line, para que fosse possível afirmar se o intérprete está preso na entrada ou apenas com idades para fazer tudo. Eu também tive que adicionar linhas finais ao código para que o intérprete online mostre o código adicionado e não falhe ao tentar gravá-lo.
Ah, e como estou claramente desqualificado até agora, não me preocupei em jogar o código no golfe.
Sem mais delongas, o código em toda a sua glória:
Para usá-lo, copie-o no intérprete on-line, adicione linhas finais suficientes para manipular sua entrada, envie o código, insira-a
comoe aproveite o passeio.;
linhas separadasAlguns testes:
fonte