Introdução
Jonny quer jogar Frogger. No entanto, ele não é muito bom. De fato, ele apenas tentará seguir em frente, e somente depois que as plataformas forem movidas.
Descubra se o sapo de Jonny consegue chegar ao fim do caminho ou se ele morre a caminho.
Desafio
O programa receberá como entrada uma grade Frogger composta por 0
s e 1
s, com o seguinte formato:
- A grade terá largura e comprimento aleatórios e pelo menos 3x3
1
representa plataformas0
representa águaF
representa a posição inicial do sapo- Cada primeira e última linha da grade será composta por apenas
1
s e não se moverá, e o sapoF
será colocado aleatoriamente na última linha - Cada camada intermediária estará sempre em movimento e terá um
<
ou>
no final de cada linha indicando se ela se move para a esquerda ou direita
É permitido substituir esses símbolos pelos seus, desde que sejam todos distintos e você especifique as substituições na sua resposta.
A entrada pode estar em qualquer formato compatível (string com quebras de linha, array de strings, array de caracteres, ...).
Regras do Desafio
- A cada turno, todas as plataformas se moverão um quadrado, com base na direção indicada pelo sinal
<
ou>
- As plataformas reaparecem no outro lado da grade se forem empurradas para fora da "tela"
- Se o sapo estiver em uma plataforma móvel, ele se moverá junto com ele
- Depois disso, o sapo pulará um quadrado em direção à linha superior. O sapo se move a cada turno.
- O sapo morre se pular na água (
0
) ou tocar o lado da grade junto com uma plataforma em movimento
Seu programa precisa gerar um valor verdadeiro se o sapo sobreviver e um valor falso caso contrário.
Isso é código-golfe , então a resposta mais curta em bytes vence. Aplicam-se brechas padrão.
Exemplos
Exemplo 1
Entrada
11111
00111>
00101<
1F111
Resultado
1
Execução
Turno 1:
11111
10011
01010
1F111
11111
10011
0F010
11111
Turno 2:
11111
11001
F0100
11111
11111
F1001
10100
11111
Turno 3:
11111
1F100
01001
11111
1F111
11100
01001
11111
Exemplo 2
Entrada
11111
00100<
00100<
1F111
Resultado
0
Execução
Turno 1:
11111
01000
01000
1F111
11111
01000
0F000
11111
Turno 2:
11111
10000
F0000
11111
11111
F0000
10000
11111
Turno 3:
11111
00001
00001
11111
fonte
<
ou>
então podemos usar matrizes retangulares como entrada? A propósito, bom desafio!<
ou>
no final.0
na frente, ou vai esperar o próximo1
? Se puder esperar, seguirá adiante em todos1
, ou poderá esperar de maneira inteligente?11111 00001< 00011< 11F11
Ou seja, com o caso de teste , será falsey porque pula na água ( pasta de passos ); será falsey porque se move fora do quadro ( pasta de passos ); ou será verdade porque aguarda com inteligência a segunda plataforma antes de pular para a frente ( pasta de passos )?0
.Respostas:
Python 2 ,
168165152145 145137129 bytesExperimente online!
Formato de entrada é uma lista de strings; caracteres com significados, conforme indicado na declaração do problema.
Explicação:
i
é o número do turno (começando no turno 1);x
é a posição do sapo no início desse turno.A linha em que o sapo está prestes a pisar é a corda
l
(observe que, por meio da fatia, elas são colocadas de baixo para cima).d=('<'in l)%-2|1
produz-1
ou1
depende da direção em que a linha está se movendo.Como esta é a
i
quinta volta, essa linha terá mudado de sua posição original pori
bytes; e assim, o personagem no qual o sapo está prestes a pular él[(x-d*i)%L]
ondeL
está a largura da linha; portanto, queremos que ele seja igual a'1'
; ou seja,>'0'
.Além disso, queremos verificar se o sapo não será desviado da borda no início do próximo turno; essa é a função da expressão
-1<x+d<L
.Essas condições são encadeadas (já que
'0'>-1
é sempreTrue
); e, a qualquer momento, a expressão resultante for falsa,k
se tornará (e permanecerá)0
.De qualquer forma, atualizamos a posição do sapo
x+=d
e aumentamos o número da linha; ensaboar, enxaguar, repetir.fonte
Python 2 ,
246245244242 bytes-3 byte graças ao Sr. Xcoder
-1 byte graças a Jonathan Frech
Experimente online!
Explicação
d
é a direção em que cada camada se moveráq
é o personagem que será envolvido[q,' '][q<'L']
vai deixar o sapo fora da telasum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]
removerá o último caractere (a direção), depois remova o primeiro caractere e o anexará ou removerá o segundo último e o anexará (com base emd
) e anexará a direção de volta, movendo efetivamente toda a linha para a esquerda / direita.if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j])
vai fazer o sapo pular pra frentemin('F',m[i-1][j])
vai fazer o sapo cair na águamin
e<
) segue a ordem' ' < '0' < '1' < 'F' < 'L'
A entrada será uma lista de caracteres:
' '
- água'F'
- sapo'L'
- plataforma'0'
- mova a camada para a esquerda'1'
- mova a camada para a direitafonte
if i<len(m)-1
poderia serif~-len(m)>i
.Java 8,
293277 bytesUsa os caracteres padrão, conforme especificado na descrição do desafio (
01F<>
).Experimente online.
Explicação:
fonte