Einige Zahlen wie: 6, 12, 20, 30, 42, 56, 60, 90, 120 usw. können als Produkt aufeinanderfolgender ganzzahliger Zahlen ausgedrückt werden, wie nachstehend gezeigt.
6 = 2 * 3
12 = 3 * 4
30 = 5 * 6
60 = 3 * 4 * 5
90 = 9 * 10
120 = 4 * 5 * 6
Schreiben Sie ein Programm oder eine Funktion, die eine Liste aufeinanderfolgender ganzer Zahlen ausgibt, deren Produkt der angegebenen Zahl entspricht.
Beispiele für Zahlen, die für diese Logik nicht geeignet sind, sind:
99 = 9 * 11 (Product of non-consecutive numbers)
121 = 11 * 11 (Same numbers)
2 = 1 * 2 (Product of itself and 1)
13 = 13 (Product of only one number)
Bitte beachten Sie, dass 2 = 2 * 1
wir dies für den Fall von nicht als gültiges Ergebnis betrachten, da eine ganze Zahl multipliziert mit 1 dasselbe Ergebnis ergibt. Bei dieser Frage würden wir nur ganze Zahlen> = 2 im Produkt berücksichtigen.
Eingang
Eine gültige positive 32-Bit-Ganzzahl. Kann aus der Standardeingabe, einem Funktionsargument usw. stammen.
Ausgabe
Eine Liste aufeinanderfolgender ganzzahliger Zahlen> = 2 (in aufsteigender oder absteigender Reihenfolge). Wenn es mehrere Kombinationen aufeinanderfolgender Ganzzahlen gibt, reicht es aus, nur eine Instanz anzugeben. Wenn Sie mehr zur Verfügung stellen, ist es in Ordnung.
Beschränkungen
Der Code sollte eine angemessene Zeit (<5 Minuten) benötigen, um auf einem Standardcomputer für alle gültigen Eingaben (positive 32-Bit-Ganzzahlen) ausgeführt zu werden. Wenn es ein aufeinanderfolgendes ganzzahliges Produkt gibt, sollte der Code innerhalb des Zeitlimits ein oder mehrere ausgeben. Andernfalls sollte der Code innerhalb des Zeitlimits ohne Ausgabe enden.
Dies ist Codegolf, also gewinnt der kürzeste Code in Bytes.
30=5*6
.Antworten:
Java - 124
Ab 2 wird so lange geschleift, bis die Startnummer> der Quadratwurzel des Ziels ist (oder das Ziel genau erreicht ist). Wenn das Produkt niedrig ist, wird es mit der hohen Zahl multipliziert und inkrementiert. Wenn es hoch ist, wird es durch die Startnummer dividiert und inkrementiert.
Zum Beispiel würde es für 30 prüfen:
Gibt eine durch Leerzeichen getrennte Folge von Faktoren in aufsteigender Reihenfolge aus.
Mit Zeilenumbrüchen:
quelle
Python -
104 97 9592 versuchen Sie esWenn
n
zB vorher 120 eingestellt ist, gibt das Programm die beiden Lösungen aus:quelle
+=
. Aber ich vermisse++
in Python ...if s>=n
undif s/n
sind gleichwertig, sodass Sie alle Lösungen mit der gleichen Anzahl von Zeichen bereitstellen können.s=s*(i+c)
zus*=i+c
.Clojure -
127109 BytesBeispiel:
Erläuterung:
Dies ist ein grundlegender, nicht optimierter funktionaler Ansatz. Ich erstelle eine träge Liste aller Möglichkeiten, indem ich eine einfache Schleife über sie lege (dabei werden alle Kombinationen übersprungen, die zu große Zahlen ergeben und einen Überlauf verhindern) und die erste davon genommen. Wenn keine Möglichkeiten bestehen, wird nil zurückgegeben.
Am einfachsten zu testen unter http://tryclj.com/ .
Mir ist jetzt auch aufgefallen, dass ich alle Möglichkeiten zurückgeben kann:
120 Bytes102 Bytes , liefert aber Ergebnisse in einer verschachtelten Liste.Beispiel:
quelle
CJam, 31 Bytes
Es ist ein Brute-Force-Ansatz, aber die Ausführungszeit beträgt mit dem offiziellen Java-Interpreter nur ein paar Sekunden .
Wenn Sie den Code mit dem Online-Interpreter testen möchten , sollten Sie die Eingabe relativ niedrig halten. Alles weniger als 2 26 funktioniert immer noch auf meinem Computer.
Beispiele
Wie es funktioniert
quelle
Java, 162
Gibt ein Array mit ganzen Zahlen zurück oder
null
wenn keine fortlaufenden Zahlen vorhanden sind.ungolfed:
quelle
C 105
110versuchen Sie es144 mit Bonus: Dieser durchläuft jede Zahl und findet passende Produkte
quelle
k < n
geht der zustand wegen zu hochk *= l++
. Ich konnte lange , lange an den Anfang unsigned append aber ... das Leben ruinieren würdePHP 258 Zeichen, 201 ohne Fakultätsfunktion.
Der einfachste Weg, "aufeinanderfolgende Faktoren, die einer Zahl entsprechen" mathematisch auszudrücken, ist
X!/Y!
WoX
ist die höchste Zahl undY
ist die niedrigste minus eins. Leider hörte ich auf, Kalkül zu nehmen, bevor ich das Lösen lernteZ = X!/Y!
, so dass ich es ein wenig bruteforce musste.Messy, ungolfed version:
Beispielausgabe:
Golf gespielt:
Ausgabe:
Ich hatte nicht erwartet, dass die Laufzeit so schnell sein würde!
quelle
Pyth , 35
Hinweis: Mein Code findet tatsächlich die kürzeste Darstellung der Eingabe als Darstellung aufeinanderfolgender Ganzzahlen> = 2. Bei ungültiger Eingabe wird daher möglicherweise nach sehr langer Zeit eine Liste mit 1 Elementen ausgegeben. Da die Problemanweisung besagt, dass die Eingabe gültig ist, gehe ich davon aus, dass dies in Ordnung ist.
Kurze Erklärung:
Im Wesentlichen speichert das Programm die oberen und unteren Grenzen eines Bereichs, berechnet das Produkt der Zahlen im Bereich mithilfe einer Reduzierung, passt die Endpunkte nach Bedarf an und wiederholt dies, bis das Produkt der Eingabe entspricht.
Lange Erklärung:
Für jeden Codeausschnitt werde ich eine entsprechende Python-Beschreibung sowie eine ausführlichere Erklärung und Begründung geben.
Jvw
=>J=eval(input())
Standardmethode für die Eingabe in Pyth.
Kr2 4
=>K=range(2,4)
=>K=[2,3]
Hier ist der erste seltsame Teil: Anstatt die Endpunkte als separate Variablen zu speichern, speichere ich sie als Elemente einer Liste. Der Grund wird bald klar sein. Anstatt eine einfache Zuweisung zu machen, wie es in Pyth der Fall wäre
K[2 3)
, verwende ich einen Bereich, um ein Zeichen zu speichern.W-ZJ
=>while Z-J
=>while Z!=J
An dieser Stelle könnten Sie fragen: "Was ist Z? Sie haben es nicht definiert." In Pyth sind alle Variablen vordefiniert. Z beginnt zufällig mit 0. Z wird jedoch später auf den Wert des Produkts gesetzt, sodass diese Prüfung dazu dient, die while-Schleife zu beenden, sobald die Liste den richtigen Wert aufweist.
~@K>JZ1
=>K[J>Z] += 1
Hier ist der Grund, warum ich die Werte in einer Liste und nicht in separaten Variablen speichere: Ich möchte einen der beiden Endpunkte inkrementieren, je nachdem, ob das Produkt derzeit zu hoch oder zu niedrig ist. Das wäre eine ziemlich lange Bedingung, wenn die Endpunkte separate Variablen wären, aber mit der Magie der Listenindizierung wird es kurz. Die Tatsache, dass diese Prüfung vor dem Produkt erfolgt, und die Tatsache, dass Z auf 0 initialisiert wird, stellen sicher, dass K zu
[2,4]
dem Zeitpunkt vorliegt , an dem wir das Produkt zum ersten Mal nehmen. Dies sind die richtigen Endpunkte.=YurGHK
=>Y=reduce(lambda G,H: range(G,H),K)
=>Y=range(K[0],K[1])
Jetzt brauche ich die aktuelle Liste, dass das Produkt übernommen wird, und die wird ausgedruckt, wenn es uns gelingt. Natürlich werden wir eine Bereichsfunktion verwenden. Die Schwierigkeit besteht darin, die Eingaben für die Bereichsfunktion zu erhalten. Der naheliegende Weg, dies durch Indizieren der Liste zu erreichen, wäre
=Yr'K@K1
. Durch Verwendung einer Reduktionsfunktion für diese Liste mit zwei Elementen können wir diese jedoch um ein Zeichen kürzen.=Zu*NTY
=>Z=reduce(lambda N,T: N*T,Y)
Und jetzt, für den ganzen Punkt dieser Angelegenheit, die Operation reduzieren, um das Produkt der Liste zu finden.
)
=> Beende währendY
=>print(Y)
Bei Erfolg die Liste ausdrucken.
Beispiellauf:
quelle
Java - 115
Etwas weniger Golf gespielt:
quelle
System.out.println
bis zuSystem.out.print
golfen , und das Semikolon am Endefor(int k=1,x=j;(x*=j+k)<i;k++)
ist nicht nur unnötig, sondern verursacht auch Fehler.x
,j
,k
Der Gültigkeitsbereich ist in den letztenif/for
Blöcken wegen ein;
. Wenn ich das entferne;
, druckt es nichts.print
würde bedeuten, dass er ein Leerzeichen hinzufügen muss, um zu vermeiden, dass Zahlen zusammenlaufen.Matlab (88)
Der Code erwartet, dass die Nummer in gespeichert
x
und in ausgegeben wirdl
.Da
13! > 2^32
dieser Code nur nach Produkten der Länge 2 bis 12 sucht, hat dieser Code eine konstante Laufzeit von ca. 0,001s.quelle
Scala - 86
Dieser Code ist sehr ineffizient, aber durch die Optimierung würden nur wenige weitere Zeichen hinzugefügt. Mit einem funktionalen Ansatz werden die Produkte aller möglichen aufeinander folgenden Sequenzen überprüft. (Eine aufeinanderfolgende Folge von Ganzzahlen wird in Scala als Range-Objekt dargestellt.)
ungolfed:
quelle
CJam funktioniert derzeit aufgrund der langen Rechenzeit nicht für große Zahlen
Dies ist mein kürzester CJam-Code. Testen Sie unter http://cjam.aditsu.net/ . Es funktioniert wie folgt: Eingabe als A definieren; Erzeugen eines Arrays aller Zahlen von 0 bis A-1; 0 treten; Kicken Sie die kleinsten Zahlen, bis die Multiplikation aller Zahlen im Array nicht größer als A ist. Prüfen, ob es größer als A ist; Andernfalls wird ein Array von 0 bis A-2 erstellt. und wiederholen, bis die Antwort gefunden ist. Wird keine gefunden, wird eine Ausnahme ausgelöst. Ich habe nicht bedacht, dass Leerzeichen zwischen Zahlen benötigt werden, daher sind sie im zweiten Code enthalten, der 32 Zeichen lang ist.
quelle
Dart - 102 Zeichen
Dies ist eine langsame Implementierung. Es kann schneller gemacht werden, aber das erfordert mehr Zeichen (wie die Schleife nur bis
i*i<n
)(Die 102 Zeichen sind ohne Zeilenumbrüche und führende Leerzeichen).
Um es zu benutzen, mache etwas wie:
quelle
Javascript, 88
Golf Code:
Einfacher zu lesender Code:
Für jede Zahl von 2 bis zur eingegebenen Zahl wird das Produkt aus aufeinanderfolgenden ganzen Zahlen von der aktuellen Zahl zurück auf 2 ermittelt. Wenn dieses Produkt der eingegebenen Zahl entspricht, wird die Reihe aufeinanderfolgender Zahlen zusammen mit der ursprünglichen eingegebenen Zahl ausgegeben .
Es gibt die eingegebene Nummer gefolgt von den aufeinanderfolgenden ganzen Zahlen aus, deren Produkt die eingegebene Nummer ist.
Zum Beispiel erzeugt f (120) eine Warnung mit dem Text "120,5,4,3,2" und dann eine zweite Warnung mit dem Text "120,6,5,4".
quelle