Crie um programa que determine, com base no caminho, se Mario pode chegar ao fim, indicado por E
, desde o início, indicado por S
.
Um caminho será mais ou menos assim:
S = E
=====
Em um caminho, os vários símbolos e o que eles representam são:
=
: parede / piso / teto. Mario não pode atravessar a parede e não pode cair no chão ou pular no teto (ele batia na cabeça)S
: ar, exceto mostrando onde Mario começa. Isso sempre aparecerá na coluna mais à esquerda da entrada, no nível do solo.E
: ar, exceto mostrando onde Mario quer chegar. Isso sempre aparecerá na coluna mais à direita da entrada, no nível do solo.
A entrada terá espaços em todos os lugares onde Mario possa andar.
Mario só pode seguir em frente; neste exemplo, Mario não pode chegar ao objetivo
S
===
===
E
====
nem ele pode neste
E
==
==
#==
==
==
==
S ==
======
No entanto, ele pode alcançar o espaço indicado por #
(que não aparecerá na entrada), porque ele pode saltar até quatro células de altura; Mario é sobre-humano. Como outro exemplo de sua super-humanidade:
S
=
=
=
=
=
= #
= =
=
=
=
= E
=======
Mario pode chegar ao E
cair a grande distância, sobreviver e caminhar com calma E
. Note que ele não pode alcançar o #
, porque Mario cai diretamente.
Mario pode pular muito alto, mas não muito longe em comparação.
S E
== ==
= =
Mario pode tentar pular a brecha, mas ele falhará e cairá direto. Ele não pode chegar ao fim.
Mario pode alcançar a meta em todos esses exemplos:
E
=
=
=
S=
==
=
= E
S= =
== =
= =
=====
S
=
= E
====
Isso é código de golfe, e o menor número de bytes vence!
fonte
#
, porque Mario cai diretamente". Se eu estiver vendo isso corretamente, ele não cairá direto no#
? Além disso, os saltos são definidos como no máximo 4 espaços acima e no máximo 1 espaço, certo?#
. Quanto à segunda pergunta: eu não sou OP, mas acho que você está certo. (que é o que eu assumi na minha solução)E
não aparece na coluna mais à direita, porque o nível do solo se estende para a direita do resto do mapa.Mario cannot walk through wall , and cannot fall past a floor, or jump past a ceiling
Respostas:
Deslizamento ,
382725 bytesRequer que a entrada seja preenchida em um retângulo, de modo que haja espaços em todas as células que Mario precise atravessar (potencialmente com uma linha principal cheia de espaços). Imprime uma string representando o caminho válido (que inclui
S
,E
e todo o=
pisado, exceto a última) ou nada se não existe caminho.Teste aqui.
Explicação
Slip foi a entrada do Sp3000 nosso desafio de design de linguagem de correspondência de padrões 2D. É um pouco como uma extensão 2D do regex, onde você pode dar instruções ao cursor do mecanismo quando for permitido ou necessário fazer curvas à esquerda ou à direita. Ele também possui um recurso conveniente, onde você pode impedir o avanço do cursor, permitindo combinar uma única posição duas vezes seguidas (com diferentes padrões).
O deslizamento não tem algo comparável às pesquisas em regex, mas como você pode mover-se sobre qualquer posição várias vezes, basta testar a condição e depois retornar. Usamos isso para garantir que só pulemos quando estiver no chão, movendo-nos para o ladrilho do solo após cada etapa.
fonte
Java
234 230 221 216 208 207 205179 BytesOlha, eu venci C e python? Eu consegui a verdadeira transcendência entre os mortais! Piadas à parte, esse foi um desafio divertido. A função a seguir recebe entrada como uma matriz de cadeias de colunas, cada uma com o mesmo comprimento. Se isso for contra as regras, por favor me avise. Ele gera 1, o que significa uma mario run bem-sucedida e qualquer outro valor que implique uma mario run com falha.
Aqui está a lógica mais antiga (que é semelhante à versão atual) com exemplo de uso e saída. Além de alguns comentários explicando a lógica
fonte
Python,
260239222215209206 Bytes,experimente em ideone (com casos de teste)
ligue como:
f([' S=', ' E='])
notas do patch:
Agora, como algumas das outras soluções, assume que a entrada é uma matriz de seqüências de caracteres de cores, cada uma começando com um ""
Wrapper para formulário de entrada antigo:
g=lambda x:f(map("".join,zip(*([" "*x.index("\n")]+x.split("\n")))))
Corrigi também um bug em que Mario podia pular através de blocos acima dele.
versão não destruída com explicações:
f
chama-se recursivamente em todas as direções para as quais Mario pode se movery,x
. Ele retornaTrue
quando atinge o"E"nd
, que depois volta por todas as chamadas de função atég
finalmente retornarTrue
.fonte
else
antes da finalreturn
?Caracóis ,
413729 bytesAgradecemos ao feersum por alguma ajuda para evitar caminhos sobrepostos e para salvar 4 bytes.
Requer que a entrada seja preenchida em um retângulo, de modo que haja espaços em todas as células que Mario precise percorrer (potencialmente com uma linha principal cheia de espaços).
Experimente online!
Explicação
Snails foi a entrada do feersum para o nosso desafio de design de linguagem de correspondência de padrões 2D. Como o Slip, também é semelhante ao regex, mas a principal diferença é que: a) este suporta asserções (lookarounds) eb), além dessas, não é possível atravessar nenhuma célula na grade duas vezes. Isso torna esse problema um pouco complicado, pois há casos em que Mario precisa cair em um buraco e pular de volta, por exemplo:
Além dessas diferenças, a sintaxe dos dois idiomas também difere bastante.
Para contornar o problema de que não podemos atravessar uma célula duas vezes, sempre alternamos uma etapa horizontal com uma vertical. No entanto, isso significa que precisamos lidar com uma queda antes de passarmos pela borda. Então, tecnicamente, as quedas passam por ladrilhos no solo, mas garantiremos que elas ocorram apenas ao lado do espaço aberto.
fonte
C,
256236213197 bytes20 bytes salvos por "Isso sempre aparecerá na coluna mais à esquerda da entrada"
23 bytes salvos graças ao sistema baseado em colunas de @ RohanJhunjhunwala
Experimente em ideone, com casos de teste ...
Uso:
Ungolfed com explicação:
fonte
PHP,
399338284265251 bytesespera entrada como argumento da linha de comando com quebras de linha no estilo unix e espaços à direita em cada linha, retorna o código de saída
1
para obter sucesso,0
para falhaavaria para funcionar
testes (na função m)
fonte
Ruby,
153147 bytesDesculpe, Java ... seu lugar como o melhor idioma não-golfe para o trabalho está sendo assumido!
Input é uma lista de cadeias de colunas, precedida por um único espaço no estilo de como as soluções Slip and Snails exigem que suas entradas sejam preenchidas com um retângulo de espaço vazio.
Experimente online!
fonte
Grime, 46 bytes (não concorrente)
Atualizei o Grime várias vezes depois que este desafio foi lançado, portanto, esta resposta não é elegível para ganhar. Algumas das mudanças são tão novas que não consegui inseri-las no TIO, mas, uma vez que você faça isso, você pode experimentar o programa . De qualquer forma, meu repositório contém uma versão que manipula esse código corretamente.
O programa imprime
1
se Mario pode alcançar a meta e0
se não. A entrada deve conter espaços em todos os lugares que Mario precisa visitar. Para entradas gerais, tenho a seguinte solução de 57 bytes :Explicação
A explicação de alto nível é que o não-terminal
A
, definido na primeira linha, corresponde a um sub-retângulo 1 × 1 da entrada, onde Mario pode alcançar a meta.A
é definido como literalE
(Mario já está no objetivo) ou como um padrão 1 × 1 que está na coluna esquerda de um retângulo 2 × n contendo um salto válido de Mario para outra partida deA
coluna direita. A segunda linha conta o número de correspondênciasA
que também contém o caractere inicialS
e imprime isso.Aqui está um detalhamento do código:
A idéia é que a
\ {,-4}
parte da esquerda corresponda ao espaço pelo qual Mario pula para cima, e a\ /*
parte da direita corresponda ao espaço que ele então desce. Exigimos que ele caia em uma partida deA
(já que queremos atingir a meta) que está em cima de uma=
. As pilhas verticais abaixo de ambas as colunas simplesmente garantirão que as colunas tenham a mesma altura, para que possamos concatená-las (que é o que o espaço único no meio). Aqui está um diagrama de arte ASCII de um exemplo de salto, dividido nos retângulos mencionados acima e com espaços substituídos por*
s:Na segunda linha, a opção
n
aciona a contagem de todas as correspondências, em vez de encontrar a primeira correspondência. Na solução geral, os espaços também podem ser caracteres especiais de saída insuficiente, e a opçãob
faz com que a entrada seja preenchida com caracteres fora de entrada.Espero que tudo isso faça sentido!
fonte