In einer kürzlichen Folge von QI wurden die ersten 5 Vielfachen von 142857 als Anagramme der ursprünglichen Zahl beschrieben. Natürlich weiß jeder, der diese Zahl nicht nur kennt, dass diese Zahlen tatsächlich zyklisch sind, nicht nur Anagramme. Aber das brachte mich zum Nachdenken.
Bitte schreiben Sie ein Programm oder eine Funktion, die alle sechs- oder wenigerstelligen Zahlen ausgibt, deren richtiger Faktor ein Anagramm für sich ist. Die Liste sollte mit folgenden Zahlen beginnen:
3105 (divisible by 1035)
7128 (divisible by 1782)
7425 (divisible by 2475)
8316 (divisible by 1386)
8712 (divisible by 2178)
9513 (divisible by 1359)
9801 (divisible by 1089)
Wenn Sie es vorziehen, können Sie Zahlen mit einem Anagramm finden, das ein geeigneter Faktor für die Zahl ist. Achten Sie jedoch darauf, führende Nullen aus Ihren Anagrammen auszuschließen.
Dies ist Codegolf, daher gewinnt der kürzeste Code in Bytes, der keine Standardlücken durchbricht.
Antworten:
Mathematica (REPL environment),
7574 BytesVielen Dank an ngenisis, die dies byteweise verbessert haben!
Sort/@IntegerDigits@Divisors@#
erzeugt eine sortierte Liste von Ziffern für jeden Teiler seines Arguments; Die eingegebene Zahl ist selbst ein Divisor, daher ist die sortierte Ziffernliste die letzte.Most@#~MemberQ~Last
Erkennt, ob die zuletzt sortierte Ziffernliste auch in der Liste vor dem letzten Element angezeigt wird. UndSelect[Range[10!],...]
behält nur die ganzen Zahlen bis zu 3.628.800 bei, die diesen Test bestehen (die ausgewählte Grenze, weil sie ein Byte kürzer als 10 6 ist ). Es läuft in ungefähr 5 Minuten auf meinem Computer und liefert eine Liste mit 494 Nummern, von denen die größte 3.427.191 ist. Es gibt 362 Nummern bis zu 10 6 , von denen die größte 989.901 ist.quelle
IntegerDigits@Divisors@#
.Gelee , 12 Bytes
Probieren Sie es online! (verwendet fünf oder weniger Ziffern aufgrund des Zeitlimits von TIO)
Verifizierung
Wie es funktioniert
quelle
ÆḌṢ€ċṢµȷ#
10- mal langsamer ausführen. Auf einem i7-Core dauerte die Ausführung ~ 27 Minuten (nicht unter Unix, nicht schöntime
). Das größte Ergebnis war6671928
.Brachylog , 12 Bytes
Probieren Sie es online!
Dies kann jedoch zu einer Zeitüberschreitung führen, bevor etwas gedruckt wird (und wenn dies nicht der Fall ist, wird nur 3105 gedruckt).
Erläuterung
Diese Zahlen werden auf unbestimmte Zeit gedruckt, da der Autor sagte, es sei akzeptabel, dass das Programm Zahlen mit mehr als 6 Stellen druckt.
Das ist viel zu langsam; Sie können dieses Programm verwenden (und
8300
beliebig ändernN
), um den Druckvorgang ab Zahlen zu starten, die strikt größer als sindN
.Wie @ ais523 betonte, benötigen wir einen Schnitt, um zu vermeiden, dass eine Zahl mehrmals gedruckt wird, wenn mehrere ihrer Faktoren Permutationen davon sind.
quelle
JavaScript (ES6),
103…9694 BytesEine anonyme Funktion, die das Array übereinstimmender Ganzzahlen zurückgibt.
Formatiert und kommentiert
Divisor-Statistik
Bei 6-stelligen Ganzzahlen wird jedes Verhältnis von
2
zu9
zwischen einer übereinstimmenden Ganzzahln
und ihrem Anagramm mindestens einmal angetroffen. Aber einige von ihnen kommen nur ein paar Mal vor:Prüfung
Der folgende Test ist auf den Bereich beschränkt,
[1 ... 39999]
damit die Ausführung nicht zu lange dauert.Code-Snippet anzeigen
quelle
_=>[...Array(1e6).keys()].filter(n=>n&&![...Array(9)].every(_=>n%++i||(F=i=>[...i+''].sort()+'')(n/i)!=F(n),i=1))
.2
bis9
benötigt (8
nur zweimal verwendet wird , für911736
und931176
).Pyke, 14 Bytes
Probieren Sie es hier aus!
Sollte alle Zahlen wie folgt ausgeben, aber mal aus.
Testen Sie den Algorithmus hier!
quelle
Perl 6 , 59 Bytes
Schrecklich langsame Brute-Force-Lösung.
Es wird eine verzögerte Sequenz zurückgegeben, sodass ich die ersten Ergebnisse überprüfen konnte, aber nicht alle Ergebnisse in angemessener Zeit erreichen kann. (Soll ich es als nicht konkurrierend markieren?)
quelle
Pure Bash ,
128126122121120 BytesProbieren Sie es online!
(Dieses Programm ist relativ schnell - es hat nur 14 Minuten gedauert, bis alle 6-stelligen Nummern auf meinem MacBook durchgelaufen sind. Leider läuft TIO ab, da es eine Laufzeitbegrenzung von 1 Minute vorsieht, was nur genug Zeit ist, um durchzukommen die 5-stelligen Zahlen oder so.)
Bash + Unix-Dienstprogramme, 117 Bytes
Dies ist kürzer als die reine Bash-Version, aber einiges langsamer, vermutlich zum großen Teil aufgrund der vielen Gabelungen.
quelle
05AB1E , 15 Bytes
Erläuterung:
Probieren Sie es online! (Dies wird nicht funktionieren, es wird Zeitüberschreitung)
quelle
Japt , 23 Bytes
Probieren Sie es online! Beachten Sie, dass der verknüpfte Code nur bis zu 1e4 berechnet, da 1e6 bei TIO eine Zeitüberschreitung aufweist.
quelle
Python 2, 98 Bytes
quelle
10**6
?x%i==0
kann einfach seinx%i<1
.05AB1E ,
1210 BytesZeitüberschreitung bei TIO aufgrund einer Endlosschleife.
2 Bytes gespart, da wir laut OPs Kommentar mehr als 6-stellige Zahlen ausgeben konnten.
Probieren Sie es online!
Erläuterung
quelle
Batch, 263 Bytes
Schleppend. Wie in, dauert es über einen Tag, bis es auf meinem PC fertig ist. Erläuterung: Das
c
Unterprogramm teilt die ersten beiden Argumente. Wenn der Rest Null ist, berechnet er den Hash des Ergebnisses, indem er die Summe der n-ten Potenzen von 8 für jede Ziffer berechnet. Diese aus der Bash-Antwort gestohlene Hash-Funktion kollidiert nur mit Anagrammen. (Es würde für siebenstellige Zahlen funktionieren, aber ich habe nicht alle vierzehn Tage.) Das dritte Argument wird abgezogen, und die Subroutine wird mit einem wahrheitsgemäßen Ergebnis beendet, wenn dies Null ist. Dien
Subroutine ruft diec
Subroutine einmal auf, um den Hash zu berechnen, und acht weitere Male, um den Hash zu vergleichen. Wenn eine Kollision festgestellt wird, wirdn
die Unterroutine frühzeitig gedruckt und beendet.quelle