Angenommen , wir haben eine Reihe der Länge mit Zeigern zeigt auf einer Stelle im Array: Der Prozess der „ Zeiger Springen “ wird alle Zeiger auf die Position des Zeigers gesetzt verweist er auf Punkte.
Für die Zwecke dieser Abfrage ist ein Zeiger der (auf Null basierende) Index eines Elements des Arrays. Dies impliziert, dass jedes Element im Array größer oder gleich und kleiner als . Unter Verwendung dieser Notation kann der Prozess wie folgt formuliert werden:
for i = 0..(n-1) {
ps[i] = ps[ps[i]]
}
Dies bedeutet (für diese Herausforderung), dass die Zeiger in sequentieller Reihenfolge an Ort und Stelle aktualisiert werden (dh zuerst niedrigere Indizes).
Beispiel
Lassen Sie uns ein Beispiel , ps = [2,1,4,1,3,2] :
Nach einer Iteration des " Zeigerspringens " erhalten wir das Array .
Herausforderung
Bei einem Array mit Indizes wird das Array ausgegeben, das durch Iterieren des oben beschriebenen Zeigersprungs erhalten wird, bis sich das Array nicht mehr ändert.
Regeln
Ihr Programm / Ihre Funktion wird denselben Typ, eine Liste / einen Vektor / ein Array usw. annehmen und zurückgeben / ausgeben, die / das
- ist garantiert nicht leer und
- enthält garantiert nur Einträge .
Varianten: Sie können wählen
- 1-basierte Indizierung verwenden oder
- Verwenden Sie aktuelle Zeiger,
Sie sollten dies jedoch in Ihrem Beitrag erwähnen.
Testfälle
[0] → [0]
[1,0] → [0,0]
[1,2,3,4,0] → [2,2,2,2,2]
[0,1,1,1,0,3] → [0,1,1,1,0,1]
[4,1,3,0,3,2] → [3,1,3,3,3,3]
[5,1,2,0,4,5,6] → [5,1,2,5,4,5,6]
[9,9,9,2,5,4,4,5,8,1,0,0] → [1,1,1,1,4,4,4,4,8,1,1,1]
n
als zusätzliche Eingabe verwenden?#[[#]]&~FixedPoint~#&
.Antworten:
JavaScript, 36 Bytes
Ändert das ursprüngliche Eingabearray.
Probieren Sie es online aus
quelle
Haskell, 56 Bytes
Haskell- und In-Place-Updates stimmen nicht überein.
Probieren Sie es online!
quelle
Python 2 , 53 Bytes
Probieren Sie es online!
-6 dank HyperNeutrino .
Ändert
l
das Ergebnis an Ort und Stelle.quelle
C ++ 14 (gcc) , 61 Bytes
Wie unbenanntes generisches Lambda. Benötigt sequentielle Container wie
std::vector
.Probieren Sie es online!
quelle
Schnell ,
6853 BytesProbieren Sie es online!
-15 dank BMO
quelle
f=
). Genieße deinen Aufenthalt hier!map
anstattforEach
es kürzer zu machen?JavaScript (ES6), 41 Byte
Probieren Sie es online!
quelle
05AB1E (Legacy) , 8 Byte
Probieren Sie es online!
Erläuterung
05AB1E , 14 Bytes
Probieren Sie es online!
quelle
Japt,
15,137 BytesÄndert das ursprüngliche Eingabearray.
Probieren Sie es aus (zusätzliche Bytes werden benötigt, um die geänderte Eingabe in die Konsole zu schreiben)
quelle
Java 8,
10554 BytesÄndert das Eingabearray, anstatt ein neues zurückzugeben, um Bytes zu sparen.
Probieren Sie es online aus.
Erläuterung:
quelle
Japt , 17 Bytes
Probieren Sie alle Testfälle aus
Das fühlt sich an, als sollte es kürzer sein, aber leider
UmgU
funktioniert mein erster Gedanke nicht, weil jederg
auf das Original zugreift,U
anstatt es bei jedem Schritt zu ändern. Die Aufbewahrung verschiedener Komponenten kostet ebenfalls eine Handvoll Bytes.Erläuterung:
quelle
C (clang) , 32 Bit,
4944 BytesProbieren Sie es online!
Verwendet Zeiger.
5045 Bytes mit ganzen Zahlen:Probieren Sie es online!
quelle
Ruby ,
3734 BytesProbieren Sie es online!
Gibt zurück, indem das Eingangsarray direkt geändert wird.
quelle
Rot , 63 Bytes
Probieren Sie es online!
Ändert das Array an Ort und Stelle
quelle
R ,
6058 Bytes-2 Bytes Dank an @digEmAll für das Lesen der Regeln.
Probieren Sie es online!
1-indiziert.
n
ist die Länge des Eingabearrays.rep(1:n,n)
repliziert1:n
n
mal (zBn=3 => 1,2,3,1,2,3,1,2,3
)Durchlaufen Sie die Array-
n
Zeiten. Der stationäre Zustand wird dann sicher erreicht sein, und zwar bis zum Ende des n-1. Males, denke ich. Der Beweis bleibt dem Leser überlassen.quelle
+1
und einfach die 1-basierte Eingabe nehmen, heißt es im Beitrag: Sie können 1-basierte Indizierung verwendenscan()
für die Eingabe. Ich habe immer das Gefühl, dass meinescan()
Lösungen suboptimal sind. Halten Sie also ein Auge auf einen kürzeren Weg, um sie zuzuweisenx
undn
zusammen:n=length(x<-scan());for(i in rep(1:n,n))x[i]=x[x[i]];x
Probieren Sie es online aus!Common Lisp,
5958 BytesProbieren Sie es online!
quelle
Sauber , 80 Bytes
Probieren Sie es online!
quelle
Clojure , 136 Bytes
Probieren Sie es online!
quelle
loop [
nicht werdenloop[
?Perl 5,
353426 Bytesunter Verwendung der Tatsache, dass die Konvergenz höchstens für die Größenanzahl der Iterationen erreicht wird
26 Bytes
34 Bytes
35 Bytes
quelle
Clojure , 88 Bytes
Probieren Sie es online!
quelle
Kohle , 16 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Leider arbeiten alle üblichen Mapping-Funktionen nur mit einer Kopie des Arrays, was dazu führt, dass sie die Elemente nur permutieren und nicht springen, sodass der Code alles manuell erledigen muss. Erläuterung:
Wiederholen Sie die innere Schleife einmal für jedes Element. Dies stellt nur sicher, dass sich das Ergebnis stabilisiert.
Schleife über die Array-Indizes.
Rufen Sie das Array-Element am aktuellen Index ab, indizieren Sie es im Array und ersetzen Sie das aktuelle Element durch diesen Wert.
Wandeln Sie die Elemente in Strings um und drucken Sie sie implizit in einer eigenen Zeile.
quelle
F #,
7473 BytesNichts Besonderes. Verwendet die Modulidee aus anderen Antworten.
quelle
K, 27 Bytes
{..}/
Wendet Lambda {..} auf Arg an (bis zur Konvergenz)inneres äußeres Lambda:
{..}/[x;y]
Wendet Lambda iterativ auf x (bei jeder Iteration aktualisiert) und ein Element von y an (y ist eine Liste von Werten und verwendet bei jeder Iteration ein Element). In diesem Fall ist arg y!#x
(bis count x, also die Indizes des Arrays).@[x;y;:;x x y]
Array x ändern (bei Index y x [x [y]] zuweisen)quelle
APL (Dyalog Unicode) , 26 Byte SBCS
Benötigt
⎕IO←0
Probieren Sie es online!
quelle