Eine Additionskette ist eine Folge von Ganzzahlen, die mit 1 beginnen, wobei jede andere Ganzzahl als die anfängliche 1 eine Summe von zwei vorherigen Ganzzahlen ist.
Hier ist zum Beispiel eine Additionskette:
[1, 2, 3, 4, 7, 8, 16, 32, 39, 71]
Hier sind die Summen, die es zu einer Additionskette machen:
1 + 1 = 2
1 + 2 = 3
1 + 3 = 4
3 + 4 = 7
1 + 7 = 8
8 + 8 = 16
16 + 16 = 32
7 + 32 = 39
32 + 39 = 71
In dieser Herausforderung erhalten Sie eine positive Ganzzahl n
und müssen eine der kürzesten Additionsketten ausgeben, die auf endet n
.
Beispiele - Beachten Sie, dass es viele mögliche Ausgaben gibt. Alles, was Sie finden müssen, ist eine ebenso kurze Additionskette:
1: [1]
2: [1, 2]
3: [1, 2, 3]
4: [1, 2, 4]
5: [1, 2, 3, 5]
6: [1, 2, 3, 6]
7: [1, 2, 3, 4, 7]
11: [1, 2, 3, 4, 7, 11]
15: [1, 2, 3, 5, 10, 15]
19: [1, 2, 3, 4, 8, 11, 19]
29: [1, 2, 3, 4, 7, 11, 18, 29]
47: [1, 2, 3, 4, 7, 10, 20, 27, 47]
71: [1, 2, 3, 4, 7, 8, 16, 32, 39, 71]
Standard-E / A-Regeln usw. Verbot von Standard-Regelungslücken. Codegolf: Wenige Bytes gewinnen.
code-golf
sequence
arithmetic
isaacg
quelle
quelle
Antworten:
Haskell , 57 Bytes
Eine Brute-Force-Lösung. Probieren Sie es online!
Erläuterung
Die unendliche Liste
c
enthält alle Additionsketten, sortiert nach Länge. Es wird in sich selbst induktiv definiert, indem eine Listex
ausc
und zwei Elemente aus genommenx
und deren Summe angehängt werdenx
. Die Funktionf
findet die erste Listec
, die mit der gewünschten Nummer endet.quelle
Brachylog , 14 Bytes
Probieren Sie es online!
Eine Brute-Force-Übermittlung, die alle möglichen Additionsketten durch iteratives Vertiefen aufbaut und stoppt, wenn eine Kette mit dem richtigen Argument gefunden wird. Im Gegensatz zu den meisten Brachylog-Übermittlungen ist dies eine Funktionsübermittlung, die über ihr rechtes Argument (herkömmlicherweise als Ausgabe bezeichnet) und über ihr linkes Argument (herkömmlicherweise als Eingabe bezeichnet) eingibt. Dies zu tun ist etwas umstritten, aber das ), weil die rechte Seite des Programms die implizite Einschränkung nicht nutzen könnte (daher müsste diese deaktiviert und eine neue explizite Einschränkung angegeben werden, zu einem Preis von 2 Bytes ). höchsten bewertete Meta-Antwort zu diesem Thema besagt, dass es legal ist (und dies steht im Einklang mit unseren normalen E / A-Standardeinstellungen für Funktionen). Wenn wir die Ein- und Ausgabe konventioneller verwenden würden, wären dies 16 Bytes (
∧≜;1{j⊇Ċ+}ᵃ⁽.∋?∧
Erläuterung
Eine interessante Feinheit ist hier, was bei der ersten Iteration passiert, bei der die Eingabe eine Zahl und keine Liste wie bei den anderen Iterationen ist. wir beginnen mit der Nummer 1, machen zwei Kopien von jeder Ziffer (machen die Nummer 11), dann finden wir eine zweistellige Folge davon (auch die Nummer 11). Dann nehmen wir die Ziffernsumme, die 2 ist, und als solche beginnt die Sequenz so,
[1,2]
wie wir es wollen. Bei zukünftigen Iterationen, starten wir mit einer Liste wie[1,2]
, es zu verdoppeln[1,2,1,2]
, dann nahm eine Zwei-Element Teilfolge ([1,1]
,[1,2]
,[2,1]
, oder[2,2]
); Es ist klar, dass die Summen von jedem dieser Elemente als nächstes in der Additionskette gültig sind.Es ist hier ein wenig frustrierend, dass der Hinweis auf die Bewertungsreihenfolge hier benötigt wird, insbesondere die
≜
Komponente (anscheinendᵃ
wird der Hinweis auf die Bewertungsreihenfolge standardmäßig eher von innen als von außen verwendet, daher der eher grobe Einsatz von≜
, um das Problem zu erzwingen).quelle
ᵃ
ist eines dieser Buildins, das selten auftaucht, aber wenn Sie es brauchen, brauchen Sie es wirklich , da es keine Möglichkeit gibt, es remote mit anderen Steuerungskonstrukten zu implementieren. Als ich merkte, dass dies eineᵃ
Herausforderung war, kam der Rest ziemlich direkt von dort.Gelee , 17 Bytes
Gibt die lexikographisch erste Lösung in Exponentialzeit aus.
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES6),
83-86ByteBearbeiten: Behoben, die Liste in nicht umgekehrter Reihenfolge auszugeben
Demo
Code-Snippet anzeigen
quelle
PHP, 195 Bytes
Probieren Sie es online!
quelle
Mathematica, 140 Bytes
.
erzeugt bei jedem Start eine andere kürzeste Additionskette
Probieren Sie es online aus,
fügen Sie den Code mit Strg + V ein, platzieren Sie die Eingabe, dh [71], am Ende des Codes und drücken Sie Umschalt + Eingabetaste
quelle
[1,2,4,5,9,18,36,72,77,149]
). Es scheint, dass Ihr Programm zufällige Stichproben verwendet und nicht garantiert die optimale Lösung findet.Pyth, 13 Bytes
Testsuite
Gibt die lexikographisch erste kürzeste Kette an. Es ist ziemlich langsam, aber nicht so schlimm -
19
dauert mit pypy etwa 30 Sekunden.Einige Ideen aus der @ Dennis-Lösung.
Ich mag dieses wirklich - es gibt eine Menge netter Tricks.
Erläuterung:
Das ist immer noch etwas schwer zu verstehen, aber lassen Sie mich versuchen, es etwas genauer zu erklären.
Wir beginnen mit
ySQ
, die alle möglichen bestellten Teilmengen von gibt[1, 2, ... Q]
in aufsteigender Reihenfolge der Größe gibt. Die kürzeste Additionskette ist definitiv eine davon, aber wir müssen sie finden.Als Erstes filtern wir die Liste so, dass nur Listen mit a erhalten bleiben
Q
. Wir machen das mit/#Q
.Als nächstes ordnen wir die Liste nach dem, was übrig ist, nachdem wir das Ergebnis einer bestimmten Funktion entfernt haben.
-D
Bestellungen durch den Rest nach dem Entfernen von etwas.Das, was wir entfernen, ist
sM^N2
, woN
ist die Liste, aus der wir Dinge entfernen.^N2
gibt das kartesische ProduktN
mit sich, alle möglichen Paare von zwei Elementen inN
.sM
dann summiert jedes der Paare.Was ist das kleinstmögliche Ergebnis nach dieser Entfernung? Nun, das kleinste Element in der Eingabeliste bleibt definitiv erhalten, da alle Zahlen positiv sind, sodass jede Summe von zwei Zahlen größer ist als die kleinste Zahl. Und es wird mindestens eine Nummer geben, da wir überprüft haben, ob die Eingabe in der Liste vorhanden ist. Daher ist das kleinstmögliche Ergebnis, wenn jede Zahl außer der kleinsten die Summe von zwei anderen Zahlen in der Liste ist und die kleinste Zahl in der Liste 1 ist. In diesem Fall lautet der Sortierschlüssel
[1]
. Diese Anforderungen bedeuten, dass die Liste eine Additionskette sein muss.Also sortieren wir die Additionsketten nach vorne. Denken Sie daran, dass
y
die Untermengen in aufsteigender Reihenfolge der Größe angegeben werden. Daher muss die nach vorne sortierte Liste eine der kürzesten Additionsketten sein.h
wählt diese Liste aus.quelle