In letzter Zeit gab es viele Herausforderungen im Zusammenhang mit Prim / Prim-Faktorisierung. Ich dachte, es könnte interessant sein, in die andere Richtung zu gehen.
Gegeben:
- eine positive ganze Zahl
n
und - eine nicht leere Liste positiver Ganzzahlen
f
Schreiben Sie ein vollständiges Programm oder eine Funktion, um die kleinste Ganzzahl i
so zu finden, dass i >= n
und i
ein Produkt nichtnegativer ganzzahliger Potenzen von Elementen in ist f
.
Beispiele:
Angenommen
n = 11, f = [2, 3, 5]
.Die ersten Produkte sind:
1 = 2^0 * 3^0 * 5^0 2 = 2^1 * 3^0 * 5^0 3 = 2^0 * 3^1 * 5^0 5 = 2^0 * 3^0 * 5^1 4 = 2^2 * 3^0 * 5^0 6 = 2^1 * 3^1 * 5^0 10 = 2^1 * 3^0 * 5^1 9 = 2^0 * 3^2 * 5^0 15 = 2^0 * 3^1 * 5^1 25 = 2^0 * 3^0 * 5^2 8 = 2^3 * 3^0 * 5^0 12 = 2^2 * 3^1 * 5^0 => smallest greater than (or equal to) 11, so we output it. 20 = 2^2 * 3^0 * 5^1 18 = 2^1 * 3^2 * 5^0 30 = 2^1 * 3^1 * 5^1 50 = 2^1 * 3^0 * 5^2 27 = 2^0 * 3^3 * 5^0 45 = 2^0 * 3^2 * 5^1 75 = 2^0 * 3^1 * 5^2 125 = 2^0 * 3^0 * 5^3
Angenommen
n=14, f=[9, 10, 7]
.Wieder die ersten Produkte:
1 = 7^0 * 9^0 * 10^0 7 = 7^1 * 9^0 * 10^0 9 = 7^0 * 9^1 * 10^0 10 = 7^0 * 9^0 * 10^1 49 = 7^2 * 9^0 * 10^0 => smallest greater than (or equal to) 14, so we output it. 63 = 7^1 * 9^1 * 10^0 70 = 7^1 * 9^0 * 10^1 81 = 7^0 * 9^2 * 10^0 90 = 7^0 * 9^1 * 10^1 100 = 7^0 * 9^0 * 10^2
Testfälle:
n, f -> output
10, [2, 3, 5] -> 10
17, [3, 7] -> 21
61, [3,5,2,7] -> 63
23, [2] -> 32
23, [3] -> 27
23, [2, 3] -> 24
31, [3] -> 81
93, [2,2,3] -> 96
91, [2,4,6] -> 96
1, [2,3,5,7,11,13,17,19] -> 1
151, [20,9,11] -> 180
11616, [23,32] -> 12167
11616, [23,32,2,3] -> 11664 = 2^4 * 3^6
5050, [3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210] -> 5103 = 3^6 * 7
12532159, [57, 34, 12, 21] -> 14183424 = 12^5 * 57
Regeln
- Sie können davon ausgehen, dass
f
mindestens ein Element enthalten sein wird und dass alle Elemente vonf
größer als 1 sind. - Sie können optional davon ausgehen, dass
f
die Sortierung in absteigender / aufsteigender Reihenfolge erfolgt, wenn Sie dies wünschen (aber bitte angeben). - Sie können optional die Anzahl der Elemente von nehmen,
f
wenn Sie möchten. - Die Ausgabe als String ist zulässig.
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes in jeder Sprache!
- Es gelten die Standard-E / A-Regeln, und Standard-Regelungslücken sind verboten.
- Erklärungen sind erwünscht.
quelle
∞
speichert3
Bytes über-Log@0 (doesn't work on TIO, but works fine on desktop Mathematica). Also,
Tr [1 ^ {##}] `ist ein Byte kürzer alsLength@{##}
.#2
ist noch kürzer alsTr[1^{##}]
. :)Quiet
in Ihren Hauptcode Diese Antwort gibt zu viele falsche Nachrichten aus. Zumindest fragen Sie OP, ob er damit∞
Problem scheint ein Fehler zu sein. Ich werde versuchen, das zu beheben.Python 2 ,
918884 BytesProbieren Sie es online!
Die Funktion
f
prüft rekursiv, obn
ein Produkt von Potenzen von Elementen inl
,g
nur ein Wrapper ist, um die Iteration zu steuernquelle
Python, 55 Bytes
Probieren Sie es online!
Schamlos kopierte Rods Fußzeilenskript zum Testen
quelle
Jelly , 13 Bytes
Ein dyadischer Link, der die Liste
f
links und die Zahln
rechts aufnimmt und eine Zahl ergibt.Probieren Sie es online!Golf ineffizient - Zeitüberschreitung bei Eingaben mit höheren
n
und / oder längeren Wertenf
.Wie?
Wir wissen, dass die Kräfte der einzelnen (streng positiven) Faktoren niemals überschritten werden müssen
n-1
... Untersuchen wir also einfach alle möglichen Möglichkeiten!
quelle
Netzhaut , 76 Bytes
Probieren Sie es online! Link schließt die langsamsten Testfälle aus, ist aber immer noch etwas langsam. Versuchen Sie also nicht, auf den Server von @ Dennis einzusteigen.
quelle
Pyth - 10 Bytes
Der Speicher geht sehr schnell zur Neige.
Probieren Sie es hier online aus .
Angemessene Antwort für 16 Bytes:
fsm.A}RQ*Md./PTE
quelle
Mathematica, 85 Bytes
Eingang
quelle
{d,s}Min@Select[Flatten[1##&@@(s^#)&/@0~Range~9~Tuples~Tr[1^s]],#>=d&]
U+F4A1
, langer Name\[Function]
.0~Range~9
scheint sehr konservativ. Sollteg[{2,3,5},1001]
wirklich überspringen1024
und zurückkehren1080
? Dies ist keine besonders große Eingabe.Japt , 10 Bytes
Online testen!
Funktioniert im letzten Testfall aufgrund einer Iterationsbeschränkung nicht, die dafür ausgelegt ist, dass der Interpreter nicht für immer ausgeführt wird (hat hier jedoch nicht viel geholfen, da mein Browser für eine Stunde eingefroren ist ...)
Erläuterung
quelle
Gelee , 9 Bytes
O (2 n • Länge (f) ) Laufzeit und Speichernutzung machen dies zu einer theoretischen Lösung.
Probieren Sie es online!
quelle
Haskell , 46 Bytes
Dies ist eine Portierung von KSabs hervorragender Python-Antwort . Vielen Dank an Laikoni für ihre Hilfe beim Debuggen und Golfen dieser Antwort im PPCG Haskell Chatroom, Of Monads and Men . Golfvorschläge willkommen! Probieren Sie es online!
quelle
Mathematica, 73 Bytes
Im Wesentlichen eine Portierung von Rods Python- Antwort . Definiert zwei binäre Operatoren
±
und·
.n±f
Gibt zurück,True
obn
ein Produkt aus Elementen vonf
undFalse
andernfalls ist.n·f
gibt die kleinste ganze Zahl ani
. Wenn jemand einen Weg finden kann, um den Teilbarkeitstest zu eliminieren, könnte ich durch Verwendung der ISO 8859-1-Codierung 10 Bytes einsparen.Erläuterung
quelle
R , 52 Bytes
Probieren Sie es online!
Es sind 3 Wochen vergangen, also dachte ich, ich würde endlich meine eigene Lösung veröffentlichen. Dies ist ein Brute-Force-Ansatz.
Es gibt jedoch ein eingebautes:
R , 5 Bytes
Probieren Sie es online!
Aus den R-Dokumenten:
Einige Tests ergaben jedoch einen Fehler in der Implementierung, wie der obige TIO-Link zeigt.
nextn(91,c(2,6))
sollte 96 zurückgeben, gibt jedoch 128 zurück. Dies tritt offensichtlich nur dann auf, wennfactors
nicht alle relativ gut miteinander auskommen. Tatsächlich ist der zugrunde liegende C - Code es offenbart , dassnextn
gierig versucht jeden zu unterteilenfactor
wiederum , bis1
erreicht ist:Dies kann gelöst werden, indem die Eingaben in absteigender Reihenfolge vorgenommen werden.
quelle
JavaScript (ES6),
5350 Bytes3 Bytes dank @DanielIndie gespeichert
Übernimmt Eingaben in der Currying-Syntax
(n)(a)
.Testfälle
Code-Snippet anzeigen
Wie?
quelle