Você está em uma estação espacial intergaláctica avançada. Um amigo seu, que é menor no Study of Gravity, acabou de criar um jogo que envolve o uso da microgravidade como uma maneira de movimentar uma bola.
Ela entrega um pequeno controle com quatro setas direcionais e um labirinto com uma bola à esquerda. Ela começa a explicar como o jogo funciona.
- Você tem 2 botões direcionais, esquerdo
<
e direito>
. - Você também tem 2 botões de gravidade, para cima
^
e para baixov
(pelo menos a partir do seu quadro de referência) - Você usará esses botões de seta para mover a bola na tela.
"Agora, existem algumas regras que precisam ser seguidas." ela diz
- Todas as plataformas devem ser atravessadas antes de chegar ao copo
\ /
- As setas
< > ^ v
serão usadas para especificar o movimento da bola - A gravidade é
^ v
(para cima e para baixo). Isso move a bola até a próxima plataforma nessa direção. (A distância não é calculada para cima e para baixo) - Perder a bola é ruim! Não caia sobre a borda e não mude a gravidade tão cedo que sua bola nunca chega a uma plataforma
- O movimento é contado em etapas de
< >
- A bola pode entrar no copo de qualquer direção, desde que a Regra 1 seja seguida
- Você deve especificar a direção da gravidade para que sua bola não flutue
- O movimento pode ser aleatório, desde que sejam seguidas as Regras 1 e 4
- Para casos que não podem ser resolvidos, imprima Falso ou Inválido
Exemplo simples de bola, plataforma e copo:
v
o
---\ /
v>
o
---\ /
v>>
o
---\ /
v>>>
o
---\ /
v>>>>
---\o/
Exemplo de atravessar a mesma plataforma novamente.
v
o
----
\ /-------
v>
o
----
\ /-------
v>>
o
----
\ /-------
v>>>
o
----
\ /-------
v>>>>
----
o
\ /-------
v>>>>>
----
o
\ /-------
v>>>>>>
----
o
\ /-------
v>>>>>>>
----
o
\ /-------
v>>>>>>>>
----
o
\ /-------
v>>>>>>>><<<<<<<< # move all the way to the left to get to the cup
----
\o/-------
Exemplo de mudança de gravidade
v
--/ \
o
----
v>
--/ \
o
----
v>>
--/ \
o
----
v>>>
--/ \
o
----
v>>>^
--/ \
o
----
v>>>^>
--/ \
o
----
v>>>^>>
--/ \
o
----
v>>>^>>>
--/o\
----
Tarefa
Sua tarefa é criar um programa que terá como representação uma representação ASCII de um curso. E saída de uma série de setas <>^v
que representam a direção ea força gravitacional para mover uma bola o
em todos platforms
em um copo.
Aplicam-se regras de golfe de código padrão
Casos de teste
Entrada (uma situação em que a gravidade está sendo alterada)
---- --/ \
--- --
o
------ -----
Saída
^>>v>>>>>^>>>>>v>>>>^>>>
Entrada (uma situação em que a direção está sendo alterada)
---
o
----
---
-----
--\ /
Saída
v>>>>>>^>>>v<<<<<v>>>
Entrada (uma situação em que você precisa atravessar a mesma plataforma duas vezes)
o
------
------
------
\ /------
Saída
v>>>>>><<<<<<>>>>>>><<<<<<
Casos ruins, o programa deve gerar Falsy para esses
Não há como a bola chegar à próxima plataforma
o
--- ---
A bola flutuaria para o espaço
---
o
---
Uma situação em que a bola chega ao copo, mas todas as plataformas não são atravessadas.
o
----
----
\ /----
fonte
Respostas:
Pitão, 431 bytes
Este é o meu primeiro programa Pyth (na verdade, este é o meu primeiro programa em qualquer linguagem de código-golfe), o que significa que provavelmente ainda pode ser aprimorado.
Experimente aqui (o último caso de teste precisa de muito tempo, deve ser testado com uma instalação local do Pyth).
Despejo hexadecimal do código (use
xxd -r <filename>
para decodificar):Explicação
A idéia principal desse programa era usar expressões regulares para modificar a entrada. Para economizar espaço, todas essas expressões regulares estão contidas em uma sequência compactada. A primeira etapa do programa é descompactar a string e dividi-la na expressão regular única e nas strings de substituição correspondentes.
O conteúdo da variável
J
é então:A função
r
aplica substituições de expressões regulares da lista armazenada noJ
índiceG
a todas as seqüências de caracteres na listaH
. Ele retorna assim que qualquer uma das cadeias de caracteres foi alterada.A função
i
é semelhante à funçãor
com 2 diferenças. Aplica as substituições em uma lista transposta (vertical em vez de horizontal). Também realiza as substituições repetidamente, desde que alguma coisa seja alterada.A função
g
verifica se o regex da lista armazenada noJ
índiceG
pode ser encontrado em qualquer sequência da listaH
.O restante do código contém a lógica real do programa. Ele realiza uma pesquisa abrangente dos possíveis movimentos até encontrar uma solução. A posição na árvore de pesquisa é definida exclusivamente pela direção da gravidade e uma cópia modificada da entrada do programa. Para evitar o processamento da mesma posição repetidamente, as posições processadas são armazenadas na lista global
K
. As posições que ainda precisam ser processadas são armazenadas junto com a parte correspondente da solução na listaY
.A modificação da entrada e inicialização de
K
eY
é realizada pelo seguinte código:A modificação de entrada faz algo como o seguinte. A entrada:
é transformado em:
Os valores têm o seguinte significado:
-
Plataforma que ainda deve ser visitada=
Plataforma que não precisa mais ser visitadaM
Copo que pode ser inserido com a gravidade ajustada em "para baixo"W
Copo que pode ser inserido com a gravidade ajustada para "up"V
É seguro mover-se para este local com a gravidade definida como "para baixo"A
É seguro mover-se para este local com a gravidade definida como "up"X
É seguro mover-se para este local, independentemente da configuração da gravidade6
Bola em um local que seria marcado comoV
9
Bola em um local que seria marcado comoA
0
Bola em um local que seria marcado comoX
A lógica está usando expressões regulares para executar os movimentos. No exemplo acima, se a gravidade for configurada para "up", podemos substituir "9A" por "A9" por um regex para mover a bola para a direita. Isso significa que, ao tentar aplicar a regex, podemos encontrar todos os movimentos possíveis.
A função
X
executa movimentos da bola verticais com base na definição de gravidade atual, armazena o resultado em listas globaisK
eY
, e verifica se uma solução foi encontrada.A função
(
implementa verificações nos 4 botões direcionais / de gravidade. Os botões de gravidade podem ser pressionados apenas se a gravidade atual mudar e se a bola estiver em um local seguro para alterar a gravidade. Os botões direcionais podem ser pressionados apenas se for seguro mover para o local correspondente.Finalmente, o loop principal. O primeiro elemento de
Y
é removido repetidamente e são realizadas verificações de todos os movimentos possíveis.fonte
Y
lista estará vazia, o pop lançará um erro e o#
loop terminará.