Este desafio é um prêmio para ais523 por vencer a categoria " Novato do ano " em " Melhores do PPCG 2016 ". Parabéns!
O BackFlip é uma linguagem de programação esotérica criada pelo usuário ais523 , que criou mais de 30 outros esolangs interessantes .
O BackFlip é uma linguagem 2D como o Befunge ou > <>, onde o ponteiro da instrução percorre uma grade de texto (o programa), movendo-se para cima, para baixo, para a esquerda e para a direita, mudando de direção dependendo do caractere em que está. Criticamente, a grade em um programa BackFlip muda à medida que ela é atravessada, um pouco como a Ant de Langton .
Para esse desafio, você pode assumir que um programa BackFlip é sempre uma grade retangular de texto (todas as linhas do mesmo comprimento), tamanho 1 × 1 no mínimo, contendo apenas os caracteres ./\<>^V
. ( .
é usado para mais visibilidade do que espaço). Semanticamente, o BackFlip que usaremos aqui é idêntico à especificação original .
O ponteiro de instrução (IP) no BackFlip sempre inicia logo à esquerda do canto superior esquerdo do programa, indo para a direita. Existem três tipos de comandos que podem ser encontrados:
.
é um não-op. O IP continua na direção em que estava indo. O no-op permanece no-op./
e\
são espelhos. Eles refletem o IP na direção indicada pelo ângulo e depois mudam para o outro tipo de espelho .- Por exemplo, se o IP for deixado em a
\
, ele começará a se mover para cima em vez de para a esquerda e\
se tornará a/
.
- Por exemplo, se o IP for deixado em a
<
,>
,^
, EV
são setas. Eles redirecionam o IP para a direção em que apontam e depois mudam para uma seta que aponta na direção em que o IP veio (oposto à direção em que o IP estava se movendo) .- Por exemplo, se o IP for direcionado para baixo
>
, ele começa a se mover para a direita em vez de para baixo e>
torna-se um^
porque é essa a direção da qual o IP veio.
- Por exemplo, se o IP for direcionado para baixo
Um programa BackFlip termina quando o IP sai dos limites, ou seja, sai da grade. Acontece tudo programas BackFlip eventualmente terminam porque loops infinitos são impossíveis. (Você pode assumir que isso é verdade.)
Seu objetivo neste desafio é escrever um programa ou função que receba um programa BackFlip e produza o número de movimentos que o ponteiro de instruções realiza antes que o programa termine. Ou seja, quantas etapas o IP executa no decorrer da execução de um programa? Isso inclui a etapa inicial na grade e a etapa final dela.
Por exemplo, o ponteiro de instruções executa 5 etapas na grade trivial ....
:
.... <- empty 4×1 grid
012345 <- step number of the IP
Então a saída para ....
é 5
.
Na grade 4 × 2 mais complexa
\...
\.><
o IP sai da grade na sua 9a etapa, portanto a saída é 9
:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
O código mais curto em bytes vence.
Você pode receber a entrada como uma matriz de linhas ou matriz de caracteres, em vez de uma sequência de múltiplas linhas, se desejar, mas você deve usar os caracteres ./\<>^V
(não os códigos de operação inteiros). Você pode usar espaço em vez de.
se preferir. Tudo bem se personagens como\
precisam ser escapados na entrada. A saída é sempre um número inteiro mais de um.
Casos de teste
....
5
\...
\.><
9
.
2
..
3
.
.
2
\
2
^
2
.^.
3
<.
2
\\
\/
7
>V
^<
6
>\
>/
6
\><
2
\><
\><
7
\><
\><
\><
12
\.V.
\.\<
5
\.V.
\./<
9
V./\
V./\
>./<
..\/
14
\V..
.^..
\/><
.V..
.^..
20
\.V.V.
\./.\<
.>\<..
..^.^.
31
\.V.V.V.
\./>/.\<
.>\>\<..
..^.^.^.
69
\.V.V.V.V.
\./>/>/.\<
.>\>\>\<..
..^.^.^.^.
145
\.V.V.V.V.V.V.V.V.V.V.
\./>/>/>/>/>/>/>/>/.\<
.>\>\>\>\>\>\>\>\>\<..
..^.^.^.^.^.^.^.^.^.^.
9721
fonte
/
fará o IP subir e subir para/
a direita fará a direita, como se fosse uma bola quicando na parede. (Mas lembre-se as/
alterações à barra invertida após o IP toca.)Respostas:
JavaScript (ES6), 158 bytes
Desenvolvido independentemente da resposta do @ tsh, embora surpreendentemente semelhante.
O mapeamento de direções
^<v>
para números inteiros 0-3 é governado pelo fato de.search('^')
retornar 0, pois^
é um metacaractere de expressão regular.fonte
Haskell ,
333325 bytesEDITAR:
f
tornado sem ponto e mescladob
.b
pega uma lista de seString
retorna umInteger
.Experimente online!
Como funciona
C a
é um tipo de dados usado porque Haskell não permitirá que um tipo seja recursivo sem declará-lo explicitamente.C
também é um construtor de quebrac
automática e é sua função de desempacotamento correspondente. É usado apenas coma=[Int]
.C [Int]
representa um comando de célula, como uma função que usa um[Int]
argumento direction ( ) e retorna um par de uma nova direção e um novoC [Int]
valor.b
é a função principal. Ele converte cada caractere em umC
valor e chama#
.g
é a grade como uma lista de cadeias.\
precisa ser escapado e, portanto, o caractere mais longo a ser mencionado, seu resultado é usado como o valor padrão para a pesquisa da lista.#
executa a simulação principal, verificando limites&
e gerando novas grades com?
.[y,x]
é a posição atual,d
a direção atual eg
a grade atual.[f,e]
é a próxima direção, en
é um par dela e a próxima grade.l&i
verifica se o índicei
está fora dos limites da listal
. (Ele retornaTrue
para fora dos limites, pois evita uma condição fictícia de guarda#
.)f(l!!i)==(d,x)
,(f?i)l==(d,m)
ondem
é a listal
com oi
th elemento substituído porx
.(?i)
é uma lente mais geral, focada no i-ésimo elemento de uma lista, neste caso, usada com a(,) [Int]
instância do functor.n
é a função que representa um ponto.a v
é uma função que representa uma seta na direçãov
.m s
é uma função que representa um espelho;s==1
para\\
es==-1
para/
.fonte
JavaScript, 172 bytes
Mas não consigo testar o último testcase desde que o estouro de pilha na minha máquina. (deve funcionar se houver uma máquina com ram maior)
Usamos um número para direção:
Seja
d
o número da direção ...Vamos
(x, y)
ser posição actual, a posição seguinte é:x+(t&1&&t-2)
,y+(~t&1&&t-1)
Nota:
A função usa um parâmetro com o seguinte formato:
Teste aqui
fonte
Uncaught RangeError: Maximum call stack size exceeded
com 16 GB de RAM.var
declaração fazê-lo passar o último testcase (js intérprete fazer otimizar chamada de cauda no modo estrito)C,
232221 bytesRecebe entrada no primeiro argumento, imprime resultado. Requer que a entrada contenha pelo menos 1 nova linha (portanto, se houver apenas 1 linha, ela deverá terminar com uma nova linha)
Exemplo de uso:
Demolir:
fonte
Python 3 , 286 bytes
[f () recebe entrada na forma de
{(0,0):'/',(0,1):'.'}
, também escrevi uma função g () para converter uma matriz de linhas para essa forma]Experimente online!
fonte