Richtungen
Schreiben Sie ein Programm, das bei einer eingegebenen Ganzzahl n ( n >= 0
) die kleinste positive Ganzzahl m ausgibt, wobei:
n = a[1]^b[1] + a[2]^b[2] + a[3]^b[3] + ... + a[k]^b[k]
a
undb
sind endliche Folgen gleicher Länge- Alle Elemente von
a
sind kleiner alsm
- Alle Elemente von
b
sind kleiner alsm
- Alle Elemente von
a
sind verschieden und ganze Zahlena[x] >= 0
- Alle Elemente von
b
sind verschieden und ganze Zahlenb[x] >= 0
a[x]
undb[x]
sind nicht beide 0 (da 0 ^ 0 unbestimmt ist)
Das ist Code-Golf , also gewinnen die wenigsten Bytes.
Beispiele
In 0 -> Out 1
Possible Sum:
In 1 -> Out 2
Possible Sum: 1^0
In 2 -> Out 3
Possible Sum: 2^1
In 3 -> Out 3
Possible Sum: 2^1 + 1^0
In 6 -> Out 4
Possible Sum: 2^2 + 3^0 + 1^1
In 16 -> Out 5
Possible Sum: 2^4
In 17 -> Out 4
Possible Sum: 3^2 + 2^3
In 23 -> Out 6
Possible Sum: 5^1 + 3^0 + 2^4 + 1^3
In 24 -> Out 5
Possible Sum: 4^2 + 2^3
In 27 -> Out 4
Possible Sum: 3^3
In 330 -> Out 7
Possible Sum: 6^1 + 4^3 + 3^5 + 2^4 + 1^0
code-golf
number
arithmetic
kukac67
quelle
quelle
m<2
dannm<3
anschließendm<4
usw. , bis ich eine Summe finden , das gleichn
. Ich habe auch darüber nachgedacht, die Summe für0
keine Terme zu haben, aber was ist dann die Ausgabe? m>?n = a[1]^b[1] + a[2]^b[2] + ... + a[k]^b[k]
.a
undb
sind endliche Folgen von Längen0
, so dass es keine Ganzzahlm
gibt, die die Bedingungen nicht erfüllt, und da es keine kleinste Ganzzahl gibt, ist die Antwort nicht definiert. Mögliche Korrekturen wären, nach der kleinsten natürlichen Zahlm
(in diesem Fall sollten Sie die erwartete Antwort dort auf ändern0
) oder nach der kleinsten positiven Ganzzahl zu fragenm
.Antworten:
GolfScript (59 Zeichen)
Online-Demo
Dies verwendet die Rekursion, um die Werte aufzulisten, die für eine gegebene Zahl erreichbar sind,
m
und sucht nach der ersten,m
die funktioniert. Es ist leicht von der Antwort von xnor inspiriert , aber in der Implementierung sehr unterschiedlich.Präparation
quelle
Python, 120
Die Funktion
f
ist eine Hilfsfunktion, die prüft, obn
sie nicht als Summe von Potenzen mit unterschiedlichen Basen vonA
und Exponenten von ausgedrückt werden kannB
. Es verwendet eine natürliche rekursive Strategie:n
muss ungleich Null sein, und wir versuchen jede mögliche Wahl von Basis und Exponent, und alle müssen scheitern. Wir entfernen sie aus den erlaubten Listen und verringern sien
um den entsprechenden Betrag.Die Funktion
g
ist die Hauptfunktion. Es sucht nach einemm
, der funktioniert.M
ist die Menge der zulässigen Werte bis zum-1
. Wir entfernen0
aus den erlaubten Exponenten, um0**0
die Verwendung zu stoppen (was Python mit 1 bewertet). Das tut nichts weh, weil0**x
es0
für alle anderen nutzlos istx
.quelle
n and all()
zun*all()
.Python 2, 138 Bytes
(Danke an @Jakube für alle Tipps)
Ich habe noch nie so viel über das gelernt
itertools
Modul wie aus dieser einen Frage. Der letzte Fall dauert ungefähr eine Minute.Wir beginnen mit der Suche
m = 1
und dem Inkrementieren, bis wir eine Lösung erhalten. Um nach einer Lösung zu suchen, wiederholen wir Folgendes:k = 0 to m-1
, wok
ist die Anzahl der Begriffe in der Lösung[0, 1, ... m-1]
mit der Größek
), dann Summieren und Überprüfen, ob wir habenn
Beachten Sie, dass wir
k
bis zu iterierenm-1
- obwohl technischem
Begriffe insgesamt möglich sind, gibt es immer eine Lösung mitm-1
Begriffen, die0^0
nicht zulässig sind und0^b
nichts beitragen. Das ist eigentlich wichtig, weil0^0
es von Python als 1 behandelt wird, was ein Problem zu sein scheint, aber es stellt sich heraus, dass es keine Rolle spielt!Hier ist der Grund.
Angenommen, eine fälschlicherweise gefundene Lösung wird
0^0
als 1 verwendet, z3^2 + 1^1 + 0^0 = 11
. Da wir nurm-1
Begriffe generieren , muss es einige geben, diej
wir nicht als Basis verwenden (hierj = 2
). Wir können die Basis 0 für austauschenj
, um eine gültige Lösung zu erhalten3^2 + 1^1 + 2^0 = 11
.Wenn wir alle
m
Begriffe durchlaufen hätten, hätten wir möglicherweise falsche Lösungen wiem = 2
fürn = 2
, via erhalten0^0 + 1^1 = 2
.quelle
imap(pow,C,D) ... for C,D in
itertools
: PI hat bereits eine weitere Speicherung -tee
.imap
, wenn es das gibtmap
?? -1 Bytetee
ist bereitsn=2
. Spart 2 Bytes.map
mit mehr als einem Iterable gearbeitet habe, und in der Tat bringt diese Frage eine Menge Neuerungen für mich hervor.GolfScript (
9084 Bytes)Online-Demo
Präparation
Der eleganteste Trick ist die Behandlung des Sonderfalls für
0
.quelle
Haskell,
143130Anwendungsbeispiel:
p 23
->6
.Dies ist eine einfache Brute-Force-Suche.
[0..0], [0..1], [0..2] ... [0..∞]
Nehmen Sie für jede Liste alle Anfangssegmente der Permutationen (z. B. [0..2]: Permutationen:,[012], [102], [210], [120], [201], [021]
Anfangssegmente für 1. Permutation :,[0], [01], [012]
2.:[1], [10], [102]
usw.). Berechnen Sie für jede Kombination von 2 dieser Listen die Summe der Potenzen. Stoppen Sie, wenn der erste gleich n ist.quelle
>>=
eher als verwendenconcatMap
. Sie sind genauso, aber mit umgedrehten Argumenten.Python: 166 Zeichen
Erläuterung
Die Funktion
f
erzeugt alle möglichen ganzen Zahlen, die als Summe der Potenzen von Zahlen in ausgedrückt werden könnenr
. Beginnt mitr = [0]
. Wenn eine dieser ganzen Zahlen gleich ist,n
gibt sie die Länge von zurückr
, andernfalls ruft sie sich rekursiv mit einer erweiterten Zahl aufr
.Die Berechnung aller ganzen Zahlen, die als Summe ausgedrückt werden können, erfolgt mit zwei Schleifen. Die erste Schleife ist die
for j in r
, die die Länge des Ausdrucks angibt (2 ^ 3 + 1 ^ 2 hat Länge 2). Die innere Schleife durchläuft alle Kombinationen von Permutationenr
mit unterschiedlicher Längej
. Für jeden berechne ich die Summe der Kräfte.quelle
JavaScript (ES6) 219
224Rekursive Funktion. Beginnend mit m = 1, versuche ich alle Kombinationen der Ganzzahl 1..m für Basen und 0..m für Exponenten (0 Base ist nutzlos, wenn 0 ^ 0 == undefiniert ist).
Wenn keine Lösung gefunden wird, erhöhen Sie m und versuchen Sie es erneut.
Sonderfall für Eingang 0 (meiner Meinung nach ist das ohnehin ein Fehler in der Spezifikation)
Die C-Funktion generiert rekursiv alle Kombinationen aus einem Array vorgegebener Länge, so dass
Die dritte Ebene
every
wird verwendet, um das Array a von Basen und b von Exponenten zusammenzufassen (zip
in JavaScript gibt es keine Funktion). Verwenden Sieevery
, um vorzeitig anzuhalten, wenn eine Lösung vorliegt, bei der nicht alle Elemente in den beiden Arrays verwendet werden.Test In FireFox / Firebug - Konsole
Ausgabe
quelle