Dieses Problem ist mit roher Gewalt recht einfach zu lösen. Tatsächlich wird es auch ziemlich schnell sein, Gewalt anzuwenden. Aber wo ist der Spaß dabei?
Das Problem
Erstellen Sie eine Liste aller eindeutigen 5-stelligen Zahlenpaare, die sich summieren 121212
. Jede Dezimalstelle muss jedoch in jeder Zahl genau einmal vorkommen. Ein gültiges Paar wäre also (98167, 23045)
. Ein ungültiges Paar wäre jedoch, (23456, 97756)
weil 7, 5, 6
es mehr als einmal wiederholt wird und 1, 8, 0
überhaupt nicht verwendet wird. Es gibt genau 192 einzigartige Paare.
Regeln
Effizienz: Sie können dies brutal erzwingen. Aber das ist trivial. Stattdessen besteht die eigentliche Herausforderung darin, einen Weg zu finden, um die Liste der Zahlen effizient zu erstellen.
Quellcode-Anforderungen: Die Nummernliste (oder ein Teil davon) kann nicht gespeichert werden. Die Nummernfolge muss im laufenden Betrieb generiert werden.
Habe Spaß!
quelle
Antworten:
JavaScript
Gehostet unter: http://ebusiness.hopto.org/findpairs.htm
Mathematische Realisierung: Wenn Sie ein Paar haben, können 15 andere trivial durch Vertauschen von Ziffern zwischen den beiden Zahlen erzeugt werden. Daher suche ich nur nach Zahlen, bei denen die Ziffern der ersten alle größer als die Ziffern der zweiten sind, und gebe dann einfach alle aus Permutationen.
Ich gehe von den niedrigstwertigen Ziffern aus und generiere die Sequenz als Baumdurchquerung für jeden Schritt, in dem bestätigt wird, dass das Zwischenergebnis korrekt ist und keine Ziffern zweimal ausgegeben werden. Mit diesen Methoden muss die Funktion insgesamt nur 50 Mal aufgerufen werden. Auf meinem Computer liefert Chrome Laufzeitergebnisse von normalerweise 2 ms.
quelle
C ++
http://www.ideone.com/Lr84g
quelle
10!/2
), und prüfen dann, ob er auf 121212 summierbar ist. Für einen ersten Lauf überhaupt nicht schlecht. Aber ich bin immer noch neugierig, ob wir effizienter werden können ...(51430, 69872)
es sich um ein gültiges Paar handelt. Sie können die Ziffernliste (0123456789
) und die Summe (121212
) vorab speichern .Python 2.
Es ist ziemlich effizient, weil es die Zahlen konstruiert (die innerste Schleife wird insgesamt 4570 Mal ausgeführt) und ziemlich kurz, weil ich ein wenig Golf gespielt habe (201 Zeichen), aber ich bin mir nicht sicher, ob ich das erklären möchte :)
Die zurückgegebenen Werte sind jedoch ziemlich eigenartig: Rufen Sie
w
mit einem leeren Tupel auf, und Sie erhalten einen Iterator mit 10 Tupeln. Diese 10 Tupel sind leider die Ziffern der beiden Zahlen rückwärts und abwechselnd , dh das Tupelrepräsentiert die Nummern 51430 und 69782.
Prüfung:
Hier ist die ungolfed Version:
quelle
C.
Dies durchläuft alle Paare von 5-stelligen Zahlen, die sich zu 121212 summieren (dh 39393 Iterationen oder ~ 1/46 der Iterationen, die von der Antwort von fR0DDY verwendet werden ). Für jedes Paar bildet es eine Bitmaske der Ziffern in jeder Zahl und prüft dann, ob sie ODER bis 0b1111111111 sind.
quelle
Javascript (481)
http://jsfiddle.net/XAYr3/4/
Grundidee: Generieren Sie Kombinationen gültiger Ziffern, die in der Spalte ganz rechts verwendet werden können. Zum Beispiel (0,2), (3,9), (4,8), (5,7). Suchen Sie für jede Kombination rekursiv Paare, die für die von rechts nächste Ziffer funktionieren, ohne die Ziffern im ersten Paar zu duplizieren. Wiederholen, bis ein Paar 5-stelliger Zahlen generiert wurde. Kombinieren Sie alle diese Ergebnisse zu einem einzigen Array, und die Liste enthält 192 Elemente. Dies sollte meiner Meinung nach ungefähr die wenigsten Iterationen erfordern, aber die gesamte Array-Zuweisung / Freigabe macht es insgesamt etwas ineffizient.
Meine Zähltests zeigen, dass die Funktion
f
310-mal aufgerufen wird, die innere Schleifei
insgesamt 501-mal ausgeführt wird (über alle Aufrufe vonf
) und die innere-innere Schleifej
768-mal ausgeführt wird (über alles).quelle
Python, 171 Zeichen
Der Code behält die Invariante bei
x
,y
diec
Ziffern hat und dass alle nicht verwendeten Ziffern im Satz enthalten sindd
.Die Routine
R
wird insgesamt 841 Mal aufgerufen, was ziemlich effizient ist.quelle
C ++
http://www.ideone.com/Lr84g
quelle