fundo
Há um enigma comum que é mais ou menos assim:
Um caracol está no fundo de um poço de 30 pés. Todos os dias o caracol é capaz de subir 3 pés. À noite, quando dormem, deslizam de volta 2 pés. Quantos dias o caracol leva para sair do poço?
A resposta intuitiva é
30 dias, porque o caracol sobe 1 pé por dia durante 30 dias para chegar ao topo,
mas na verdade a resposta é
28 dias, porque uma vez que o caracol está a 27 pés no ar (após 27 dias), eles simplesmente subirão os 3 pés restantes até o topo no 28º dia.
Desafio
Esse desafio generaliza esse enigma. Dado três números inteiros positivos como entrada, representando a altura total, a altura de subida e a altura de queda, retorne o número de dias que levará para sair do poço.
Se o caracol não puder sair do poço, você pode retornar 0, retornar um valor falso ou lançar uma exceção. Você também pode escrever um código que interrompa se e somente se existir uma solução.
Se desejar, você pode considerar a altura da queda como um número inteiro negativo.
Casos de teste
(30, 3, 2) -> 28 (84, 17, 15) -> 35 (79, 15, 9) -> 12 (29, 17, 4) -> 2 (13, 18, 8) -> 1 (5, 5, 10) -> 1 (7, 7, 7) -> 1 (69, 3, 8) -> nenhum (81, 14, 14) -> nenhum
Pontuação
Isso é código-golfe , então a resposta mais curta em cada idioma vence.
fonte
Respostas:
Caracol cinza , 1206 bytes para E / S numérica, 149 bytes para E / S unária
Para se divertir. Composição do primeiro programa:
Tome entrada e saída numéricas. A entrada é
A
,B
,C
respectivamente. Comparado com outra (quase)O(1)
resposta, o código tem uma complexidade deO(n)
. Mas, para um grande número, ele pode consumir sua memória primeiro.Trave se nenhuma solução for encontrada.
f
é uma função (talvez) recursiva para converter números inteiros em pontos. O argumento é salvo[p]
e produzido em[o]
.U
é um teste de funçãoS1>=S2
, o armazenamento de parâmetro emB, A
poupandoA-B
emA
.O código a partir de
D
é um esboço que converte pontos em números.O princípio subjacente é o mesmo com a minha resposta C (arrancando resultados falsos para soluções impossíveis).
Versão autônoma, 149
156157167170230bytes, suportam apenas E / S unáriasA entrada precisa ser pontos, por exemplo,
..........
para10
.U
calculaA=A-B
e pula paraD
quandoA<=0
. Caso contrário,$
atribuiA+C
aoA
e chamadaU
.Trave se nenhuma solução for encontrada.
Truques: abusam da capacidade do "compilador" de interpretar uma string vazia. Você pode extrair condições na
GOTO
instrução para fazer saltos incondicionados e o mesmo truque funcionaPOP
.Observação: eu posso jogar mais de 3 bytes, mas, ao fazê-lo, a resposta da minha e da WheatWizard teria exatamente a mesma lógica. O resultado é provavelmente a solução mais curta do GraySnail e estou tentando provar isso.
fonte
C # (.NET Core) ,
3231 bytesExperimente online!
Uma abordagem recursiva. Se o caracol não puder escapar, ele termina com a seguinte mensagem:
Process is terminating due to StackOverflowException.
fonte
a<=b
paraa>b
e trocar as seguintes peçasf=(a,b,c)=>a<=b?1:1+f(a-b+c,b,c)
f
para a chamada recursiva.f
e um ponto-e-vírgula, se esse nome for mencionado. A primeira coisa que encontrei é isso, mas não há consenso claro aqui.f=...
que não tenho certeza se devemos adicionar o ponto e vírgula no final.CARACOL CINZENTO,
219206169167159156146 bytes (IO unário)Eu acho que posso jogar isso um pouco.
fonte
JavaScript (ES6),
312827 bytesGuardou alguns bytes graças a @Arnauld
Eu não tinha percebido que poderíamos falhar com uma exceção. Certamente isso é ótimo:
Atribua a uma variável com
f=
, por exemplo , e chame comof(climb)(fall)(height)
. LançaInternalError: too much recursion
se a subida for impossível.JavaScript (ES6), 38 bytes
Uma função recursiva que retorna o número de dias ou
NaN
para nunca.Casos de teste
Mostrar snippet de código
fonte
d=>u=>g=h=>h>u?1+g(h-u+d):1
g=
no meio, porque essa variável armazena a função intermediária necessária para a chamada recursiva. A resposta mais longa faz uma chamada recursivaf
, que exige que o nome seja incluído na contagem de bytes.Excel,
5146 bytes-1 byte graças a @ Scarabee .
-4 porque INT (x) = PISO (x, 1)
Entrada obtida das células A1, B1 e C1, respectivamente. Retorna
FALSE
para cenários inválidos.fonte
ceiling(x)
é sempre igual a-floor(-x)
, então eu acho que você poderia economizar 1 byte substituindoCEILING((A1-B1)/(B1-C1)+1,1)
por-FLOOR((B1-A1)/(B1-C1)+1,1)
.C (gcc), 39
434446.475860bytesSomente no GCC de 32 bits e todas as otimizações desativadas.
Retorne 0 quando a solução for impossível. Uma versão modificada da solução recursiva original.
Inspirado nas soluções @Jonah J e @CarlosAlejo C #.
Atualizarei a versão expandida mais tarde (depois de terminar minha resposta do Grey Snail).
fonte
Assign instead of return
Java (OpenJDK 8) , 35 bytes
Experimente online!
A matemática vence!
Créditos
fonte
a-c-1
→a+~c
.Python 2 , 37 bytes
Experimente online!
Finalmente consegui minha versão recursiva abaixo do meu cálculo padrão (estava passando uma contagem para minha função em vez de adicionar uma antes de chamá-la).
Python 2 , 43
46.bytesExperimente online!
Raspou 3 bytes trocando "__ e 1" por "__> 0".
Usando truques booleanos, essencialmente executa:
fonte
f=
na frente do seu código (a primeira solução) e sua contagem de bytes se tornará 37, porque é recursiva, para que você não possa deixá-lo anônimo.f=
pode ser descartado para um lambda apenas quando não for recusativo.R, 43 bytes
Empréstimos de outras respostas:
Dá erro se não houver solução.
fonte
J, 25 bytes
Primeiro, uma boa solução, que é uma trapaça, pois assume que "qualquer coisa que não seja um resultado inteiro positivo" é igual a "Nenhum":
explicação
2-/\
use janelas de comprimento 2 em nossa entrada de 3 itens, colocando um sinal de menos entre cada uma, o que para a entrada30 3 2
, por exemplo, retorna27 1
%/
coloque um símbolo de divisão entre cada elemento da lista; no nosso caso, a lista possui apenas dois itens; portanto, "divida 27 por 1">:
incremento de 1>.
pegue o tetosolução oficial
Aqui está a solução oficial que converte negativos e infinito em 0, cuja parte i não foi capaz de encontrar uma solução satisfatoriamente concisa para:
TIO
fonte
If the snail cannot climb out of the well, you may return 0, return a falsy value, or throw an exception.
Para escrever os casos de teste, simplesmente escolhiNone
indicar que não havia resposta. Você também consideraria adicionar uma explicação e um link Experimente Online?Perl 5 , 37 bytes
Código de 35 bytes +2 para
-pa
.Experimente online!
fonte
PHP> = 7.1, 60 bytes
imprime 0 para não escapar
Sandbox do PHP Online
PHP> = 7,1, 67 bytes
imprime nada para não escapar
Sandbox do PHP Online
fonte
Mathematica,
474039 bytes-7 bytes de @KeyuGan
fonte
69, 3, 8
e⌈
é contado como 3 bytes, tanto quanto eu penso.Max
para substituir aIf
instrução.If[#<=#2,1,Max[⌈(#-#3)/(#2-#3)⌉,0]]&
Ruby ,
4947 bytesLança exceção se o caracol não puder subir
Experimente online!
fonte
h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceil
passa nos casos de teste e salva 9 bytes.Lote, 66 bytes
O segundo último caso de teste não imprimiu nada e o último caso de teste realmente travou
CMD.EXE
...fonte
05AB1E , 19 bytes
Explicação:
Para valores inválidos, isso pode retornar qualquer valor menor que 1. No entanto, em 05AB1E, apenas 1 é verdadeiro; portanto, ele atende ao requisito de que a saída para um valor inválido seja falsa.
Experimente online!
fonte
PHP, 60 bytes
imprime
N
paraNone
. Corra com-r
.fonte
05AB1E , 12 bytes
Experimente online!
Imprime
0
se impossível.Formato de entrada:
fonte
Japonês , 12 bytes
Teste online!
Resultados
undefined
para nunca, depois de possivelmente congelar o navegador por um tempo, portanto, tenha cuidado.Não estou convencido de que isso seja ótimo.
oWV-W l
funciona em todos, exceto nos últimos três casos ...fonte
Haskell ,
3029 bytesExperimente online!
Mais curto que a resposta Haskell existente. Talvez alguém possa me derrotar.
Isso usa uma abordagem recursiva para resolver o problema. Cada recursão é essencialmente um dia de movimento para o caracol. Se a distância restante até o final for menor que a distância ainda necessária, encerramos nossa recursão.
fonte
(b#c)a=1+sum[(b#c)$a+c-b|a>b]
.b!c
na compreensão da lista.QBIC ,
3123 bytesSó notei que os requisitos foram alterados. Esta versão não verifica se o caracol chegará ao topo do poço.
A explicação abaixo, para a versão original que verifica se existe uma solução, também abrange todas as partes relevantes deste código.
Resposta original de 31 bytes:
Explicação
Experimente online! (OK, na verdade não: esta é uma tradução do código QBIC para QBasic executado no ambiente QBasic de repl.it (um pouco ausente))
fonte
Excel VBA, 47 bytes
Função de janela imediata VBE anônima que recebe entrada do intervalo
[A1:C1]
dasActiveSheet
saídas do objeto para a janela imediata VBEEsta solução baseada principalmente na fórmula do Excel parece ser menor do que qualquer solução puramente VBA que eu possa apresentar :(
fonte
Haskell, 47
55bytes (48 se necessário, tupla)variação da tupla
Explicação
fonte
d>c||c<s
justamente por0<1
, como já implicitamente faz na sua explicação, porqueotherwise
é apenas um sinônimo deTrue
. 2. A chamada recursiva na sua versão de tupla ainda está ativa. 3. Você pode definir sua função como em(d#c)s
vez def d c s
salvar mais dois bytes.c<=s
vez dec<s
.0
vez do-1
permitido pelo OP gera 38 bytes: Experimente online!Python 3, 41 bytes
Erro para nunca
Outgolf @veganaiZe
fonte
int(b>=a)
para1-(b<a)
salvar 2 bytes?APL (Dyalog) , 13 bytes
Experimente online!
Erros na divisão por zero se o caracol não puder sair do poço.
fonte
C # (.NET Core) , 37 bytes
Lambda não recursiva. Usa a fórmula encontrada aqui . Pode ser reduzido em 6 bytes se "qualquer resultado negativo" for uma maneira válida de retornar falha; atualmente retorna 0.
fonte
h-f-1
pode serh+~f
.Python v2 e v3, 44 bytes
^ Recursão infinita (erro) para Nenhum caso.
fonte
(x-z-1)//(y-z)+1
. Eu não faço muito Python, por isso posso estar errado ...f=
a partir da contagem de bytes, remover alguns espaços em torno de ifs e elses, e mudar para Python 2, onde a divisão inteira é uma única/
Calculadora programável HP-15C, 26 bytes
Os três números são carregados na pilha em ordem antes de executar o programa. A altura da queda é inserida como um número negativo. Se o caracol não puder sair do poço, o resultado será um número negativo ou um erro # 0 (erro de divisão zero).
Códigos op em hex:
Significado das instruções:
Você pode experimentar o programa com este simulador HP-15C .
fonte
Lisp comum, 49 bytes
Experimente online!
Função recursiva, estouro de pilha se nenhuma solução encontrada.
fonte
PowerShell ,
9594 bytesExperimente online!
fonte