Sequenzen
Sie erhalten vier 1
durch nummerierte Zahlenfolgen 4
.
OEIS Der Ort
0
, an dem die natürlichen Zahlen binär aufgelistet sind. Hier ist ein Beispiel für die Berechnung der Sequenz:0,1,10,11,100,101,110,111 ^ ^ ^^ ^ ^ 0 3 78 10 14
Der Beginn der Sequenz sieht folgendermaßen aus:
0, 3, 7, 8, 10, 14, 19, 20, 21, 23, 24, 27, 29, 31, 36, 37, 40, 45, 51, ...
OEIS Diese Sequenz enthält die erste natürliche Zahl, überspringt die nächsten zwei, enthält dann die nächsten drei, überspringt dann die nächsten vier und fährt fort.
0, 3, 4, 5, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25, 26, 27, 36, ...
OEIS Positive ganze Zahlen , wo sowohl die Anzahl der
0
‚s und die Anzahl der1
‘ s in der binären Darstellung der Zahl sind Kräfte der2
.2, 4, 5, 6, 9, 10, 12, 16, 23, 27, 29, 30, 33, 34, 36, 39,
OEIS Die Hofstadter Q- Sequenz .
a (1) = a (2) = 1;
a (n) = a (na (n-1)) + a (na (n-2)) für n> 2.1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 6, 8, 8, 8, 10, 9, 10, 11, 11, 12, 12, 12, 12, 16, 14, ...
Über diese Sequenz ist wenig streng bewiesen, aber es gibt viele empirische Ergebnisse. Eines ist besonders wichtig, und Sie können davon ausgehen, dass es für die gesamte Serie gilt:
In diesem Artikel wurde festgestellt, dass die Elemente der Serie in Generationen eingeteilt werden können. Wenn wir sie ab 1 nummerieren, enthält die k- te Generation genau 2 k Elemente. Die relevante Eigenschaft ist, dass alle Zahlen in der Generation k erhalten werden, indem zwei Zahlen aus den Generationen k-1 und / oder k-2 summiert werden , jedoch niemals aus früheren Generationen. Sie können diese (und nur diese) Beobachtung verwenden, um eine Untergrenze für die verbleibenden Elemente in der Sequenz festzulegen.
Herausforderung
Ihre Herausforderung besteht darin, die erste zu drucken x
Zahlen im Schnittpunkt der angegebenen Eingabesequenzen .
Eingabe: Zwei durch ein Leerzeichen getrennte Zahlen STDIN
. Die erste Zahl ist eine ganze Zahl von 1
bis 15
einschließlich, wobei jedes Bit einer Sequenz entspricht. Das niedrigste Bit entspricht der Sequenz 1
und das höchste entspricht der Sequenz 4
. Die zweite ist die Anzahl der Zahlen x
, auf die ausgegeben werden sollSTDIN
.
Ausgabe: Die ersten x
Zahlen, die sich mit den angegebenen Eingabesequenzen überschneiden. Drucken Sie die Zahlen aufSTDOUT
mit einem klaren Leerzeichen oder einer Interpunktion als Trennzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche, Kommas, Doppelpunkte, Punkte usw.) auf.
Beispiele
1. Drucken Sie die ersten 3
Zahlen in jeder Sequenz.
Eingang: 15 3
Ausgabe: 10,23,40
2. Drucken Sie die ersten 12
Zahlen in der Sequenznummer1
und 4
.
Eingang: 9 12
Ausgabe: 3,8,10,14,19,20,21,23,24,31,37,40
3. Drucken Sie die erste10
Zahlen nacheinander aus2
.
Eingang: 2 10
Ausgabe: 0,3,4,5,10,11,12,13,14,21
4. Drucken Sie die ersten 6
Zahlen in Sequenzen 3
und4
.
Eingang: 12 6
Ausgabe: 2,4,5,6,9,10
Einzelheiten
- Sie können die Ausgabe nach Belieben oder am Ende auf einmal drucken.
Vielen Dank an alle, die im Chat dabei geholfen haben! Diese Frage profitierte stark davon, im Sandkasten zu sein .
quelle
12 5
Beispiel auf den gleichen Index bringen, kommt sie dann10
tatsächlich9
in der Kreuzung vor ... Wie würden Sie beim Durchlaufen der Sequenzen entscheiden, ob Sie die9
Nummer 3 als mögliche Kreuzung überspringen möchten ? Als ob # 37
drin wäre, müssten Sie es überspringen, da dies nicht in # 4x
?Antworten:
Haskell,
495442402Es funktioniert ziemlich gut. Hier einige Beispiele von OP:
quelle
Python 3,
590639 ZeichenDies ist die einfache Lösung: Verwenden Sie Generatoren, um jede der unendlichen Sequenzen zu definieren, und fügen Sie jeder Sequenz einen Schritt hinzu, solange der Schnittpunkt nicht groß genug ist.
Um die nicht monoton ansteigende Hofstadter-Sequenz zu berücksichtigen: Bei jedem Schritt generiere ich doppelt so viele für diese Sequenz, z. B. 1, dann 2, 4, 8, 16, 32 usw. Ich denke, das erfüllt die in der Frage angegebene Grenze und es ist immer noch schnell genug für alle dort vorgestellten Testfälle.
quelle
from itertools import count as C
->from itertools import*
C=count
,def s(i):return D(i)==1
->s=lambda i:D(i)==1
(Ich glaube nicht einmal, dass diese Funktion es kürzer macht ...),"{0:04b}".format(int(L)))if U>'0'
->"{0:04b}".format(int(L)))if'0'<U
C #, 1923
Es wird wahrscheinlich nicht das kürzeste Programm sein, aber ich fand die Herausforderung interessant, also hier ist meine Lösung.
Das Ausführen aller 4 mit 35 Zahlen (15 35) dauert ungefähr 5 Sekunden.
Sie können es hier testen , aber beachten Sie, dass, wenn Sie OEIS4 möchten, die Anzahl der gewünschten Ziffern klein sein muss oder Netfiddle nicht mehr genügend Speicherplatz hat.
Golf gespielt
Lesbar
Erläuterung
Dies nutzt die Bigtime der faulen Auswertung, die es schnell macht, wenn ich glaube. Außerdem war ich faul, irgendein "Bitlogic" unter Verwendung der Convert.ToString-Methode (Nummer 2) des Frameworks zu machen. Dadurch wird jede Zahl in ihre Binray-Darstellung als Zeichenfolge umgewandelt.
Ich musste meine eigene Methode schreiben, um die Sequenzen zu schneiden, da die Linq-Methode den Schnittpunkt der vollständigen Sequenz berechnet, und das war buchstäblich unmöglich.
quelle