Zielsetzung
Geben Sie die Eingabe ein r
und n
finden Sie die ersten n
natürlichen Zahlen x
so, dass wir erhalten, wenn wir die erste Ziffer an die letzte Stelle drehen x/r
.
Sie können davon ausgehen, dass 2 <= r <= 9
und 1 <= n <= 65535
.
Sie können ein Programm schreiben, das Eingaben von stdin- oder Befehlszeilenargumenten entgegennimmt. oder Sie können eine Funktion schreiben, die r
und n
als Parameter verwendet. Die Ausgabe sollte jedoch zu stdout sein. Die Ausgabe sollte eine Zeile pro Wert von sein x
, formatiert als x/r=y
, in der Reihenfolge der Erhöhung x
.
Ihre Lösung muss in der Lage sein, alle gültigen Fälle innerhalb einer Minute auf einem vernünftigen Desktop-Computer zu bearbeiten.
Testfälle
Eingabe: 4 5
Ausgabe:
102564/4=25641
205128/4=51282
307692/4=76923
410256/4=102564
512820/4=128205
Eingabe: 5 1
Ausgabe:714285/5=142857
Dies ist Code-Golf, also gewinnen die wenigsten Bytes. Die Gewinnerantwort wird in 4 Wochen (19.09.2014) angenommen.
Credits für diese Frage gehen an meinen Kollegen, der mir erlaubt hat, diese Frage hier zu posten :)
quelle
gprof
verbringt ein Eingabefall für mein Programm weniger als eine halbe Sekunde in meinem Code, dauert aber insgesamt etwa 80 Sekunden, von denen ich annehme, dass sie die Ausgabe größtenteils blockieren.printf
.Antworten:
Haskell,
182179Zweite Version, wahrscheinlich weiter golfbar, aber diesmal mit "richtigem" Algorithmus. Insbesondere endet es innerhalb weniger Minuten mit
r=4
undn=65535
, aber andererseits ist mein Computer weder vernünftig noch ein Desktop, so dass die Wahrscheinlichkeit besteht, dass dies auf anderen Computern innerhalb einer Minute bleibt.Es basiert auf der Idee, dass
x=10^k*a + m
, wo seine erste Ziffer0≤a≤9
zum Ende verschoben wird, um zu erhalteny=10*m+a
. Eine wenig Mathematik zeigt , dassm
kann , wie sie erhalten werdena*(10^k-r)/(10*r-1)
, so dass wir einfach scannena
über[1..9]
für allek
von 0 bis unendlich, und halten und die erstenn
Druckergebnisse , für die der obige Ausdruck fürm
integral ist.Das
fromIntegral
ist erforderlich , weilread
ing eine Liste mitn
als eines ihrer Elementen inmain
, in Kombination mit der Verwendung vonn
intake
, zwingen würde ,r
zuInt
ganzen, was zu bösen überläuft mit den großen Zahlen in Frage. Ich hätte verwenden könnengenericTake
, aber das erfordert eineimport
.Dieser Code hat auch den Vorteil, dass er fast trivial ist, um auf andere Basen als 10 erweitert zu werden.
Die Eingabe wird gelesen
stdin
, die beiden Werte können durch ein beliebiges Leerzeichen getrennt werden.quelle
r = 5; n = 65535
innerhalb einer Minute lösen ?y`mod`10
mitmod y10
, was ein Zeichen kürzer istPure Bash (keine externen Dienstprogramme), 80 Byte
Beachten Sie, dass bash nur Ganzzahlarithmetik und kein Gleitkomma ausführt. Wir prüfen daher, ob
x == y * r
anstelle vonx / r == y
. Auch die Multiplikation sollte im Allgemeinen schneller sein. Dies entspricht jedoch bei weitem nicht den Leistungsanforderungen.Ausgabe:
quelle
C 468
(Einige Zeilenumbrüche, die nicht in der Byteanzahl gezählt wurden, wurden oben hinzugefügt, um Bildlaufleisten zu entfernen. Ja, die letzte Zeilenumbruch wird gezählt.)
Erwartet Argumente in der Befehlszeile und geht davon aus, dass die Standardausgabe ASCII akzeptiert. Die Laufzeit ist O (Anzahl der ausgegebenen Bytes) = O (n * n).
Nein, ich kann nicht verwenden
printf
. Das dauert zu lange und schiebt das Programm über das Minutenlimit auf meinem Desktop. Einige Testfälle dauern ungefähr 30 Sekunden.Der Algorithmus behandelt die Ausgabe als Zeichenfolgen und nicht als Zahlen, da sie schnell enorm werden und die Ausgabe starke Muster enthält.
Etwas ungolf:
Beweis
dass das Programm das Problem löst:
(Nehmen Sie im Beweis, dass alle Operatoren und Funktionen die realen mathematischen Funktionen sind, nicht die Computeroperationen, die sie approximieren.
^
Bezeichnet Exponentiation, nicht bitweises xor.)Aus Gründen der Klarheit werde ich eine Funktion verwenden
ToDec
, um den normalen Vorgang des Schreibens einer Zahl als Folge von Dezimalstellen zu beschreiben. Seine Reichweite ist die Menge der bestellten Tupel auf{0...9}
. Beispielsweise,n
Definieren Sie für eine positive GanzzahlL(n)
die Anzahl der Stellen in der Dezimaldarstellung vonn
; oder,Definieren Sie für eine positive Ganzzahl
k
und eine nicht negative Ganzzahln
mit die reelle Zahl, die durch Hinzufügen von Nullen vor den Dezimalstellen von , falls erforderlich, um die Gesamtzahl der Stellen zu erhalten , und anschließende unendliche Wiederholung dieser Stellen nach dem Dezimalpunkt erhalten wird. Z.BL(n)<k
Rep_k(n)
n
k
k
Beim Multiplizieren werden
Rep_k(n) * 10^k
die Ziffernn
vor dem Dezimalpunkt und die (mit Nullen aufgefüllten) Ziffernn
nach dem Dezimalpunkt unendlich wiederholt. Sor
Angenommen, eine positive ganze Zahlx
ist eine Lösung für das Problem, undwo
x_1 != 0
undk = L(x)
.Eine Lösung zu sein,
x
ist ein Vielfaches vonr
undDas Anwenden der
Rep_k
Funktion ergibt eine schöne Gleichung:Mit seiner geschlossenen Form von oben,
x_1
muss im Set sein{1 ... 9}
.r
wurde angegeben, um im Satz zu sein{2 ... 9}
. Die Frage ist nun nur, für welche Wertek
die obige Formelx
eine positive ganze Zahl ergibt. Wir werden jeden möglichen Wertr
einzeln betrachten.Wenn
r
= 2, 3, 6, 8 oder 9 ist,10r-1
ist 19, 29, 59, 79 bzw. 89. In allen Fällen ist der Nennerp = 10r-1
Primzahl. Im Zähler10^k-1
kann nur ein Vielfaches von seinp
, was passiert, wennDer Satz von Lösungen wird unter Addition und unter Subtraktion geschlossen, was nicht zu einer negativen Zahl führt. Die Menge umfasst also alle Vielfachen eines gemeinsamen Faktors, was auch die am wenigsten positive Lösung für ist
k
.Wann
r = 4
und10r-1 = 39
; oder wannr = 7
und10r-1 = 69
, der Nenner ist dreimal eine andere Primzahlp=(10r-1)/3
.10^k-1
ist immer ein Vielfaches von 3, und wieder kann kein anderer Faktor im Zähler ein Vielfaches von seinp
, so dass sich das Problem wieder auf reduziertund wieder sind die Lösungen alle Vielfachen der am wenigsten positiven Lösung für
k
.[Nicht beendet...]
quelle
Python -
9190Hier ist ein erster Schuss:
Bearbeiten: Ok, es ist wahrscheinlich viel zu langsam, um das erforderliche 1-Minuten-Zeitlimit für 65K-Nummern einzuhalten.
quelle
JavaScript - 145
nicht golfen:
quelle
(5,4)
. Der Grund, warum es nicht funktioniert, ist, dass die Zahlen sehr groß werden. a) Viel größer als eine Zahl in JS kann genau und b) viel zu groß sein, als dass es möglich wäre, alle Zahlen zu durchlaufen, um dorthin zu gelangen.Python 3 -
223179 BytesPython-Implementierung der Lösung von TheSpanishInquisition:
Lauf:
python3 <whatever you named it>.py
Ausgabe:
Ergebnisse:
https://oeis.org/A092697 ist der erste Wert für jedes r.
Es scheint, dass nur bestimmte Werte von k Antworten liefern und dass das Intervall regelmäßig ist. ZB für r = 4:
Die Intervalle sind:
Dies bildet https://oeis.org/A094224 .
Mit diesen Werten kann eine effizientere Version erstellt werden:
Ich kann jedoch (noch) nicht beweisen, dass dies mathematisch weitergeht.
Ergebnisse für r = 5:
quelle
9 65535
?unsigned long long
und es multicore machen, das in einer Minute zu tun.unsigned long long
es 64 Bit ist, ist es nicht groß genug.