Dada a vista lateral de um campo de minigolfe e a força do balanço, determine se a bola entrará no buraco.
Um curso será neste formato:
____ ____ _
__/ \ / U \
__/ \ / \_
\_/
A bola começa diretamente antes do primeiro pedaço de solo à esquerda e segue o contorno do percurso até atingir o buraco (uma maiúscula U
abaixo do nível atual do solo). Se atingir o furo, produza um valor de verdade. A força do swing será a velocidade inicial da bola. A bola se move para o próximo personagem à direita a cada iteração, e a velocidade é alterada dependendo do personagem em que está agora. Se a velocidade atingir 0
ou menos antes do furo, produza um valor de falsey.
_
diminui a velocidade em1
/
diminui a velocidade em5
\
aumenta a velocidade em4
Os cursos podem opcionalmente ser preenchidos com espaços. A potência do balanço será sempre um número inteiro positivo.
Você não precisa se preocupar com a bola indo muito rápido para entrar no buraco, rolando para trás ou pulando / saltando de colinas.
Casos de teste
Input: 27
____ ____ _
__/ \ / U \
__/ \ / \_
\_/
Output: true
----------
Input: 26
____ ____ _
__/ \ / U \
__/ \ / \_
\_/
Output: false
----------
Input: 1
U
Output: true
----------
Input: 1
_
U
Output: false
----------
Input: 22
/U
/
/
/
\/
Output: true
----------
Input: 999
_ _
\ /
\ /
\ /
U
Output: true
----------
Input: 5
/
/U
Output: false
----------
Input: 9
/\/\/\/\/U
Output: false
----------
Input: 16
_/\ _
\ __ /\/\/\ /
\ / \ / \ /
\__/ \ / \____________ _/
\_/ U
Output: true
Este é o código mini-golfe, a resposta mais curta em bytes ganha!
fonte
\_/
) com as seguintes etapas: divida em matriz de linhas, gire, aplane, aplique espaços.\/\/\/\/\/
é um curso mais eficiente do que__________
.Respostas:
Pitão, 27 bytes
Demonstração
Esse código faz algo muito inteligente e nem um pouco seguro para o tipo
X
. Confira abaixo.Explicação:
fonte
Q
? Ou seja, o último exemplo pode causar alguns problemas?< ... Q
funciona como uma comparação numérica até o buraco, não uma fatia. Depois do buraco, o que importa é que o resultado seja verdadeiro.Haskell,
111109 bytesExemplo de uso:
Como funciona:
Edit: @ user81655 encontrado 2 bytes para salvar. Obrigado!
fonte
Ruby,
10487 caracteresExemplo de execução:
fonte
Japt, 38 bytes
Try it here!
Batendo CJam!
Explicação
Basicamente, pega a entrada da string, gira 90 graus no sentido horário, retira espaços e novas linhas, remove o orifício e tudo o que se segue e se divide ao longo de caracteres. Em seguida, verifica se a bola chega a zero ou abaixo usando a
every
funçãofonte
%
e>0
pode ser substituída por¬
, uma vez que o sqrt de um número não positivo é sempre falso (0 -> 0
,-1 -> NaN
).CJam,
4039 bytesA entrada tem o poder na primeira linha e o curso começa na segunda linha. A saída é
0
ou1
.Teste aqui.
Explicação
fonte
Retina,
82817774686768 bytesExperimente online
>
s - por exemplo, 4 é>>>>\n
. (isso é legal?)+`(?<=(.)*) (?=.*¶(?<-1>.)*(.))
$2
- achatar o percurso - substituir espaços pelo caractere abaixo deles.Após esta etapa, os dados ficarão assim:
Nós podemos simplesmente ignorar tudo depois do primeiro
U
, não chegaremos lá de qualquer maneira.>
representam um passo que estamos autorizados a dar, ou a energia restante.\
por quatro>
- uma inclinação nos dá energia adicional.>_
ou>>>>>/
até não sobrar mais nada._
s e/
s consomem energia.^>*U
- verifique se podemos alcançarU
com energia positiva (ou sem energia).Isso produzirá
0
ou1
.Outra opção de fechamento com
9179 bytes é:Experimente online
Essa é a mesma abordagem, mas com um grupo de equilíbrio em vez de uma substituição controversa.
Tenho certeza de que ambos podem ser jogados ainda mais, então qualquer um deles pode acabar mais curto.
fonte
0
ou1
como o dígito se isso não gerar bytes adicionais.ES6, 117 bytes
Ungolfed:
Editar: salvou 4 bytes graças a ՊՓԼՃՐՊՃՈԲՍԼ.
fonte
JavaScript (ES6),
108107106 bytesEssa é a solução que surgiu quando criei o desafio.
Explicação
Toma o poder como um número e o curso como uma corda. Retorna
1
paratrue
ou0
parafalse
. O percurso deve ser preenchido com espaços.Teste
fonte
Python (3.5)
169160 bytesUma solução recursiva sem a função de transposição (zip)
Ungolfed
c para curso, p para potência, v para velocidade, h para altura
Uso
fonte
Pitão, 35 bytes
Explicação
fonte
Ruby, 85 caracteres
Resposta adaptada do @ manatwork
fonte
JavaScript,
266263244 bytesUngolfed
Uso
fonte
Java, 219 bytes
Achate o curso, porque a coordenada y não importa, infelizmente o Java não tem um ajuste vertical. Também não possui uma string de transposição.
Itere sobre o percurso achatado e acompanhe a velocidade da bola.
fonte
Oitava,
111110 bytesExplicação:
max
para cada coluna'_/\'
para[1, 5, -4]
(todos os outros caracteres menores que'_'
os mapeados0
)True
se todas as somas acumuladas do início do percurso até o copo forem menores que a velocidade inicial (False
caso contrário).Aqui está um caso de teste que eu já desenvolvi semelhante ao segundo proposto por @Erwan e alguns resultados:
E aqui está o primeiro caso de teste:
fonte
"//_U\\\\\\\_
o resultado está incorreto, uma vez que você não remove o caractere após asU
mesmas coisas, se você tiver um curso com o máximo local como_//\\\\\U
U
. Isso é o que(1:find(m==85))
faz; leva a sub-matriz do primeiro índice para o local daU
. Vou verificar o seu caso de teste com algumas velocidades iniciais e voltar para você.cumsum
a uma variável intermediária e depois usá-lo para a comparação finalall(v>tmp(1:find(m==85)))
.C, 629 bytes
Ungolfed:
Basicamente, eu apenas faço uma passagem para converter a string de entrada para caber tudo em uma linha, depois
fonte
if
/else
egx+=*n==' ')?1:*n=='\n'?-x:(olc[x]=*n,1
. Outra dica: em C,unsigned int
pode ser escritounsigned
, economizando 4 bytes imediatamente.Python,
212201188143 bytesGrande parte do crédito por essa iteração desse script vai para @Erwan, que me deu uma abordagem totalmente diferente para tentar e algumas dicas que me salvaram 55 bytes no final.
Não é recursivo; portanto, deve ser substancialmente diferente da outra solução python.
Ungolfed um pouco:
fonte
o=[''.join(x).split()[0] for x in zip(*c.split('\n'))]
break
porreturn p>0
e removerif p...
if"U"==v or p<1
se houver um máximo local como_//\\\\\U