Hintergrund
Es gibt ein allgemeines Rätsel, das ungefähr so lautet:
Eine Schnecke ist am Boden eines 30-Fuß-Brunnens. Jeden Tag kann die Schnecke 3 Fuß hoch klettern. Nachts, wenn sie schlafen, rutschen sie 2 Fuß zurück. Wie viele Tage braucht die Schnecke, um aus dem Brunnen zu kommen?
Die intuitive Antwort ist
30 Tage, da die Schnecke 30 Tage lang mit 1 Fuß pro Tag klettert, um den Gipfel zu erreichen,
aber eigentlich ist die antwort
28 Tage, da die Schnecke, sobald sie sich 27 Fuß in der Luft befindet (nach 27 Tagen), am 28. Tag einfach die restlichen 3 Fuß nach oben klettert.
Herausforderung
Diese Herausforderung verallgemeinert dieses Rätsel. Bei drei positiven Ganzzahlen als Eingabe, die die Gesamthöhe, die Aufstiegshöhe und die Fallhöhe darstellen, wird die Anzahl der Tage zurückgegeben, die zum Aufstieg aus dem Bohrloch benötigt werden.
Wenn die Schnecke nicht aus dem Brunnen klettern kann, können Sie 0 zurückgeben, einen falschen Wert zurückgeben oder eine Ausnahme auslösen. Sie können auch Code schreiben, der genau dann anhält, wenn eine Lösung vorhanden ist.
Wenn Sie möchten, können Sie die Fallhöhe als negative Ganzzahl verwenden.
Testfälle
(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) -> Keine (81, 14, 14) -> Keine
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort in jeder Sprache.
quelle
Antworten:
Graue Schnecke , 1206 Bytes für numerische E / A, 149 Bytes für unäre E / A
Zum Spass. Zusammensetzung des ersten Programms:
Numerische Eingabe und Ausgabe übernehmen. Eingegeben wird
A
,B
,C
bzw.. Im Vergleich zu anderen (nahen)O(1)
Antworten hat der Code eine Komplexität vonO(n)
. Aber für eine große Anzahl kann es Ihr Gedächtnis zuerst verbrauchen.Hängen Sie, wenn keine Lösung gefunden wird.
f
ist eine (vielleicht) rekursive Funktion, um ganze Zahlen in Punkte umzuwandeln. Argument wird in gespeichert[p]
und in ausgegeben[o]
.U
ist ein FunktionstestS1>=S2
, bei dem ParameterB, A
beim SpeichernA-B
in gespeichert werdenA
.Code ab
D
ist ein Stub, der Punkte in Zahlen umwandelt.Das zugrunde liegende Prinzip ist das gleiche wie bei meiner C-Antwort (Abzocke der falschen Ausgabe für unmögliche Lösungen).
Standalone-Version, 149
156157167170230Bytes, unterstützen nur unäre I / OEingangs Bedürfnisse zu Punkten, zB
..........
für10
.U
berechnetA=A-B
und springt zuD
wannA<=0
. Ansonsten$
ordnetA+C
zuA
und ruft anU
.Hängen Sie, wenn keine Lösung gefunden wird.
Tricks: Missbrauch der Fähigkeit des "Compilers", leere Zeichenketten zu interpretieren. Sie können Bedingungen in
GOTO
Anweisung abreißen , um bedingungslose Sprünge zu machen, und der gleiche Trick funktioniert fürPOP
.Bemerkung: Ich spiele vielleicht mehr Golf mit 3 Bytes, aber wenn ich das tue, hätten meine und WheatWizard's Antwort genau dieselbe Logik. Das Ergebnis ist wahrscheinlich die kürzeste GraySnail-Lösung, und ich versuche, es zu beweisen.
quelle
C # (.NET Core) ,
32 -31 ByteProbieren Sie es online!
Ein rekursiver Ansatz. Wenn die Schnecke nicht entkommen kann, endet sie mit der folgenden Meldung:
Process is terminating due to StackOverflowException.
quelle
a<=b
,a>b
f=(a,b,c)=>a<=b?1:1+f(a-b+c,b,c)
f
für den rekursiven Aufruf verwendet wird.f
und einem Semikolon erfordert, wenn es benannt ist. Das erste , was ich fand , ist dies aber es gibt keinen klaren Konsens hier.f=...
ich nicht sicher bin, ob wir das Semikolon am Ende hinzufügen sollen oder nicht.GREY SNAIL,
219206169167159156146 Byte (unäre E / A)Ich denke, ich kann das ein bisschen runter spielen.
quelle
JavaScript (ES6),
312827 ByteEin paar Bytes gespart dank @Arnauld
Ich hatte nicht bemerkt, dass wir mit einer Ausnahme scheitern könnten. Ziemlich sicher, dass dies optimal ist:
Mit zB einer Variablen zuweisen
f=
, dann like aufrufenf(climb)(fall)(height)
. Wirft,InternalError: too much recursion
wenn der Aufstieg unmöglich ist.JavaScript (ES6), 38 Byte
Eine rekursive Funktion, die die Anzahl der Tage oder
NaN
für nie zurückgibt .Testfälle
Code-Snippet anzeigen
quelle
d=>u=>g=h=>h>u?1+g(h-u+d):1
g=
in der Mitte, weil diese Variable die Zwischenfunktion speichert, die für den rekursiven Aufruf benötigt wird. Die längere Antwort führt einen rekursiven Aufruf ausf
, bei dem der Name in die Byteanzahl einbezogen werden muss.Excel,
5146 Bytes-1 Byte danke an @ Scarabee .
-4 weil INT (x) = FLOOR (x, 1)
Eingabe von den Zellen A1, B1 bzw. C1. Gibt
FALSE
für ungültige Szenarien zurück.quelle
ceiling(x)
ist immer gleich an-floor(-x)
, ich glaube , so dass Sie durch Ersatz von 1 Byte speichern könntenCEILING((A1-B1)/(B1-C1)+1,1)
mit-FLOOR((B1-A1)/(B1-C1)+1,1)
.C (gcc), 39
434446475860BytesNur auf 32-Bit-GCC und alle Optimierungen deaktiviert.
Geben Sie 0 zurück, wenn die Lösung nicht möglich ist. Eine modifizierte Version der ursprünglichen rekursiven Lösung.
Inspiriert von der @Jonah J-Lösung und der @CarlosAlejo C # -Lösung.
Ich werde die erweiterte Version später aktualisieren (nachdem ich meine Gray Snail-Antwort beendet habe).
quelle
Assign instead of return
Java (OpenJDK 8) , 35 Byte
Probieren Sie es online!
Mathe gewinnt!
Credits
quelle
a-c-1
→a+~c
.Python 2 , 37 Bytes
Probieren Sie es online!
Endlich meine rekursive Version unter meiner Standardberechnung (ich habe meiner Funktion eine Zählung übergeben, anstatt eine vor dem Aufruf hinzuzufügen).
Python 2 , 43
46BytesProbieren Sie es online!
Rasiert 3 Bytes durch Tauschen von "__ und 1" gegen "__> 0".
Mit Boolescher Trickserei wird im Wesentlichen Folgendes ausgeführt:
quelle
f=
Ihren Code (die erste Lösung) voranstellen, und Ihre Byteanzahl wird 37, weil er rekursiv ist, sodass Sie ihn nicht anonym lassen können.f=
kann für ein Lambda nur fallen gelassen werden, wenn es nicht recusive ist.R, 43 Bytes
Aus anderen Antworten entlehnt:
Gibt Fehler wenn keine Lösung.
quelle
J, 25 Bytes
Zuerst eine nette Lösung, die ein Betrüger ist, da davon ausgegangen wird, dass "etwas anderes als ein positives ganzzahliges Ergebnis" gleich "Keine" ist:
Erläuterung
2-/\
Verwenden Sie Fenster der Länge 2 für die Eingabe von 3 Elementen und setzen Sie zwischen jedes ein Minuszeichen, das für die Eingabe30 3 2
z. B. zurückgegeben wird27 1
%/
Setzen Sie ein Trennsymbol zwischen jedes Element der Liste. In unserem Fall hat die Liste nur zwei Elemente. Das bedeutet also "27 durch 1 teilen".>:
Inkrement um 1>.
Nimm die Deckeoffizielle Lösung
Hier ist die offizielle Lösung, die Negative und Unendlich in 0 umwandelt. Für diesen Teil konnte ich keine zufriedenstellend knappe Lösung finden:
TIO
quelle
If the snail cannot climb out of the well, you may return 0, return a falsy value, or throw an exception.
Um die Testfälle zu schreiben, habe ich einfachNone
angegeben, dass es keine Antwort gab. Möchten Sie auch eine Erklärung und einen Try it Online-Link hinzufügen?Perl 5 , 37 Bytes
35 Byte Code +2 für
-pa
.Probieren Sie es online!
quelle
PHP> = 7.1, 60 Bytes
Gibt 0 für kein Entrinnen aus
PHP Sandbox Online
PHP> = 7.1, 67 Bytes
druckt nichts für kein Entrinnen
PHP Sandbox Online
quelle
Mathematica,
474039 Bytes-7 Bytes von @KeyuGan
quelle
69, 3, 8
und⌈
als 3 Bytes so weit gezählt , wie ich glaube.Max
, um dieIf
Anweisung zu ersetzen .If[#<=#2,1,Max[⌈(#-#3)/(#2-#3)⌉,0]]&
Ruby ,
4947 BytesWirft eine Ausnahme, wenn die Schnecke nicht herausklettern kann
Probieren Sie es online!
quelle
h-a<1?1:(1.0*(h-a)/[a-b,0].max+1).ceil
besteht die Testfälle und speichert 9 Bytes.Batch, 66 Bytes
Der vorletzte Testfall hat nichts gedruckt und der letzte Testfall ist tatsächlich abgestürzt
CMD.EXE
...quelle
05AB1E , 19 Bytes
Erläuterung:
Für ungültige Werte kann dies einen Wert kleiner als 1 zurückgeben. In 05AB1E ist jedoch nur 1 wahr, sodass die Anforderung erfüllt ist, dass die Ausgabe für einen ungültigen Wert falsch sein muss.
Probieren Sie es online!
quelle
PHP, 60 Bytes
druckt
N
fürNone
. Laufen Sie mit-r
.quelle
05AB1E , 12 Bytes
Probieren Sie es online!
Druckt,
0
falls nicht möglich.Eingabeformat:
quelle
Japt , 12 Bytes
Online testen!
Ausgaben
undefined
für nie, nachdem Sie Ihren Browser möglicherweise für eine Weile eingefroren haben, seien Sie also vorsichtig.Ich bin nicht überzeugt, dass dies optimal ist.
oWV-W l
funktioniert in allen bis auf die letzten drei Fälle ...quelle
Haskell ,
3029 BytesProbieren Sie es online!
Kürzer als die bisherige Haskell-Antwort. Vielleicht kann mich jemand anderes schlagen.
Dies verwendet einen rekursiven Ansatz zur Lösung des Problems. Jede Rekursion ist im Wesentlichen ein Bewegungstag für die Schnecke. Wenn der verbleibende Abstand zum Ende geringer ist als der noch erforderliche Abstand, beenden wir unsere Rekursion.
quelle
(b#c)a=1+sum[(b#c)$a+c-b|a>b]
.b!c
im Listenverständnis ablegen.QBIC ,
3123 BytesIch habe gerade bemerkt, dass sich die Anforderungen geändert haben. Diese Version überprüft nicht, ob die Schnecke jemals die Spitze des Brunnens erreicht.
Die nachstehende Erklärung für die Originalversion, die prüft, ob eine Lösung vorhanden ist, deckt auch alle relevanten Teile dieses Codes ab.
Original, 31-Byte-Antwort:
Erläuterung
Probieren Sie es online! (OK, nicht wirklich: Dies ist eine Übersetzung von QBIC in QBasic-Code, der in der QBasic-Umgebung von repl.it ausgeführt wird.)
quelle
Excel VBA, 47 Bytes
Anonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich
[A1:C1]
derActiveSheet
Objektausgaben in das VBE-Direktfenster aufnimmtDiese hauptsächlich auf Excel-Formeln basierende Lösung scheint kleiner zu sein als jede reine VBA-Lösung, die ich mir vorstellen kann :(
quelle
Haskell, 47
55Bytes (48, wenn Tupel erforderlich)Tupelvariation
Erläuterung
quelle
d>c||c<s
einfach durch ersetzen0<1
, wie Sie dies bereits implizit in Ihrer Erklärung tun, da diesotherwise
nur ein Synonym für istTrue
. 2. Der rekursive Aufruf in Ihrer Tupel-Version wird noch ausgeführt. 3. Sie können Ihre Funktion als definieren,(d#c)s
anstattf d c s
zwei weitere Bytes zu speichern.c<=s
stattc<s
.0
anstelle des-1
vom OP zugelassenen ergibt 38 Bytes: Probieren Sie es online aus!Python 3, 41 Bytes
Fehler für Niemals
Outgolf @veganaiZe
quelle
int(b>=a)
zu1-(b<a)
2 Bytes zu speichern?APL (Dyalog) , 13 Bytes
Probieren Sie es online!
Fehler bei der Division durch Null, wenn die Schnecke nicht aus dem Brunnen klettern kann.
quelle
C # (.NET Core) , 37 Byte
Nicht rekursives Lambda. Verwendet die hier gefundene Formel . Könnte um 6 Byte verkürzt werden, wenn "ein negatives Ergebnis" ein gültiger Weg ist, um einen Fehler zurückzugeben. Derzeit wird stattdessen 0 zurückgegeben.
quelle
h-f-1
kann aber seinh+~f
.Python v2 & v3, 44 Bytes
^ Unendliche Rekursion (Fehler) für den Fall None.
quelle
(x-z-1)//(y-z)+1
. Ich mache nicht viel Python, also könnte ich mich irren ...f=
die Byteanzahl verringern, Leerzeichen um ifs und elses entfernen und zu Python 2 wechseln, bei dem die Ganzzahldivision ein Single ist/
HP-15C Programmierbarer Rechner, 26 Bytes
Die drei Zahlen werden der Reihe nach in den Stapel geladen, bevor das Programm ausgeführt wird. Die Fallhöhe wird als negative Zahl eingegeben. Wenn die Schnecke nicht aus dem Brunnen klettern kann, ist das Ergebnis entweder eine negative Zahl oder ein Fehler # 0 (Nullteilungsfehler).
Op-Codes in hex:
Anweisungsbedeutungen:
Sie können das Programm mit diesem HP-15C-Simulator testen .
quelle
Common Lisp, 49 Bytes
Probieren Sie es online!
Rekursive Funktion, Stapelüberlauf, wenn keine Lösung gefunden wurde.
quelle
PowerShell ,
95 bis94 ByteProbieren Sie es online!
quelle