Antecedentes
Hay un acertijo común que dice algo como esto:
Un caracol está en el fondo de un pozo de 30 pies. Todos los días el caracol puede trepar hasta 3 pies. Por la noche, cuando duermen, se deslizan hacia abajo 2 pies. ¿Cuántos días le toma al caracol salir del pozo?
La respuesta intuitiva es
30 días, porque el caracol trepa a 1 pie por día durante 30 días para llegar a la cima,
pero en realidad la respuesta es
28 días, porque una vez que el caracol esté a 27 pies en el aire (después de 27 días), simplemente subirán los 3 pies restantes a la cima el día 28.
Desafío
Este desafío generaliza este acertijo. Dados tres enteros positivos como entrada, que representan la altura total, la altura de ascenso y la altura de caída, devuelve el número de días que tomará salir del pozo.
Si el caracol no puede salir del pozo, puede devolver 0, devolver un valor falso o lanzar una excepción. También puede escribir código que se detendrá si y solo si existe una solución.
Si lo desea, puede tomar la altura de caída como un entero negativo.
Casos de prueba
(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) -> Ninguno (81, 14, 14) -> Ninguno
Puntuación
Este es el código de golf , por lo que gana la respuesta más corta en cada idioma.
fuente
Respuestas:
Caracol gris , 1206 bytes para E / S numéricas, 149 bytes para E / S unarias
Por diversión. Composición del primer programa:
Tomar entrada y salida numérica. De entrada es
A
,B
,C
respectivamente. En comparación con otraO(1)
respuesta (cercana) , el código tiene una complejidad deO(n)
. Pero para un gran número, puede consumir su memoria primero.Cuelgue si no se encuentra una solución.
f
es una (quizás) función recursiva para convertir enteros en puntos. El argumento se guarda[p]
y se genera[o]
.U
es una prueba de funciónS1>=S2
, almacenando parámetrosB, A
mientras se guardaA-B
enA
.El código a partir de
D
es un trozo que convierte puntos en números.El principio subyacente es el mismo con mi respuesta C (estafando la salida falsa para soluciones imposibles).
Versión independiente, 149
156157167170230bytes, solo admite E / S unariasLa entrada debe ser puntos, por ejemplo,
..........
para10
.U
calculaA=A-B
y salta aD
cuandoA<=0
. De lo contrario$
asignaA+C
aA
y llamadaU
.Cuelgue si no se encuentra una solución.
Trucos: abusar de la capacidad del "compilador" para interpretar cadenas vacías. Puede extraer condiciones en la
GOTO
declaración para hacer saltos incondicionados y el mismo truco funcionaPOP
.Observación: puedo jugar más por 3 bytes, pero al hacerlo, la respuesta mía y de WheatWizard tendría exactamente la misma lógica. El resultado es probablemente la solución GraySnail más corta y estoy tratando de demostrarlo.
fuente
C # (.NET Core) ,
3231 bytesPruébalo en línea!
Un enfoque recursivo. Si el caracol no puede escapar, termina con el siguiente mensaje:
Process is terminating due to StackOverflowException.
fuente
a<=b
aa>b
e intercambiando las siguientes partesf=(a,b,c)=>a<=b?1:1+f(a-b+c,b,c)
f
para la llamada recursiva.f
y un punto y coma si se nombra. Lo primero que encontré es esto, pero no hay un consenso claro aquí.f=...
que no estoy seguro de si debemos agregar el punto y coma al final.GRAY caracol,
219206169167159156146 bytes (unario IO)Creo que puedo jugar un poco con esto.
fuente
JavaScript (ES6),
312827 bytesGuardado algunos bytes gracias a @Arnauld
No me había dado cuenta de que podíamos fallar con una excepción. Bastante seguro de que esto es óptimo:
Asigne a una variable con
f=
, por ejemplo , luego llame comof(climb)(fall)(height)
. LanzaInternalError: too much recursion
si la escalada es imposible.JavaScript (ES6), 38 bytes
Una función recursiva que devuelve el número de días, o
NaN
para nunca.Casos de prueba
Mostrar fragmento de código
fuente
d=>u=>g=h=>h>u?1+g(h-u+d):1
g=
en el medio porque esta variable almacena la función intermedia necesaria para la llamada recursiva. La respuesta más larga hace una llamada recursivaf
, que exige que el nombre se incluya en el recuento de bytes.Excel,
5146 bytes-1 byte gracias a @ Scarabee .
-4 porque INT (x) = PISO (x, 1)
Entrada tomada de las Celdas A1, B1 y C1 respectivamente. Devoluciones
FALSE
para escenarios no válidos.fuente
ceiling(x)
siempre es igual a-floor(-x)
, por lo que creo que podría guardar 1 byte reemplazandoCEILING((A1-B1)/(B1-C1)+1,1)
con-FLOOR((B1-A1)/(B1-C1)+1,1)
.C (gcc), 39
434446475860 60bytesSolo en GCC de 32 bits y todas las optimizaciones desactivadas.
Devuelve 0 cuando la solución es imposible. Una versión modificada de la solución recursiva original.
Inspirado en la solución @Jonah J y la solución @CarlosAlejo C #.
Actualizaré la versión ampliada más tarde (después de que termine mi respuesta de Gray Snail).
fuente
Assign instead of return
Java (OpenJDK 8) , 35 bytes
Pruébalo en línea!
Matemáticas gana!
Créditos
fuente
a-c-1
→a+~c
.Python 2 , 37 bytes
Pruébalo en línea!
Finalmente obtuve mi versión recursiva por debajo de mi cálculo estándar (estaba pasando un conteo a mi función en lugar de agregar uno antes de llamarlo).
Pitón 2 , 43
46bytesPruébalo en línea!
Afeitó 3 bytes cambiando "__ y 1" por "__> 0".
Usando trucos booleanos, esencialmente ejecuta:
fuente
f=
delante de su código (la primera solución), y su recuento de bytes se convierte en 37, porque es recursivo, por lo que no puede dejarlo en el anonimato.f=
se puede descartar para una lambda solo cuando no es recusiva.R, 43 bytes
Préstamo de otras respuestas:
Da error si no hay solución.
fuente
J, 25 bytes
Primero, una buena solución, que es una trampa, ya que supone que "cualquier cosa que no sea un resultado entero positivo" es igual a "Ninguno":
explicación
2-/\
use ventanas de longitud 2 en nuestra entrada de 3 elementos, colocando un signo menos entre cada una, que para la entrada30 3 2
, por ejemplo, devuelve27 1
%/
ponga un símbolo de división entre cada elemento de la lista, en nuestro caso la lista tiene solo dos elementos, por lo que significa "dividir 27 por 1">:
incrementar en 1>.
tomar el techosolución oficial
Aquí está la solución oficial que convierte los negativos y el infinito a 0, cuya parte no pude encontrar una solución satisfactoriamente breve para:
TIO
fuente
If the snail cannot climb out of the well, you may return 0, return a falsy value, or throw an exception.
Con el propósito de escribir los casos de prueba, simplemente elegíNone
indicar que no había respuesta. ¿Consideraría también agregar una explicación y un enlace Pruébelo en línea?Perl 5 , 37 bytes
Código de 35 bytes +2 para
-pa
.Pruébalo en línea!
fuente
PHP> = 7.1, 60 bytes
imprime 0 para no escapar
PHP Sandbox en línea
PHP> = 7.1, 67 bytes
no imprime nada sin escapatoria
PHP Sandbox en línea
fuente
Mathematica,
474039 bytes-7 bytes de @KeyuGan
fuente
69, 3, 8
y⌈
se cuenta como 3 bytes por lo que creo.Max
para reemplazar laIf
declaración.If[#<=#2,1,Max[⌈(#-#3)/(#2-#3)⌉,0]]&
Ruby ,
4947 bytesLanza una excepción si el caracol no puede salir
Pruébalo en línea!
fuente
h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceil
pasa los casos de prueba y guarda 9 bytes.Lote, 66 bytes
El segundo último caso de prueba no imprimió nada, y el último caso de prueba realmente se bloqueó
CMD.EXE
...fuente
05AB1E , 19 bytes
Explicación:
Para valores no válidos, esto puede devolver cualquier valor menor que 1. Sin embargo, en 05AB1E, solo 1 es verdadero, por lo que cumple con el requisito de que la salida de un valor no válido sea falsa.
Pruébalo en línea!
fuente
PHP, 60 bytes
impresiones
N
paraNone
. Corre con-r
.fuente
05AB1E , 12 bytes
Pruébalo en línea!
Imprime
0
si es imposible.Formato de entrada:
fuente
Japt , 12 bytes
¡Pruébelo en línea!
Salidas
undefined
para nunca, después de posiblemente congelar su navegador por un tiempo, así que tenga cuidado.No estoy convencido de que esto sea óptimo.
oWV-W l
funciona en todos menos los últimos tres casos ...fuente
Haskell ,
3029 bytesPruébalo en línea!
Más corto que la respuesta Haskell existente. Quizás alguien más pueda vencerme.
Esto utiliza un enfoque recursivo para resolver el problema. Cada recursión es esencialmente un día de movimiento para el caracol. Si la distancia que queda hasta el final es menor que la distancia aún requerida, finalizamos nuestra recursión.
fuente
(b#c)a=1+sum[(b#c)$a+c-b|a>b]
.b!c
en la lista de comprensión.QBIC ,
3123 bytesAcabo de notar que los requisitos cambiaron. Esta versión no verifica si el caracol llegará a la parte superior del pozo.
La explicación a continuación, para la versión original que verifica si existe una solución, también cubre todas las partes relevantes de este código.
Original, respuesta de 31 bytes:
Explicación
Pruébalo en línea! (OK, en realidad no: esta es una traducción de QBIC al código QBasic ejecutado en el entorno QBasic de repl.it (algo deficiente))
fuente
Excel VBA, 47 Bytes
Función de ventana inmediata anónima de VBE que toma la entrada desde el rango
[A1:C1]
de lasActiveSheet
salidas del objeto a la ventana inmediata de VBEEsta solución basada principalmente en fórmulas de Excel parece ser más pequeña que cualquier solución puramente VBA que se me ocurra :(
fuente
Haskell, 47
55bytes (48 si se requiere tupla)variación de tupla
Explicación
fuente
d>c||c<s
solo con0<1
, como ya lo hace implícitamente en su explicación, porqueotherwise
es solo un sinónimo deTrue
. 2. La llamada recursiva en tu versión de tupla todavía está al curry. 3. Puede definir su función como en(d#c)s
lugar def d c s
guardar dos bytes más.c<=s
lugar dec<s
.0
lugar de-1
lo permitido por el OP produce 38 bytes: ¡ Pruébelo en línea!Python 3, 41 bytes
Error para nunca
Outgolf @veganaiZe
fuente
int(b>=a)
a1-(b<a)
salvar 2 bytes?APL (Dyalog) , 13 bytes
Pruébalo en línea!
Errores en la división por cero si el caracol no puede salir del pozo.
fuente
C # (.NET Core) , 37 bytes
Lambda no recursiva. Utiliza la fórmula que se encuentra aquí . Podría acortarse en 6 bytes si "cualquier resultado negativo" es una forma válida de devolver la falla; actualmente devuelve 0 en su lugar.
fuente
h-f-1
puede serh+~f
.Python v2 y v3, 44 bytes
^ Recurrencia infinita (error) para el caso Ninguno.
fuente
(x-z-1)//(y-z)+1
. No hago mucho Python, así que podría estar equivocado ...f=
del conteo de bytes, eliminar algunos espacios alrededor de ifs y elses, y cambiar a Python 2, donde la división de enteros es única/
Calculadora programable HP-15C, 26 bytes
Los tres números se cargan en la pila en orden antes de ejecutar el programa. La altura de caída se ingresa como un número negativo. Si el caracol no puede salir del pozo, el resultado es un número negativo o un error n. ° 0 (error de división cero).
Códigos operativos en hexadecimal:
Significado de las instrucciones:
Puede probar el programa con este simulador HP-15C .
fuente
Lisp común, 49 bytes
Pruébalo en línea!
Función recursiva, desbordamiento de pila si no se encuentra una solución.
fuente
Potencia Shell ,
9594 bytesPruébalo en línea!
fuente