OEIS hat eine Variation (A111439) von Golombs Sequenz . A(n)
Beschreibt wie in Golombs Sequenz, wie oft n
in der Sequenz vorkommt. Darüber hinaus dürfen jedoch keine zwei aufeinander folgenden Nummern identisch sein. Wird beim Aufbau der Sequenz A(n)
immer als kleinste positive Ganzzahl gewählt, die diese beiden Eigenschaften nicht verletzt. Aufgrund unzulässiger fortlaufender identischer Nummern schwankt die Serie mit zunehmender Größe leicht auf und ab. Hier sind die ersten 100 Begriffe:
1, 2, 3, 2, 3, 4, 3, 4, 5, 6, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 8, 9,
10, 9, 10, 9, 10, 11, 10, 11, 10, 11, 10, 11, 12, 11, 12, 13, 12, 13, 12,
13, 12, 13, 12, 13, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 16, 15,
16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 18, 17, 18, 17, 18, 19, 18, 19, 18,
19, 18, 19, 18, 19, 18, 19, 20, 19, 20, 21, 20, 21, 20, 21, 20, 21, 20
Die vollständige Liste der ersten 10.000 Nummern finden Sie auf OEIS .
Die Herausforderung besteht darin, ein A(n)
gegebenes Programm oder eine gegebene Funktion zu schreiben, die berechnet n
. n
ist 1
-basiert, um sicherzustellen, dass die selbstbeschreibende Eigenschaft funktioniert.
Regeln
Sie können ein Programm oder eine Funktion schreiben und eine unserer Standardmethoden zum Empfangen und Bereitstellen von Eingaben verwenden.
Sie können jede Programmiersprache verwenden , beachten Sie jedoch, dass diese Lücken standardmäßig verboten sind.
Das ist Code-Golf , also gewinnt die kürzeste gültige Antwort - gemessen in Bytes .
Testfälle
n A(n)
1 1
4 2
10 6
26 10
100 20
1000 86
1257 100
10000 358
N
nach dem letzten Auftreten,N-1
welches die Anzahl der Wackelbewegungen misst, angezeigt wirdN
.)Antworten:
Haskell , 67 Bytes
Definiert eine Funktion
f
. Probieren Sie es online! Die Rechenzeitf 15
für TIO ist sehr langsam .Erläuterung
Gehen Sie einfach zur Definition über: Wählen Sie in jeder Phase die minimale positive Zahl aus
n
, die die Bedingungen erfüllt (ungleich der vorherigen Eingabe und noch nicht aufgetretenf n
).quelle
Mathematica,
6968 BytesVielen Dank an Martin Ender für die Suche nach einem zusätzlichen Byte für mich!
Unbenannte Funktion, die eine positive Ganzzahl
n
als Eingabe verwendet und eine positive Ganzzahl zurückgibt. Wir konstruieren die gesamte Liste der erstenn
Elemente dieser Sequenz und nehmen dann dasLast
Element. Die Liste wird erstellt, indem mit der leeren Liste begonnen{}
und mit einer Funktionn
in Folge (viaNest
) bearbeitet wird .Es handelt sich um die Funktion
{##&@@#,1//.x_/;x==Last@#||#~Count~x==#[[x]]->x+1}&
, die (im Wesentlichen##&@@#
) eine Teilliste von Sequenzwerten aufnimmt und den nächsten Wert an diese anfügt. Der nächste Wert wird berechnet, indem mit begonnenx=1
und dann wiederholt ersetztx
wirdx+1
, solange die Bedingungx==Last@#||#~Count~x==#[[x]]
erfüllt ist - mit anderen Worten, wenn es sich entwederx
um das vorherige Element handelt oder wennx
es sich bereits in der Liste um die korrekte Anzahl von Malen handelt. Diese Funktion spuckt einige Fehler aus, da wir (zum Beispiel) dasx
th-Element der Anfangsliste nicht aufrufen sollten{}
; Die Werte sind jedoch alle korrekt.quelle
Python 2,
9986 BytesVielen Dank an @Dennis für einige Verbesserungen von insgesamt 13 Bytes!
Das Programm geht ziemlich naiv vor: Es verfolgt die Liste der Werte, die es bisher ermittelt hat, und versucht, den nächsten Wert anzufügen. Es wird versucht, ein
1
an das Ende der Liste anzuhängen , wenn dies möglich ist. wenn nicht, dann probiert es a2
und so weiter, bis etwas erlaubt ist.Nun beginnen wir damit, die Ergebnisse für
1,2,3
zu setzen1,2,3
. Dies wird getan, um Probleme mit der zu kurzen Liste der bereits berechneten Werte zu vermeiden: Ich vermute, dass wennn
zumindest4
danna(n)
streng kleiner ist alsn
. (In diesem Programms[n]
ist gleicha(n)
. Unsere Liste tatsächlich initialisiert werden ,[0,1,2,3]
da Listen0
-indexed in Python. So zum Beispiela(1)=s[1]=1
, unda(2)=s[2]=2
.)Nehmen wir also an, wir versuchen festzustellen
s[m]
, was bedeutet, dass unsere Liste bereits enthälts[0], s[1], ..., s[m-1]
. Wir fangen ant=1
und versuchen zu setzens[m]=1
. Wenn das nicht funktioniert, gehen wir zut=2
und versuchen einzustellens[m]=2
. Bei jedem Inkrementierent
prüfen wir, obs.count(t)==s[t]
... aber die rechte Seite erzeugt keinen Fehler, solange wir nicht so hoch gehen müssen wiet=m
. Die Vermutung besagt, dass wir das niemals müssen, da der erste Wert, den wir berechnen, tatsächlich ists[4]
.Diese Implementierung berechnet 3 weitere Werte der Sequenz als erforderlich. Wenn dies beispielsweise der Fall
n
ist8
, wird eine Berechnung durchgeführt,s[11]
bevor der Wert von zurückgegeben wirds[8]
.Ich würde mich freuen, einen Beweis für die Vermutung zu sehen. Ich glaube, es kann durch (starke?) Induktion bewiesen werden.
Bearbeiten: Hier ist ein Beweis für die Vermutung . Wir beweisen tatsächlich eine etwas stärkere Form der Aussage, da sie keinen zusätzlichen Aufwand erfordert.
Satz: Für alle
n
größer als oder gleich4
ist der Terma(n)
kleiner als oder gleich(n-2)
.Beweis (durch starke Induktion): (Basis
n=4
): Die Aussage gilt fürn=4
, daa(4) = 2 = 4-2
.Nehmen wir nun an
a(k)
, dassk-2
für allek
von4
bisn
einschließlich kleiner oder gleich ist (und nehmen wirn
an, dass dies mindestens so ist4
). Dies bedeutet insbesondere, dass alle vorherigen Terme der Sequenz höchstens waren(n-2)
. Wir müssen zeigen, dassa(n+1)
das höchstens sein wird(n-1)
. Nun ist per Definitiona(n)
die kleinste positive Ganzzahl, die keine der Bedingungen verletzt. Wir müssen also nur zeigen, dass der Wert(n-1)
keine der Bedingungen verletzt.Der Wert
(n-1)
verletzt nicht die Bedingung "keine aufeinanderfolgenden Wiederholungen", da nach der Induktionshypothese der vorherige Eintrag höchstens war(n-2)
. Und es wird nicht die Bedingung "Ista(m)
die Anzahl derm
Auftritte" verletzen , es(n-1)
sei denn, es wurden bereitsa(n-1)
Zeiten erreicht . Aber durch die starke Induktionsannahme(n-1)
war das schon0
mal erreicht worden unda(n-1)
ist nicht gleich0
daa(m)
für alle positivm
.Daher
a(n+1)
ist kleiner oder gleichn-1 = (n+1)-2
, wie gewünscht. QED.quelle
Gelee , 17 Bytes
Die letzten drei Testfälle sind für TIO zu viel. Ich habe 1000 und 1257 vor Ort überprüft .
Probieren Sie es online! oder überprüfen Sie die ersten 100 Begriffe .
Wie es funktioniert
quelle
Python 2 ,
7774 BytesDies ist eine rekursive Implementierung des @ mathmandan-Algorithmus .
Die Implementierung ist O (verrückt) : Eingabe 9 dauert lokal 2 Sekunden, Eingabe 10 52 Sekunden und Eingabe 11 17 Minuten und 28 Sekunden. Wenn es sich jedoch nicht um ein Lambda, sondern um eine reguläre Funktion handelt, können die Testfälle mithilfe von Memoization überprüft werden.
Probieren Sie es online!
Beachten Sie, dass TIO auch bei der Speicherung nicht rechnen kann f (1257) oder f (10000) (beides wird lokal überprüft).
quelle
05AB1E ,
3231 BytesProbieren Sie es online!
Erläuterung
Wir sind technisch in der Schleife,
G
wenn wir N zur globalen Liste hinzufügen , aber alle Schleifen in 05AB1E verwenden dieselbe Variable N als Index, sodass die innere Schleife[...]
das N überschrieben hat derG
Bedeutung wir außerhalb der Schleife hinzufügen können.Probleme mit verschachtelten Schleifen und Bedingungen hindern uns daran, dies innerhalb der Schleife zu tun.
quelle
Befunge,
141136 BytesProbieren Sie es online!
Aufgrund der Speicherbeschränkungen von Befunge ist es nicht sinnvoll, alle vorherigen Einträge in der Sequenz zu verfolgen. Daher verwendet diese Lösung einen Algorithmus mit geringerem Speicherbedarf, der die Werte direkter berechnet.
Das heißt, wir sind immer noch durch die Zellengröße begrenzt, die im Befunge-93-Referenzinterpreter ein vorzeichenbehafteter 8-Bit-Wert ist, sodass die höchste gerade Zahl in der Sequenz
A(1876) = 126
und die höchste ungerade Zahl unterstützt wirdA(1915) = 127
.Wenn Sie größere Werte testen möchten, müssen Sie einen Interpreter mit einer größeren Zellengröße verwenden. Dies sollte die meisten Befunge-98-Implementierungen einschließen ( Online ausprobieren ! ).
quelle
Python 2, 117 Bytes
Meh. Nicht so kurz. Die einfache iterative Lösung.
Probieren Sie es online aus
Hier ist ein wirklich schlechter Versuch einer rekursiven Lösung (129 Bytes):
quelle
-1
stattdessenn-1
ein Byte speichern, denke ich nicht.