Herausforderung:
Ihr Programm nimmt zwei Ganzzahlen n
und k
als Eingabe und gibt die kleinste Ganzzahl aus, die größer (aber nicht gleich) n
ist und mindestens k
Vorkommen der Ziffer enthält 5
.
Sie können davon ausgehen 1 ≤ k ≤ 15
und 1 ≤ n < 10**15
.
Dies ist eine zeitlich begrenzte Herausforderung. Ihr Programm muss für alle Testfälle auf TIO ausgeführt und innerhalb von insgesamt 10 Sekunden abgeschlossen sein.
Allgemeine Regeln:
Dies ist Code-Golf , daher gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich nicht von Code-Golf-Sprachen davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden .Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln . Sie können also STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf. Die Funktionsparameter können in beliebiger Reihenfolge verwendet werden, bitte geben Sie dies in Ihrer Antwort an.
- Standardschlupflöcher sind verboten.
- Sie müssen einen Link mit einem Test für Ihren Code (dh TIO ) hinzufügen .
- Der Antwortheader sollte die Punktzahl in Bytes, aber auch die Gesamtzeit für alle Testfälle auf TIO auflisten
- Wenn Ihre Sprache nicht auf TIO ist, sollte der Code auf Ihrem Computer weit unter 10 Sekunden dauern, damit Sie sicher sind, dass er auf jedem vernünftigen Computer schnell genug ist.
- Es wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.
Testfälle:
(n, k) -> output
(53, 2) -> 55
(55, 1) -> 56
(65, 1) -> 75
(99, 1) -> 105
(555, 3) -> 1555
(557, 1) -> 558
(5559, 3) -> 5565
(6339757858743, 5) -> 6339757859555
(99999999999999, 15) -> 555555555555555
Programmbeispiel:
Dieses Programm ist korrekt.
(n, k) = (45, 1)
ist50
? Einige der Antworten verstehen das falsch.Antworten:
R + stringr,
858476 Bytes, 0,062 s auf TIOProbieren Sie es online aus!
-1 Byte dank Robert S.
-8 Byte dank Giuseppe.
Eine einfache rekursive Lösung wäre, um 1 zu erhöhen, bis die Antwort gefunden ist, aber dies würde die zeitliche Beschränkung nicht erfüllen. Um die zeitliche Beschränkung zu erfüllen, nutzt diese Funktion die Tatsache, dass wir, wenn p 5s fehlen, um 2 * 10 ^ (p-2) inkrementieren können.
Beachten Sie, dass bei p = 1 das Inkrement 0,2 wird. Dies ist in Ordnung, da wir nach 5 Schritten zu einer Ganzzahl zurückkehren und keine der in der Zwischenzeit angetroffenen Dezimalzahlen eine zusätzliche 5 hat. Wenn wir stattdessen um 5 * 10 ^ (p-2) oder um 1 erhöhen würden * 10 ^ (p-2), dann würden wir zum Beispiel f (24, 1) = 24,5 anstelle von 25 finden.
quelle
if
Funktionsvariante.a
gemacht hat, also habe ich es entfernt und es scheint in Ordnung zu sein.Gelee , 37 Bytes 0,113 s auf TIO
Probieren Sie es online aus!
Das funktioniert von
k
und machen Sie eine Zahl mit so vielen Fünfernquelle
[557,1]
(ergibt558
statt560
); Testfall in der Beschreibung scheint falsch, da[557,2]
sollte558
stattdessen ergeben.05AB1E ,
3332 BytesPort of @NickKennedys erstaunlicher Ansatz in seiner Jelly-Antwort , also stellen Sie sicher, dass Sie ihn positiv bewerten !!
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Stax , 17 Bytes (insgesamt 6,861 Sekunden bei TIO)
Führen Sie es aus und debuggen Sie es
Dieses Programm nimmt
k
undn
auf Standardeingabe durch Leerzeichen getrennt. Stax bietet keine bequeme Möglichkeit, mehrere Testfälle auf TIO auszuführen. Daher habe ich jede Eingabe separat ausgeführt und die Zeit addiert. In 99% der Fälle wird der Interpreterprozess gestartet. Mit dem Javascript-Interpreter in staxlang.xyz werden alle Testfälle in 50 Millisekunden ausgeführt.Letzter Testfall auf Try it online!
Vorgehensweise :
5
s vorhanden sind , beenden und druckent
= Anzahl der nachgestellten5
s in der Anzahl10 ** t
quelle
Python 2 ,
7068 Bytes (0,025 Sekunden bei TIO)Probieren Sie es online aus!
Dies könnte ein bisschen langwierig sein; Es ist in allen Fällen korrekt und endet in vernachlässigbarer Zeit für die Testfälle, in einigen anderen Fällen jedoch nicht in angemessener Zeit. Es erfüllt jedoch technisch die Anforderungen.
Kurz gesagt, wenn die kleinste Zahl mit
k
fünf größer als istn
, verwenden wir diese Zahl, da dies offensichtlich die richtige Lösung ist. Ist dies nicht der Fall, greifen wir auf den rekursiven Standardansatz zurück.quelle
Perl 5
-pl
, 44 BytesProbieren Sie es online aus!
Findet, was die Zahl ist, ohne die nachgestellten 5s. Erhöht diesen Teil um 1. Fährt fort, bis genügend 5s in der Zahl sind. Es dauert ungefähr 0,012 Sekunden auf TIO, um alle Testfälle auszuführen.
quelle
Python 3 ,
144988675 BytesProbieren Sie es online aus!
Der Algorithmus besteht darin, jede Ziffer (beginnend mit der niedrigstwertigen) auf den nächsten Wert von 5 aufzurunden, bis die Dezimaldarstellung der neuen Zahl die gewünschte Anzahl aufweist.
Der ursprüngliche Ansatz verwendete ein abbrechbares Listenverständnis (D = iter (Bereich (k)) und Liste (D) bei der Arbeit hier), aber @ ASCII-only hat mich überzeugt, dass Code-Golf niemals gewinnen wird. Ich mag keine Rekursion, aber wenn der Algorithmus so geschrieben ist, dass die Rekursionstiefe minimiert wird, ist ein zukünftiger Compiler / Interpreter klug genug, um ihn als while-Schleife erneut zu implementieren.
quelle
(-(-~n//l+5))%10
ist der GrundPython 3 , 59 Bytes
Rekursive Lösung. Die Rekursionstiefe ist ein Problem (muss für höhere Zahlen geändert werden), ist aber korrekt.
Probieren Sie es online aus!
quelle
Python 3, 72 Bytes
Probieren Sie es online aus!
quelle
Java 8, 69 Bytes, 60+ Sekunden auf TIO mit dem letzten Testfall, ~ 1,5 Sekunden ohne.
Hat jemand eine Idee, wie man den letzten Testfall besteht?
quelle
PHP ,
10997 Bytes (<0,03 s bei TIO)Probieren Sie es online aus!
Basierend auf dem Algorithmus von @ recursive .
quelle
Netzhaut , 63 Bytes
Probieren Sie es online aus! Nimmt
n
undk
in separaten Zeilen, aber Link enthält Header, der die Testsuite in das entsprechende Format konvertiert. Erläuterung:In unary konvertieren
k
.Inkrementieren
n
. Das*
wiederholt sein rechtes Argument (hier das erste_
Zeichen) so oft, wie es von seinem linken Argument angegeben wird (das wie hier standardmäßig mit der Übereinstimmung übereinstimmt). Dies führt zu einer Zeichenfolge dieser Länge. Das$(
(das)
ist impliziert) verkettet dann das mit dem zweiten_
und.
bewirkt, dass die resultierende Länge genommen wird. (Tatsächlich ist Retina 1 klüger als das und führt zunächst nur die Berechnung der zugrunde liegenden Längen durch.)Testen Sie, ob genügend
5
s gefunden werden können, umn
mit dem_
s der unären Darstellung von übereinzustimmenk
. Dieser Test wurde golfen und wäre dreimal schneller mit dem^
Hinzufügen nach dem ersten/
und noch schneller, wenn[^5]
er anstelle von verwendet würde.
.Bis der Test bestanden ist ...
... inkrementieren,
n
aber abschließende5
s ausschließen.Löschen
k
.quelle
Clam , 30 Bytes, ~ 0,2 s auf TIO
Transpiles zu diesem JS (vollständige Testsuite für das Timing hinzugefügt), wo
inputs
sich ein Array der Eingaben befindet (n
erste,k
zweite)Danke @ArBo für den Ansatz
Erläuterung
quelle
C (gcc) ,
159158152150149 Bytes, ~ 0,04 sGibt die Antwort an STDOUT mit führenden Nullen aus.
-3 Byte dank Deckenkatze
Probieren Sie es online aus!
quelle