Dies ist meine erste Frage, also hoffe ich, dass es gut geht.
Hintergrund:
Es sind nicht die Flüsse, an die Sie denken könnten. Die Frage dreht sich um das Konzept der digitalen Flüsse. Ein digitaler Fluss ist eine Folge von Zahlen , bei denen die Zahl hinter n
ist n
plus die Summe der Ziffern.
Erläuterung:
Auf 12345 folgt 12360, da 1 + 2 + 3 + 4 + 5 = 15, und 12345 + 15 ergibt 12360. In ähnlicher Weise folgt 145 auf 155. Wenn die erste Nummer eines digitalen Flusses lautet M
, nennen wir ihn Fluss M
.
Zum Beispiel: Fluss 480 ist der Sequenzbeginn {480.492.507.519 ....} und Fluss 483 ist der Sequenzbeginn {483.498.519, ....}. Normale Bäche und Flüsse können sich treffen, und das gilt auch für digitale Flüsse. Dies geschieht, wenn zwei digitale Flüsse dieselben Werte teilen.
Beispiel:
Der Fluss 480 trifft den Fluss 483 um 519. Der Fluss 480 trifft den Fluss 507 um 507 und trifft nie den Fluss 481. Jeder digitale Fluss trifft schließlich auf den Fluss 1, den Fluss 3 oder den Fluss 9.
Schreiben Sie ein Programm, das für eine bestimmte Ganzzahl n
den Wert bestimmen kann, bei dem der Fluss n
zuerst auf einen dieser drei Flüsse trifft.
Eingang
Die Eingabe kann mehrere Testfälle enthalten. Jeder Testfall belegt eine separate Zeile und enthält eine Ganzzahl n
( 1 <= n <= 16384
). Ein Testfall mit dem Wert 0
für n
beendet die Eingabe und dieser Testfall darf nicht verarbeitet werden.
Ausgabe
Geben Sie für jeden Testfall in der Eingabe zuerst die Testfallnummer (ab 1) aus, wie in der Beispielausgabe gezeigt. Dann wird auf einer separaten Zeilenausgabe die Zeile "trifft zuerst auf den Fluss x bei y". Hier ist y der niedrigste Wert, bei dem der Fluss n
zuerst auf den Fluss trifft x
(x = 1 oder 3 oder 9). Wenn Fluss n
trifft Fluss x
an y
für mehr als einen Wert von x
, Ausgabe der niedrigste Wert. Drucken Sie eine leere Zeile zwischen zwei aufeinander folgenden Testfällen.
Testfall
Eingang:
86
12345
0
Ausgabe:
Case #1
first meets river 1 at 101
Case #2
first meets river 3 at 12423
Wertung:
Der schnellste Algorithmus gewinnt. Im Falle einer Krawatte. Der mit dem kürzeren Code gewinnt.
Vielen Dank an mbomb007 für den Hinweis auf meinen Fehler.
ps: Ich möchte eher die schnellste als die kleinste Lösung haben. Ich habe auch eine Lösung von mir, die langsam ist. Dafür schauen Sie hier .
Hinweis:
Ich werde dies für Code-Tests verwenden. Und Leistungsprüfung.
quelle
M
, nennen wir ihn FlussM
" ist aus zwei Gründen nicht sinnvoll: Erstens, wenn ein Fluss eine unendliche Folge von Zahlen ist, hat er keine letzte Ziffer; und zweitens bedeutet Fluss im nächsten Absatz den FlussM
, der bei Nummer beginntM
.Antworten:
C 320
294BytesKompilieren Sie mit -std = c99
Ungolfed:
Versuch es!
Im Wesentlichen werden die "Ziel" -Flüsse erhöht, bis sie größer sind als der Fluss, gegen den wir testen, und danach wird der Testfluss erhöht. Dies wird wiederholt, bis der Testfluss einem anderen Fluss entspricht.
Ich lese in diesem Programm keine Parameter über die Befehlszeile und bin mir nicht sicher, ob Sie das sollen.Jetzt können Sie Parameter an STDIN übergeben. Sie können den Vorgang beenden, indem Sie eine nicht numerische Eingabe übergeben.Auch verdammt, um eine halbe Stunde geschlagen.
quelle
JavaScript (ES6)
Dies ist eine ziemlich schnelle Antwort mit einer ziemlich langsamen Sprache. In Wirklichkeit sollte die Ausführung von Zeit kein Problem sein, wenn eine Sprache mit Hash-Tabellen verwendet wird. Alle meine Tests unter 100 ms.
Anonyme Methode mit der Liste der Testfälle als Eingabeparameter.
quelle
Java 7,
519505 BytesJa, es ist lang, hässlich und kann ohne Zweifel komplett auf Code-Golf umgestellt werden. Ich bin sowohl abgelenkt als auch müde, also sollte ich es vielleicht einfach wieder löschen.
Es war eine ziemlich schwierige Herausforderung, um ehrlich zu sein. Aber zumindest hast du deine erste Antwort ..;) (Die könnte sogar länger sein als dein ursprüngliches ungolviertes C ++ - Programm .. xD)
Ungolfed & Testfälle:
Probieren Sie es hier aus.
Ausgabe:
quelle
Compilation time: 0.62 sec, absolute running time: 0.14 sec, cpu time: 0.11 sec, memory peak: 22 Mb, absolute service time: 0,77 sec
für mich vor Ort. Also ja, es ist ziemlich langsam.Scala, 774 Bytes
Geige: http://scalafiddle.net/console/4ec96ef90786e0f2d9f7b61b5ab0209b
Ich habe keine Lust, Golf zu spielen. Es findet eine Lösung für das gestellte Problem innerhalb von 50 ms
Die Verwendung entspricht möglicherweise nicht genau Ihren Wünschen:
scala river.scala
Jetzt können Sie fortlaufend Zahlen eingeben, gefolgt von einer Eingabe. Beenden Sie das Programm mit 0. Das Ergebnis wird gedruckt, sobald Sie die Eingabetaste drücken.
quelle
C 228
283300BytesDies ist eine Modifikation von Yakovs Code, um die Flussmuster auszunutzen. Dies macht es ~ 3x schneller. Ganzzahlen ohne Vorzeichen vermeiden außerdem die
cltod
Strafe auf 64-Bit-Computern, sodass sie einige Bytes länger, aber geringfügig schneller sind.Ungolfed:
Erläuterung:
Dies wählt den richtigen Fluss aus. Fluss 1 trifft auf jeden anderen Fluss, daher verwenden wir diesen Fall als Fallback-Fall. Wenn 3 der größte gemeinsame Teiler des Testflusses ist, wählen wir Fluss 3 (
1 + !(i%3)*2
). Wenn 9 der größte gemeinsame Teiler des Testflusses ist, überschreiben wir die vorherigen Werte und wählen Fluss 9 aus.Warum funktioniert das? Fluss 9 geht 9, 18, 27, 36 usw. Dies wird jedes Mal um ein Vielfaches von 9 schrittweise durchgeführt, sodass es immer der kürzeste Weg zu einem Schwesterfluss ist. Fluss 3 wird jedes Mal um ein Vielfaches von 3 schrittweise ausgeführt: 3, 6, 12, 15, 21 usw. Während Flüsse, die ein Vielfaches von 9 sind, auch ein Vielfaches von 3 sind, wählen wir sie zuerst als Fluss 9 aus und lassen nur den Vielfache von 3. Der Rest trifft zuerst auf Fluss 1: 1, 2, 4, 8, 16, 23, 28 usw.
Sobald wir unseren richtigen Fluss ausgewählt haben, gehen wir die beiden Flüsse entlang, bis sie sich treffen.
quelle
Python 3, 144 Bytes
quelle
C.
Sehr einfach, es sieht nur so lange aus, weil ich alle 3 Flüsse ausgerollt habe. Es generiert zuerst die 3 Flüsse bis zu
RIVER_LENGTH
(was hoffentlich groß genug ist) und führt dann für jeden SchrittN
eine binäre Suche in allen drei Strömen durch, um festzustellen, ob es sich in einem von ihnen befindet. Dies funktioniert, da die Streams bereits sortiert sind, sodass wir die Eincheckzeit für die Enthaltene durchführenlog(n)
können.Es wird zuerst eine Zahl für die Anzahl der Fälle benötigt, anstatt
0
das Ende der Eingaben abzugrenzen, da Sie wissen, C. Dies dient nur der Bequemlichkeit und hat keinen wirklichen Einfluss auf irgendetwas. Ich hoffe, es ist in Ordnung.quelle