Die SUDSI-Sequenz ( su m, d ifference, s wap, i increment) ist eine merkwürdige Ganzzahlsequenz, die ein ziemlich chaotisches Verhalten zu zeigen scheint. Es kann wie folgt generiert werden:
Lassen S eine unendliche Liste der natürlichen Zahlen sein: 1 2 3 4 5 6 ...
. Lassen S i die eine indizierte bezeichnen i - te Element von S . Also ist S 1 anfangs 1, S 2 ist 2 usw. (es gibt kein S 0 ).
Beginnend mit S 1 und S 2 ...
- Berechnen Sie ihre Summe:
sum = S1 + S2
- Berechnen Sie ihre absolute Differenz (die größere minus die kleinere):
diff = |S1 - S2|
Vertausche die beiden Werte in S mit den Indizes von Summe und Differenz:
swap(Ssum, Sdiff)
Erhöhen Sie die Indizes von S, mit denen Sie arbeiten. Das nächste Mal werden Sie also die Summe und Differenz von S 2 und S 3 berechnen , und die Zeit danach wird S 3 und S 4 usw. sein.
- Wiederholen Sie diesen Vorgang auf unbestimmte Zeit.
Hier sind die ersten Stufen von S, wie dieser Prozess angewendet wird. Die Klammern []
umschließen die beiden Werte, die summiert und differenziert werden sollen.
Original S :
[1 2] 3 4 5 6 7 8 9 10 11 12 ...
Nachdem S 3 ( 3 = 1 + 2
) und S 1 ( 1 = |1 - 2|
) getauscht wurden:
3 [2 1] 4 5 6 7 8 9 10 11 12 ...
Nachdem S 3 und S 1 getauscht wurden:
1 2 [3 4] 5 6 7 8 9 10 11 12 ...
Nachdem S 7 und S 1 getauscht wurden:
7 2 3 [4 5] 6 1 8 9 10 11 12 ...
Nachdem S 9 und S 1 getauscht wurden:
9 2 3 4 [5 6] 1 8 7 10 11 12 ...
Nachdem S 11 und S 1 getauscht wurden:
11 2 3 4 5 [6 1] 8 7 10 9 12 ...
Nachdem S 7 und S 5 getauscht wurden:
11 2 3 4 1 6 [5 8] 7 10 9 12 ...
etc.
Die SUDSI-Sequenz ist definiert als die Sequenz der ersten Elemente in jeder dieser Listen. Die ersten Begriffe der SUDSI-Sequenz sind also 1 3 1 7 9 11 11
.
Hier sind die ersten 200 Terme der SUDSI-Sequenz (20 pro Zeile):
1 3 1 7 9 11 11 11 15 15 19 19 19 19 19 19 19 19 19 19
19 19 19 19 19 19 19 19 57 59 59 59 59 59 59 59 59 59 77 79
81 83 85 87 89 91 91 91 91 91 91 91 91 91 91 91 91 91 115 115
121 123 125 127 127 127 127 127 137 139 141 143 145 147 147 147 147 147 147 147
147 147 147 147 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167
167 167 167 167 209 211 211 211 211 211 221 223 223 223 223 223 223 223 223 223
223 223 243 243 243 243 243 243 257 259 261 263 263 263 263 263 263 263 263 263
263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263
263 263 325 327 329 331 331 331 331 331 331 331 331 331 349 351 351 351 351 351
361 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363
Es ist (zumindest für mich) unklar, wie man zukünftige Bedingungen vorhersagen könnte. Man kann nur mit Sicherheit sagen, dass die Ausdrücke immer ungerade und nicht abnehmend sind (nach dem zweiten Ausdruck) und dass einige Zahlen oft wiederholt werden.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine positive Ganzzahl n aufnimmt und den n- ten Term der SUDSI-Sequenz ausgibt oder zurückgibt . Wenn zum Beispiel n 1 ist, ist die Ausgabe 1
, wenn n 2 ist, ist die Ausgabe 3
, wenn n 200 ist, ist die Ausgabe 363
.
Nehmen Sie die Eingabe wie gewohnt vor (stdin / command line / function arg).
Die kürzeste Antwort in Bytes gewinnt.
(Diese Site codiert Dinge in UTF-8, aber Sie können jede beliebige vorhandene Codierung verwenden.)
Mathy-Bonus: (potenziell prämienberechtigt)
- Erzähl mir mehr über die SUDSI-Sequenz. Was ist das zugrunde liegende Muster für welche Zahlen und wie viele davon gibt es (und ähnliches)? (SUDSI konnte ich übrigens auf OEIS nicht finden .)
quelle
Antworten:
Pyth,
45414038 BytesMir ist (wie auch Martin Büttner) aufgefallen, dass die maximal betroffene Anzahl eines Permutationsschrittes bei
k
liegt2k + 1
. Da wir aber nurn - 1
Schritte haben, brauchen wir nur eine Liste der Zahlen bis zu2n - 1
.Probieren Sie es online aus: Demonstration
quelle
Mathematica, 88 Bytes
Dies ist ein vollständiges Programm, bei dem die Eingabe an einer Eingabeaufforderung gelesen wird. Es ist eine sehr direkte Implementierung der Definition, bei der ich die aktuelle Reihenfolge verfolge
f
(deren Wertef[n]
standardmäßig "" sind)n
).Hier ist eine etwas besser lesbare Version:
Einige Analysen
Ich habe die ersten 2000 Elemente der Sequenz gezeichnet (später wird es nicht wirklich interessanter):
Die Sequenz ist also im Wesentlichen linear mit der Steigung 2 und weist immer einige dieser Stufen auf. Es scheint, dass die Schritte sublinear wachsen (wenn sie nicht einmal begrenzt sind), da sie kaum wahrnehmbar werden, wenn Sie die Anzahl der Punkte erhöhen, die Sie zeichnen.
Wir können das lineare Wachstum rechtfertigen ganz leicht (das ist ein bisschen handwavy, aber ich denke , es ist an einen strengen Beweis durch Induktion halten würde): zunächst die maximale Anzahl betroffener eine Permutation Schritt an
n
istn + (n+1) = 2n + 1
. Beachten Sie auch, dass diese Nummern immer nach verschoben werden1
, da|n - (n+1)| = 1
. Es ist also nicht verwunderlich, dass wir Zahlen erhalten, die ungefähr2n
in der Reihenfolge liegen. Wir können jedoch auch zu beachten , dass für die Schritte bis n , S n + 1 immer begrenzt ist durch n + 1 , was bedeutet , dass kein Schritt swapping zwei Zahlen wechseln kann , die beide größer sind , als auch die für die Sequenz selbst gebunden ist. n . Daher sind Zahlen, die noch verarbeitet werden müssen, kleiner oder gleich ihrem Anfangswert. Daher,2n + 1
Ich denke, ein Argument für die Länge der Schritte zu finden, ist schwieriger.
quelle
CJam,
45 4039 BytesNur ein naiver Ansatz.
Kann weiter golfen werden.Es fehlt zu viel an einer Array-Auslagerungsfunktion.Wie es funktioniert:
Probieren Sie es hier online aus
quelle
Haskell, 95 Bytes
Anwendungsbeispiel:
p 70
->139
Ich speichere die Sequenz nicht in einer Liste oder einem Array. Ich aktualisiere die Identitätsfunktion wiederholt auf eine Funktion, bei der die beiden Elemente des aktuellen Schritts ausgetauscht werden. Nach
n
Schritten rufe ich die resultierende Funktion mit Parameter auf1
.quelle
J, 63 Bytes
Verwendung und Tests:
Probieren Sie es hier online aus.
quelle
Pyth,
555351Kann wahrscheinlich weiter golfen werden.
Könnte sehr langsam werden,n
da ich faul war, herauszufinden, wie lange ich ein Array brauchte und nurn^n
eins benutzte .Vielen Dank an Volatility und Martin Büttner für den Hinweis, dass ich maximal verwenden kann
3n
.Erläuterung
quelle
2*n
für großen
mit einem Maximum von3*n
für konvergiertn=1
.2n+1
, das, wie Sie sagen, sein Maximum3
für hatn=1
und (in gewisser Weise) zu konvergiert2n
. Dies ist nicht allzu überraschend, da dies das Maximum für die nicht durchlässige Sequenz ist und kein Schritt im Prozess eine Zahl erhöhen kann, die noch vor Ihnen liegt. Ich könnte dies zu meiner Antwort hinzufügen..a
Erweiterung bereits für gute Arbeit ein! Es gibt viel mehr Goodies auf dem Weg, aber Isaac schläft gerade: github.com/isaacg1/pyth/pull/32doc.txt
auf GitHub für ein Handbuch) und das Update gesehen. Zum Glück, da ich es einfach hätte überspringen und eine benutzerdefinierte Implementierung schreiben können ...Python 2,
117106101Verwendet adict
(map), um die Werte zu speichern und beliebige Indizes zu verwenden.g(n)
ist eine Funktion, die denn
Artikel zurückgibt. Dann iteriert man einfachinput-1
mal und gibt das erste Item aus.Es stellt sich heraus, dass es mit den Methoden aus meiner Pyth-Antwort kürzer ist.
Danke an xnor für das Speichern von 5 Bytes.
quelle
b,c=a[i:i+2]
. Außerdemb+c
ist es kurz genug, dass das Speichern in einer Variablens
Zeichen verliert, wenn Sie es nur zweimal schreiben.Geh 150
Ungolfed, nichts heikles, meistens von @ Pietu1998 gestohlen
http://play.golang.org/p/IWkT0c4Ev5
quelle
Java, 162
Erläuterung
quelle
dc,
134132131 BytesVerwenden Sie
echo $n $code | dc
, wo$n
ist n und$code
ist ... der Code ( keuchen ). Zitat nach Geschmack.Bearbeiten: Wenn Sie mich nicht für eine Erklärung belästigen, werde ich nie dazu kommen.
quelle
Perl 5, 131
Eine naive Lösung (dh eine direkte Umsetzung der Definition). Eine Unterroutine, die Eingaben als Liste von
1
s der gewünschten Länge annimmt .Visualisieren Sie die Ausgabe, indem Sie z
print sub...->(1,1,1,1,1)
.Erläuterung:
map$a[$_]=$_,1..3*@_
Erstellt das Array@a
und indiziert jede Ganzzahl für sich, und zwar das 1- bis 3-fache der Größe von@_
(der Eingabe).($a[$a[$_-1]+$a[$_]],$a[abs($a[$_-1]-$a[$_])])=($a[abs($a[$_-1]-$a[$_])],$a[$a[$_-1]+$a[$_]])for 2..@_
wiederholt das Umschalten wiederholt (einmal weniger als die Größe von@_
) und wechselt$a[$a[$_-1]+$a[$_]]
mit$a[abs($a[$_-1]-$a[$_])]
as$_
von 2 bis zur Größe von@_
.Und dann kehrt das Unterprogramm zurück
$a[1]
.quelle
Perl 5 , 90 + 1 (-p) = 91 Bytes
Probieren Sie es online!
quelle