Ein lustiges Äquivalenzpaar ist 1 + 5 = 2 · 3 und 1 · 5 = 2 + 3 . Es gibt viele wie diese, eine andere ist 1 + 1 + 8 = 1 · 2 · 5 und 1 · 1 · 8 = 1 + 2 + 5 . Im Allgemeinen entspricht ein Produkt von n positiven Ganzzahlen einer Summe von n positiven Ganzzahlen und umgekehrt.
In dieser Challenge müssen Sie alle diese Kombinationen positiver Ganzzahlen für eine Eingabe n> 1 mit Ausnahme von Permutationen generieren . Sie können diese in jedem vernünftigen Format ausgeben. Zum Beispiel sind alle möglichen Lösungen für n = 3 :
(2, 2, 2) (1, 1, 6)
(1, 2, 3) (1, 2, 3)
(1, 3, 3) (1, 1, 7)
(1, 2, 5) (1, 1, 8)
Das Programm, das auf meinem 64-Bit-Intel-Ubuntu-Laptop mit 2 GB RAM die meisten Kombinationen für die höchsten n in einer Minute generiert, gewinnt. Wenn Ihre Antwort mehr als 2 GB RAM belegt oder in einer Sprache verfasst ist, die ich mit frei verfügbarer Software nicht testen kann, werde ich Ihre Antwort nicht bewerten. Ich werde die Antworten in zwei Wochen testen und den Gewinner auswählen. Später nicht konkurrierende Antworten können natürlich noch gepostet werden.
Da nicht bekannt ist, wie viele Lösungen für alle n vollständig sind, können Sie Antworten veröffentlichen, die unvollständige Lösungen generieren. Wenn jedoch eine andere Antwort eine (vollständigere) Lösung erzeugt, gewinnt diese Antwort , selbst wenn ihr Maximum n kleiner ist.
Zur Verdeutlichung folgt der Bewertungsprozess, um den Gewinner zu bestimmen:
Ich werde Ihr Programm mit n = 2, n = 3 usw. testen. Ich speichere alle Ihre Ausgaben und stoppe, wenn Ihr Programm mehr als eine Minute oder mehr als 2 GB RAM benötigt. Jedes Mal, wenn das Programm für eine bestimmte Eingabe n ausgeführt wird, wird es beendet, wenn es länger als 1 Minute dauert.
Ich schaue mir alle Ergebnisse für alle Programme für n = 2 an. Wenn ein Programm weniger gültige Lösungen liefert als ein anderes, wird dieses Programm eliminiert.
Wiederholen Sie Schritt 2 für n = 3, n = 4 usw. Das letzte stehende Programm gewinnt.
quelle
Antworten:
C (gcc) , n = 50000000 mit 6499 ergibt 59 s
Um zu vermeiden, dass mehr als ein Terabyte Ausgabe erzeugt wird, die fast nur aus 1 besteht, wird eine Folge von (beispielsweise) 49999995 1s mit abgekürzt
1x49999995
.Probieren Sie es online!
quelle
Mathematica, n = 293 mit 12 Lösungen
OP hat die Herausforderung geändert und fragt nach Eingabe.
Hier ist der neue Code, der ein beliebiges n als Eingabe akzeptiert.
Für n = 293 erhalten Sie die 12 Lösungen
Eingang
Sie können diesen Algorithmus auf Wolfram Sandbox testen, einer online frei verfügbaren Software.
Folgen Sie einfach dem Link, fügen Sie den Code ein (Strg + V), fügen Sie die Eingabe am Ende des Codes ein und drücken Sie Umschalt + Eingabetaste, um die Anwendung auszuführen.
Sie erhalten alle meine Lösungen in Sekunden
Hier geht es auch online! in C ++ (gcc)
(Vielen Dank an @ThePirateBay für die Unterstützung und Übersetzung meines Codes in eine freie Sprache)
Dieses Programm erzeugt nur Lösungen der Form {a, b, c} {a, b, c},
was a + b + c = a * b * c bedeutet
Die Berechnung dauert 1 Sekunde
Die zwölf Lösungen sind:
quelle
Python 2 , n = 175, 28 ergibt 59s
Es wurde mit einem Reduktionsfaktor von 2 etwas langsamer gemacht, es werden jedoch mehr Lösungen ab n = 83 erhalten
Ich erhalte Ergebnisse für n bis zu 92 bei TIO in einem einzigen Lauf.
Probieren Sie es online!
quelle
Ruby , n = 12 ergibt 6 Lösungen
Zumindest auf TIO, übliche Ergebnisse für 1 bis 11
Probieren Sie es online!
Erhält 10 Ergebnisse unter einer Minute für n = 13 auf meinem Laptop.
quelle
Mathematica, n = 19 mit 11 Lösungen
Das ist meine neue Antwort nach den neuen Kriterien von OP
Wenn Sie am Ende eine Eingabe [n] eingeben, zeigt das Programm die Lösungen an
Hier sind meine Ergebnisse (auf meinem alten Laptop 64-Bit 2,4 GHz)
quelle
Haskell, viele Lösungen schnell
f
Berechnet die Lösungen,main
fügt die Funktion hinzu, die Eingabe von der Befehlszeile und einige Formatierungen und Zählungen zu erhalten.quelle
ghc -O3 -o prodsum prodsum.hs
folgt : und führen Sie das Kommandozeilenargument aus:./prodsum 6
Haskell , n = 10 mit 2 Lösungen
Das funktioniert wie Scheiße, aber ich habe es zumindest behoben, sodass ich mich jetzt der Herausforderung annehme!
Probieren Sie es online!
quelle
Axiom, n = 83 in 59 Sekunden hier
Ergebnisse:
Die Möglichkeit, Text in Axiom zu überschreiben, besteht darin, den gesamten Text in eine Datei zu kopieren und die Datei unter folgendem Namen zu speichern: Name.input. Verwenden Sie in einem Axiom-Fenster ") read absolutepath / Name".
Ergebnisse: (# f (i) ermittelt die Länge des Arrays f (i), dh die Anzahl der Lösungen)
quelle