Ich habe mit ein paar Zahlen rumgespielt und eine Sequenz gefunden, die natürlich auf OEIS läuft. Es ist A005823 : Zahlen, deren ternäre Erweiterung keine Einsen enthält . Es geht:
a (2n) = 3 · a (n) +2
a (2n + 1) = 3 * a (n + 1)
a (1) = 0
a = 0,2,6,8,18,20,24,26,54 ....
Ich habe ein CJam-Programm geschrieben , das die ersten n dieser Zahlen generiert, indem der Index in binär konvertiert, die Einsen durch Zweien ersetzt und von ternär in dezimal konvertiert wird.
Mir ist auch aufgefallen, dass man jede gerade Zahl erhalten kann, indem man die Summe von zwei Zahlen in der Folge nimmt (manchmal die Zahl mit sich selbst).
Die Herausforderung:
Bei einer nicht negativen geraden Zahl als Eingabe werden die Indizes von zwei Zahlen in der Reihenfolge ausgegeben, in der sich die Summe ergibt. (Beachten Sie, dass manchmal mehrere Paare möglich sind.)
Die Regeln:
- Geben Sie an, ob Sie die 0- oder 1-Indizierung verwenden.
- Wenn Sie als Zeichenfolge ausgeben, setzen Sie ein Trennzeichen zwischen die beiden Indizes.
- Sie dürfen als komplexe Zahl ausgeben.
- Wenn Sie möchten, können Sie jedes gültige Paar ausgeben.
- Code Golf: Die kürzeste Antwort gewinnt
Testfälle
Ich benutze die 0-Indizierung. Hier liste ich jede mögliche Ausgabe für jede Eingabe auf, aber Sie müssen nur eine ausgeben.
0: [0 0] 2: [1 0] 4: [1 1] 6: [2 0] 8: [2 1] [3 0] 10: [3 1] 12: [2 2] 14: [3 2] 16: [3 3] 18: [4 0] 30: [6 2] 32: [6 3] [7 2] 46: [7 5] 50: [7 6] 120: [10 10] 338: [19 18] 428: [30 23] [31 22] 712: [33 27] [35 25] [41 19] [43 17] [49 11] [51 9] [57 3] [59 1] 1016: [38 37] [39 36]Vielen Dank an @Luis Mendo für die Hilfe bei Testfällen.
Verwandte: Befindet es sich innerhalb des Cantor-Sets?
quelle
Antworten:
Schale ,
211413 Bytes-7 Bytes dank der Antwort von @ Neil
-1 Byte, inspiriert von der Parradoc-Antwort von betaveros
Verwendet die 0-Indizierung
Probieren Sie es online!
Erläuterung
Vorherige 21-Byte-Lösung
Zum ersten Mal habe ich eine Verwendung für gesehen
»
.Probieren Sie es online!
Länger, als ich es mit Tragetaschen zu tun hatte
quelle
JavaScript (ES6),
7571 BytesErläuterung: Durch Teilen der Eingabe und der Elemente von A005823 durch 2 wird das Problem nicht geändert, die Lösung wird jedoch einfacher, da die ternären Darstellungen jetzt nur 0s und 1s verwenden und daher kein Übertragen zu berücksichtigen ist. Außerdem wird beim Konvertieren vom Element in den Index ein Schritt gespeichert (der Ternär jedes Elements ist doppelt so groß wie der Binärwert seines Index). Beispiele:
quelle
Jelly ,
26, 22, 21 BytesProbieren Sie es online!
Ein Byte gespart dank @JonathanAllan!
Erläuterung:
quelle
Œc
. Und ja, Dennis hatS=¥
mir das Problem erklärt .Python 2 , 51 Bytes
Probieren Sie es online!
Die Aufgabe kann folgendermaßen ausgeführt werden:
Wir können die Aufteilung in (3) durchführen, indem wir
0->0,1->1,2->1
für die eine Liste und0->0,1->0,2->1
für die andere konvertieren . Das heißt, durch Überprüfung ist der Wert über einem Schwellenwert von 0 oder 1.Die beiden Werte können durch entsprechende rekursive Funktionen gefunden werden:
Die Funktion
f
kombiniert diese beiden in einem Listenverständnis. Dies macht es aufgrund der exponentiellen Verzweigung ineffizient.Wenn komplexe Zahlen ausgegeben werden könnten, könnten wir 10 Bytes einsparen mit:
quelle
J,
3532 BytesProbieren Sie es online!
0-indiziert und die Eingabe erfolgt monadisch. Gibt alle möglichen Summierungen auf den Wert zurück (behandelt
a b
und)b a
als verschiedene mögliche Summierungen).Das Konvertieren von einer Booleschen Matrix in Indizes erfordert viel Code ...
Ich möchte auch die Gabel links entfernen, damit ich nicht so viele Klammern und verwenden muss
@
-ats verwenden muss, aber ich kann keinen guten Weg finden, dies zu tun (mein alternativer Ansatz speichert keine Bytes ).Erläuterung
Berücksichtigen Sie zum Erklären und Entgolfen die folgenden Komponenten der Hauptfunktion
valid_nums liefert eine boolesche Matrix, in der die Indizes die Indizes der summierten Sequenzwerte sind. Wenn es an diesen Indizes eine Eins gibt, bedeutet dies, dass sich die beiden Zahlen zum Eingabewert summieren.
indizes_of_ones ist ein J-Idiom für die Angabe der Koordinaten derjenigen in einer booleschen Matrix mit willkürlichem Rang
Die Hauptfunktion besteht ganz einfach aus
valid_nums
indizes_of_ones
,
-ravel funktioniert in diesem Fall, indem jede Zeile mit der nächsten verbunden wird.Wir können sehen, dass, wenn dies eine Boolesche Matrix wäre, die Koordinaten von Einsen gefunden werden können, indem die Indizes der gerasterten Matrix als Zahlen in der Basis der Form dieser Matrix interpretiert werden, wobei so viele Präpositionalsätze wie möglich verwendet werden, um den armen Leser zu verwirren .
quelle
MATL ,
22211917 BytesDie Ausgabe ist 1-basiert. Das Programm erzeugt alle Lösungspaare. Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Pyth , 37 Bytes
0-indiziert
Auf jeden Fall nicht so gut golfen, wie es sein könnte.
Probieren Sie es online!
quelle
hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQU
. Kann auf jeden Fall Golf gespielt werdenhfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQ
Pyth , 29 Bytes
Dieser gibt alle möglichen Indexpaare zurück.
Probieren Sie es hier aus.
Pyth , 30 Bytes
Probieren Sie es hier aus.
Dies gibt die Indexpaare als zurück
[LowerIndex, HigherIndex]
.Wie funktioniert das?
quelle
Paradoc (v0.2.10), 11 Bytes (CP-1252)
Probieren Sie es online!
Algorithmisch ist es sehr ähnlich wie Neils ES6-Antwort . Auf einer niedrigeren Ebene, ebenfalls auffallend ähnlich der Antwort von H.PWiz's Husk . Ich bin amüsiert, dass wir alle drei Überladungen von nutzen durften
B
.Nimmt eine Ganzzahl auf den Stapel, hinterlässt eine Liste mit zwei Ganzzahlen auf dem Stapel.
Erläuterung:
quelle
Python 3 ,
122120 Bytes-2 Bytes dank Mr. Xcoder!
0-indiziert
Ungolfed:
Probieren Sie es online!
quelle
Mathematica, 94 Bytes
1-indiziert
quelle
JavaScript,
120101 BytesProbieren Sie es online!
0-indiziert.
Es gibt das Indexpaar zurück, bei dem ein Index der kleinstmögliche ist (zum Beispiel, wenn
428
er zurückgibt22,31
).quelle
Brain-Flak ,
220166 Bytes-54 Bytes durch Nachschlagen der Modulo-Funktion im Wiki, wodurch einige strukturelle Änderungen möglich sind
Probieren Sie es online!
0-indiziert.
Erläuterung
Wie bei vielen anderen Lösungen wird auch hier die ternäre Erweiterung berechnet
n/2
und in zwei Binärzahlen umgewandelt.Schritt 1: Teilen Sie die Eingabe durch 2
Schritt 2: Ternäre Expansion berechnen
Schritt 3: In Lösung konvertieren
quelle
JavaScript (ES6),
70-72Byte(0-indiziert und anscheinend fast die gleiche Lösung wie @Neil, auch wenn ich seine Antwort nicht gesehen hatte)
Ich begann mit dem Abrufen des Index von einer Zahl in umgekehrter Reihenfolge: Stringifiziere mit Basis 3, ersetze jede
2
durch1
, parse mit Basis 2.Um zwei Zahlen zu erhalten, und das für jede gerade, müssen wir nur die Hälfte der Eingabe - aber jetzt können auch
1
Ziffern auftreten. Also ersetzen wir es vor dem Schritt zum Ersetzen und Parsen durch eine0
in der einen Zahl und eine2
in der anderen Zahl, was die Summe der beiden nicht ändert. Folgendes habe ich mir ausgedacht (die beiden Ersetzungen1
-> 0-or-2 und2
->1
in einem Schritt):Natürlich unterscheiden sich die beiden Ersetzungskarten (Strings) nur in einem Index, daher sollten wir in der Lage sein, das Array-Literal zu verkürzen, indem wir nur
1
und2
mit ersetzend == 2 ? 1 : x
. Oderd-1 || x
. Wo-1
funktioniert das gleiche wie bei den beiden unären Operatoren - aber sie sehen erschreckender aus :-)n/2
Ich habe auch versucht, das Array-Literal und die Klammern um mich herum zu vermeidenaber es stellte sich nicht als fruchtbar heraus.
quelle
["001","011"]
Version angefangen (meine Variablennamen waren unterschiedlich).replace(/./g,d=>d>>1|x)
spart 2 Bytes.d="0"
undx=1
- die Ziffer sollte bleiben0
Pyth, 22 Bytes
Probieren Sie es online aus: Demonstration
Erläuterung:
quelle