Contexte
Il y a une énigme commune qui ressemble à ceci:
Un escargot est au fond d'un puits de 30 pieds. Chaque jour, l'escargot est capable de grimper jusqu'à 3 pieds. La nuit, quand ils dorment, ils redescendent de deux pieds. Combien de jours faut-il pour que l'escargot sorte du puits?
La réponse intuitive est
30 jours, parce que l'escargot grimpe à 1 pied par jour pendant 30 jours pour atteindre le sommet,
mais en réalité la réponse est
28 jours, car une fois que l'escargot aura atteint 27 pieds de hauteur (après 27 jours), il ne lui restera plus qu'à gravir les 3 pieds restants jusqu'au sommet le 28e jour.
Défi
Ce défi généralise cette énigme. Avec trois nombres entiers positifs en entrée, représentant la hauteur totale, la hauteur de montée et la hauteur de chute, donne le nombre de jours nécessaires à la sortie du puits.
Si l'escargot ne peut pas sortir du puits, vous pouvez renvoyer 0, renvoyer une valeur de fausseté ou renvoyer une exception. Vous pouvez également écrire du code qui s’arrêtera si et seulement si une solution existe.
Si vous le souhaitez, vous pouvez prendre la hauteur de chute comme un entier négatif.
Cas de test
(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) -> Aucun (81, 14, 14) -> Aucun
Notation
C'est du code-golf , donc la réponse la plus courte dans chaque langue est gagnante.
la source
Réponses:
Escargot gris , 1206 octets pour les E / S numériques, 149 octets pour les E / S unaires
Pour s'amuser. Composition du premier programme:
Prendre une entrée et une sortie numériques. Est entrée
A
,B
,C
respectivement. Comparé à une autreO(1)
réponse (proche) , le code a une complexité deO(n)
. Mais pour un grand nombre de personnes, il se peut qu’il dévorera d’abord votre mémoire.Suspendez si aucune solution n'est trouvée.
f
est une fonction (peut-être) récursive pour convertir des entiers en points. L'argument est enregistré dans[p]
et sorti dans[o]
.U
est un test de fonctionS1>=S2
, stockant un paramètre lors de laB, A
sauvegardeA-B
dansA
.Le code à partir de
D
est une souche convertissant des points en nombres.Le principe sous-jacent est le même avec ma réponse en C (extraire la fausseté pour obtenir des solutions impossibles).
Version autonome, 149
156157167170230octets, supporte uniquement les entrées / sorties unairesLes entrées doivent être des points, par exemple
..........
pour10
.U
calculeA=A-B
et saute àD
quandA<=0
. Sinon,$
attribueA+C
àA
et appelleU
.Suspendez si aucune solution n'est trouvée.
Astuces: abusez de la capacité du "compilateur" à interpréter une chaîne vide. Vous pouvez extraire des conditions dans une
GOTO
instruction pour effectuer des sauts inconditionnés et le même truc fonctionne pourPOP
.Remarque: je peux jouer plus de 3 octets, mais ce faisant, ma réponse et celle de WheatWizard auraient exactement la même logique. Le résultat est probablement la solution GraySnail la plus courte et j'essaie de le prouver.
la source
C # (.NET Core) ,
3231 octetsEssayez-le en ligne!
Une approche récursive. Si l'escargot ne peut pas s'échapper, il se termine par le message suivant:
Process is terminating due to StackOverflowException.
la source
a<=b
àa>b
et échanger les pièces suivantesf=(a,b,c)=>a<=b?1:1+f(a-b+c,b,c)
f
pour l'appel récursif.f
et un point-virgule, si le nom est choisi. La première chose que j'ai trouvée est la suivante, mais il n'y a pas de consensus clair ici.f=...
mais je ne suis pas sûr de savoir si nous devrions ou non ajouter le point-virgule à la fin.GREY SNAIL,
219206169167159 159156146 octets (IO unaire)Je pense que je peux jouer au golf un peu.
la source
JavaScript (ES6),
312827 octetsEnregistré quelques octets grâce à @Arnauld
Je n'avais pas réalisé que nous pouvions échouer avec une exception. Je suis sûr que c'est optimal:
Affecter à une variable avec par exemple
f=
, puis appeler commef(climb)(fall)(height)
. LanceInternalError: too much recursion
si la montée est impossible.JavaScript (ES6), 38 octets
Une fonction récursive qui renvoie le nombre de jours, ou
NaN
pour jamais.Cas de test
Afficher l'extrait de code
la source
d=>u=>g=h=>h>u?1+g(h-u+d):1
g=
au milieu, car cette variable stocke la fonction intermédiaire nécessaire pour l'appel récursif. La réponse la plus longue effectue un appel récursiff
, qui impose d'inclure le nom dans le nombre d'octets.Excel,
5146 octets-1 octet grâce à @ Scarabee .
-4 parce que INT (x) = FLOOR (x, 1)
Entrée prise des cellules A1, B1 et C1 respectivement. Renvoie
FALSE
les scénarios non valides.la source
ceiling(x)
est toujours égal à-floor(-x)
, alors je pense que vous pourriez économiser 1 octet en le remplaçantCEILING((A1-B1)/(B1-C1)+1,1)
par-FLOOR((B1-A1)/(B1-C1)+1,1)
.C (gcc), 39
434446475860octetsSeulement sur GCC 32 bits et toutes les optimisations sont désactivées.
Renvoie 0 lorsque la solution est impossible. Une version modifiée de la solution récursive originale.
Inspiré par les solutions @Jonah J et @CarlosAlejo C #.
Je mettrai à jour la version développée plus tard (après avoir terminé ma réponse à Grey Snail).
la source
Assign instead of return
Java (OpenJDK 8) , 35 octets
Essayez-le en ligne!
Math gagne!
Crédits
la source
a-c-1
→a+~c
.Python 2 , 37 octets
Essayez-le en ligne!
Enfin, ma version récursive est en dessous de mon calcul standard (je passais un compte à ma fonction au lieu d’en ajouter un avant de l’appeler).
Python 2 , 43
46octetsEssayez-le en ligne!
Rasé 3 octets en échangeant "__ et 1" pour "__> 0".
En utilisant la supercherie booléenne, exécute essentiellement:
la source
f=
devant votre code (la première solution), et votre nombre d'octets devient 37, car il est récursif, vous ne pouvez donc pas le laisser anonyme.f=
peut être abandonné pour un lambda que quand il n'est pas récusé.R, 43 octets
Emprunter d'autres réponses:
Donne une erreur s'il n'y a pas de solution.
la source
J, 25 octets
Premièrement, une bonne solution, qui est un tricheur, car elle suppose que "tout autre résultat qu'un résultat entier positif" est égal à "Aucun":
explication
2-/\
utilisez des fenêtres de longueur 2 sur notre entrée de 3 éléments, en plaçant un signe moins entre chaque élément, qui30 3 2
, par exemple, renvoie27 1
%/
mettez un symbole de division entre chaque élément de la liste, dans notre cas, la liste ne contient que deux éléments, cela signifie donc "divise 27 par 1">:
incrémenter de 1>.
prendre le plafondsolution officielle
Voici la solution officielle qui convertit les négatifs et l'infini en 0, partie pour laquelle je n'ai pas pu trouver de solution satisfaisante pour:
TIO
la source
If the snail cannot climb out of the well, you may return 0, return a falsy value, or throw an exception.
Afin de rédiger les cas de test, j'ai simplement choisiNone
d'indiquer qu'il n'y avait pas de réponse. Souhaitez-vous également ajouter une explication et un lien Essayez-le en ligne?Perl 5 , 37 octets
35 octets code +2 pour
-pa
.Essayez-le en ligne!
la source
PHP> = 7.1, 60 octets
imprime 0 sans issue
PHP Sandbox en ligne
PHP> = 7.1, 67 octets
n'imprime rien sans issue
PHP Sandbox en ligne
la source
Mathematica,
474039 octets-7 octets de @KeyuGan
la source
69, 3, 8
et à mesure, et⌈
compte pour 3 octets, à mon avis.Max
pour remplacer laIf
déclaration.If[#<=#2,1,Max[⌈(#-#3)/(#2-#3)⌉,0]]&
Ruby ,
4947 octetsLance une exception si l'escargot ne peut pas sortir
Essayez-le en ligne!
la source
h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceil
passe les tests et enregistre 9 octets.Lot, 66 octets
L'avant-dernier cas de test n'imprimait rien, et le dernier cas de test s'est réellement écrasé
CMD.EXE
...la source
05AB1E , 19 octets
Explication:
Pour les valeurs non valides, cela peut renvoyer toute valeur inférieure à 1. Toutefois, dans 05AB1E, seul 1 est la vérité, ce qui répond à l'exigence voulant que la sortie d'une valeur non valide soit faussée.
Essayez-le en ligne!
la source
PHP, 60 octets
impressions
N
pourNone
. Courez avec-r
.la source
05AB1E , 12 octets
Essayez-le en ligne!
Imprime
0
si impossible.Format d'entrée:
la source
Japt , 12 octets
Testez-le en ligne!
Sorties
undefined
pour jamais, après avoir éventuellement geler votre navigateur pendant un moment, alors soyez prudent.Je ne suis pas convaincu que c'est optimal.
oWV-W l
fonctionne sur tous les cas sauf les trois derniers ...la source
Haskell ,
3029 octetsEssayez-le en ligne!
Plus courte que la réponse Haskell existante. Peut-être que quelqu'un d'autre peut me battre.
Ceci utilise une approche récursive pour résoudre le problème. Chaque récursion est essentiellement un jour de mouvement pour l'escargot. Si la distance laissée à la fin est inférieure à la distance requise, nous terminons notre récursion.
la source
(b#c)a=1+sum[(b#c)$a+c-b|a>b]
.b!c
dans la compréhension de la liste.QBIC ,
3123 octetsJe viens de remarquer que les exigences ont changé. Cette version ne vérifie pas si l'escargot atteindra jamais le sommet du puits.
L'explication ci-dessous, pour la version originale qui vérifie si une solution existe, couvre également toutes les parties pertinentes de ce code.
Réponse d'origine, 31 octets:
Explication
Essayez-le en ligne! (OK, pas vraiment: il s’agit d’une traduction de QBIC en code QBasic exécuté dans l’environnement QBasic de repl.it (quelque peu manquant))
la source
Excel VBA, 47 octets
Fonction de fenêtre immédiate VBE anonyme qui prend une entrée dans la plage
[A1:C1]
allant desActiveSheet
sorties d'objet à la fenêtre VBE immédiateCette solution, basée principalement sur une formule Excel, semble être plus petite que n’importe quelle solution purement VBA que je peux trouver :(
la source
Haskell, 47 à
55octets (48 si un tuple est requis)variation du tuple
Explication
la source
d>c||c<s
simplement remplacer par0<1
, comme vous le faites déjà implicitement dans votre explication, car ceotherwise
n'est qu'un synonyme deTrue
. 2. L'appel récursif dans votre version de tuple est toujours au curry. 3. Vous pouvez définir votre fonction comme(d#c)s
au lieu def d c s
sauvegarder deux octets supplémentaires.c<=s
au lieu dec<s
.0
au lieu de-1
comme autorisé par l'OP génère 38 octets: essayez-le en ligne!Python 3, 41 octets
Erreur pour Jamais
Outgolf @veganaiZe
la source
int(b>=a)
pour1-(b<a)
sauver 2 octets?APL (Dyalog) , 13 octets
Essayez-le en ligne!
Erreurs de division par zéro si l'escargot ne peut pas sortir du puits.
la source
C # (.NET Core) , 37 octets
Lambda non récursif. Utilise la formule trouvée ici . Peut être raccourci de 6 octets si "tout résultat négatif" est un moyen valide de renvoyer un échec. renvoie actuellement 0 à la place.
la source
h-f-1
peut êtreh+~f
.Python v2 et v3, 44 octets
^ Récursion infinie (erreur) pour le cas Aucun.
la source
(x-z-1)//(y-z)+1
. Je ne fais pas beaucoup de Python, alors je me trompe peut-être ...f=
du nombre d'octets, supprimer quelques espaces autour des ifs et des autres et passer à Python 2, où la division entière est un simple/
Calculatrice programmable HP-15C, 26 octets
Les trois numéros sont chargés dans la pile dans l'ordre avant d'exécuter le programme. La hauteur de chute est entrée sous forme de nombre négatif. Si l'escargot ne peut pas sortir du puits, le résultat est un nombre négatif ou une erreur n ° 0 (erreur de division du zéro).
Codes Op en hex:
Signification des instructions:
Vous pouvez essayer le programme avec ce simulateur HP-15C .
la source
Common Lisp, 49 octets
Essayez-le en ligne!
Fonction récursive, débordement de pile si aucune solution trouvée.
la source
PowerShell ,
95 à94 octetsEssayez-le en ligne!
la source