Une liste doublement liée est une structure de données dans laquelle chaque nœud a un value
ainsi que des «liens» à la fois au previous
et suivant nodes
dans la liste. Par exemple, considérez les nœuds suivants avec les valeurs 12, 99 et 37:
Ici, les nœuds avec les valeurs 12 et 99 pointent vers leurs next
nœuds respectifs , avec les valeurs 99 et 37 . Le nœud avec la valeur 37 n'a pas de next
pointeur car c'est le dernier nœud de la liste. De même, les nœuds avec les valeurs 99 et 37 pointent vers leurs previous
nœuds respectifs , 12 et 99 , mais 12 n'a pas de previous
pointeur car c'est le premier nœud de la liste.
La mise en place
En pratique, les "liens" d'un nœud sont implémentés en tant que pointeurs vers les emplacements du nœud précédent et suivant en mémoire. Pour nos besoins, la "mémoire" sera un tableau de nœuds et l'emplacement d'un nœud sera son index dans le tableau. Un nœud peut être considéré comme un triplet de la forme ( prev value next )
. L'exemple ci-dessus pourrait alors ressembler à ceci:
Mais cela pourrait plutôt ressembler à ceci:
À partir de n'importe quel nœud, vous pouvez suivre les previous
liens (indiqués comme les origines des flèches rouges) pour accéder aux nœuds qui le précèdent et les next
liens (flèches vertes) pour trouver les nœuds suivants afin d'obtenir toutes les valeurs des nœuds dans l'ordre: [12, 99, 37]
.
Le premier diagramme ci-dessus pourrait être représenté dans un tableau sous la forme [[null, 12, 1], [0, 99, 2], [1, 37, null]]
. Le second serait donc [[2, 99, 1], [0, 37, null], [null, 12, 0]]
.
Le défi
Écrivez un programme qui prend en entrée un tableau de nœuds et l'index d'un nœud et renvoie, dans l'ordre des listes, les valeurs des nœuds dans la même liste doublement liée.
Une complication
La "mémoire" ne contiendra pas toujours les nœuds d'une seule liste. Il peut contenir plusieurs listes:
Le tableau ci-dessus contient trois listes doublement liées, codées par couleur pour votre commodité:
Les noeuds à index
7
,10
,1
,4
,3
,12
(ne montrant que desnext
liens pour réduire l' encombrement, cliquez pour agrandir):Étant donné ce tableau et l'un de ces index, votre programme doit retourner, dans l'ordre, les valeurs
[0, 1, 1, 2, 3, 5, 8]
.Le nœud à l'index
9
:Compte tenu de l'index
9
, votre programme devrait revenir[99]
.Les noeuds à index
11
,8
,0
,6
,2
:Étant donné l'un de ces index, il devrait revenir
[2, 3, 5, 7, 11]
.
Règles
Contribution
Votre programme recevra en entrée:
Une liste de 𝒏 nœuds (3-tuples comme décrit ci-dessus), où 1 ≤ 𝒏 ≤ 1000, dans n'importe quel format pratique, par exemple un tableau de tableaux, un tableau "plat" d'entiers de longueur 3𝒏, etc.
Les éléments de 3-uplets peuvent être dans un ordre quelconque:
( prev value next )
,( next prev value )
, etc. Pour chaque noeud,prev
etnext
seranull
(ou une autre valeur appropriée, par exemple-1
), ce qui indique le premier ou le dernier noeud dans une liste doublement lié, ou un indice valide de la liste, soit 0 ou 1 comme il est commode.value
sera un entier 32 bits signé ou le plus grand type d'entier pris en charge par votre langue, le plus petit des deux.L'index 𝒑 d'un nœud dans la liste (1). Le nœud indiqué peut être le premier nœud d'une liste à double liaison, le dernier nœud, un nœud intermédiaire ou même le seul nœud.
La liste d'entrée (1) peut contenir des données pathologiques (par exemple des cycles, des nœuds pointés par plusieurs autres nœuds, etc.), mais l'index d'entrée (2) pointera toujours vers un nœud à partir duquel une sortie unique et bien formée peut être déduit.
Production
Votre programme devrait sortir les valeurs des nœuds de la liste doublement liée dont le nœud à l'index 𝒑 est membre, dans l'ordre des listes. La sortie peut être dans n'importe quel format pratique, mais ses données doivent inclure uniquement les nœuds value
.
Gagnant
C'est du code-golf . La réponse la plus courte en octets l'emporte. Des échappatoires standard s'appliquent.
Cas de test
Ci-dessous, chaque cas de test est de la forme:
X)
prev value next, prev value next, ...
index
value value value ...
... où X
est une lettre pour identifier le cas de test, la deuxième ligne est la liste d'entrée, la troisième ligne est l'index d'entrée basé sur 0 et la quatrième ligne est la sortie.
A) null 12 1, 0 99 2, 1 37 null
1
12 99 37
B) 2 99 1, 0 37 null, null 12 0
1
12 99 37
C) 8 5 6, 10 1 4, 6 11 null, 4 3 12, 1 2 3, 12 8 null, 0 7 2, null 0 10, 11 3 0, null 99 null, 7 1 1, null 2 8, 3 5 5
4
0 1 1 2 3 5 8
D) 8 5 6, 10 1 4, 6 11 null, 4 3 12, 1 2 3, 12 8 null, 0 7 2, null 0 10, 11 3 0, null 99 null, 7 1 1, null 2 8, 3 5 5
0
2 3 5 7 11
E) 8 5 6, 10 1 4, 6 11 null, 4 3 12, 1 2 3, 12 8 null, 0 7 2, null 0 10, 11 3 0, null 99 null, 7 1 1, null 2 8, 3 5 5
9
99
F) 13 80 18, 18 71 null, 5 10 19, 12 1 8, 19 21 null, 31 6 2, 17 5 26, 26 0 30, 3 -1 25, null 1 23, 27 6 17, 14 1 24, 28 -1 3, null 80 0, 20 4 11, 33 6 29, 24 9 33, 10 7 6, 0 67 1, 2 15 4, 32 1 14, null 1 31, 29 3 null, 9 -1 28, 11 5 16, 8 1 null, 6 3 7, null 8 10, 23 1 12, 15 5 22, 7 9 null, 21 3 5, null 3 20, 16 2 15
18
80 80 67 71
G) 13 80 18, 18 71 null, 5 10 19, 12 1 8, 19 21 null, 31 6 2, 17 5 26, 26 0 30, 3 -1 25, null 1 23, 27 6 17, 14 1 24, 28 -1 3, null 80 0, 20 4 11, 33 6 29, 24 9 33, 10 7 6, 0 67 1, 2 15 4, 32 1 14, null 1 31, 29 3 null, 9 -1 28, 11 5 16, 8 1 null, 6 3 7, null 8 10, 23 1 12, 15 5 22, 7 9 null, 21 3 5, null 3 20, 16 2 15
8
1 -1 1 -1 1 -1 1
H) 13 80 18, 18 71 null, 5 10 19, 12 1 8, 19 21 null, 31 6 2, 17 5 26, 26 0 30, 3 -1 25, null 1 23, 27 6 17, 14 1 24, 28 -1 3, null 80 0, 20 4 11, 33 6 29, 24 9 33, 10 7 6, 0 67 1, 2 15 4, 32 1 14, null 1 31, 29 3 null, 9 -1 28, 11 5 16, 8 1 null, 6 3 7, null 8 10, 23 1 12, 15 5 22, 7 9 null, 21 3 5, null 3 20, 16 2 15
4
1 3 6 10 15 21
I) 13 80 18, 18 71 null, 5 10 19, 12 1 8, 19 21 null, 31 6 2, 17 5 26, 26 0 30, 3 -1 25, null 1 23, 27 6 17, 14 1 24, 28 -1 3, null 80 0, 20 4 11, 33 6 29, 24 9 33, 10 7 6, 0 67 1, 2 15 4, 32 1 14, null 1 31, 29 3 null, 9 -1 28, 11 5 16, 8 1 null, 6 3 7, null 8 10, 23 1 12, 15 5 22, 7 9 null, 21 3 5, null 3 20, 16 2 15
14
3 1 4 1 5 9 2 6 5 3
J) 13 80 18, 18 71 null, 5 10 19, 12 1 8, 19 21 null, 31 6 2, 17 5 26, 26 0 30, 3 -1 25, null 1 23, 27 6 17, 14 1 24, 28 -1 3, null 80 0, 20 4 11, 33 6 29, 24 9 33, 10 7 6, 0 67 1, 2 15 4, 32 1 14, null 1 31, 29 3 null, 9 -1 28, 11 5 16, 8 1 null, 6 3 7, null 8 10, 23 1 12, 15 5 22, 7 9 null, 21 3 5, null 3 20, 16 2 15
17
8 6 7 5 3 0 9
K) 4 11 0, null 22 3, null 33 3, 1 44 4, 3 55 null, 7 66 7, 6 77 6
3
22 44 55
L) null -123 null
0
-123
la source
Réponses:
05AB1E , 25 octets
Essayez-le en ligne!
Explication
la source
Haskell ,
79655955 octets-6 octets grâce à Brute Force .
Définit une fonction
#
qui accepte une liste de listes d'entiers, oùnull
est représenté par-1
, et renvoie une liste de valeurs de nœuds.Essayez-le en ligne!
Explication
Définissez la fonction
!
qui parcourt les nœuds à partir du nœudi
et renvoie une liste des index visités. Il accepte le deuxième argumentd
qui spécifie quel index du "tuple" utiliser comme index du nœud suivant (d==2
pour itérer en avant,d==0
pour itérer en arrière).Itérer en arrière à partir de l'index donné et renvoyer les index visités.
Prenez le dernier index visité, qui est le début de la liste.
Répéter depuis le début de la liste.
Remplacez chaque index visité par la valeur du nœud.
la source
x!!i!!1
tant quei!1!!1
, mais il se casse à cause des-1
sorties. Si vous choisissez simplement une autre valeur sentinelle à représenternull
(par exemple-9
), cela fonctionnera, mais cela s'arrêtera toujours pour une entrée, ce qui est assez ennuyeux.Python 2 , 60 octets
Essayez-le en ligne!
C'est à peu près la réponse de Chas Brown, moins ces golfs:
la source
Nettoyer ,
949088 octetsEssayez-le en ligne!
la source
MATL , 39 octets
Essayez-le en ligne!
Presque un port direct de ma réponse Octave, mais cette version trouve la fin en premier, puis fonctionne en arrière, plutôt que dans l'autre sens, ce qui a permis d'économiser un octet.
la source
PHP, 132 octets
Essayez-le en ligne!
Entrée est prise en tant que chaîne de requête
x[]=-1&x[]=1&x[]=1...
(tous les noeuds dans un réseau plat), dans l'ordre denext
,prev
puisvalue
pour chaque noeud avec -1 utilisée pour mettre fin à des noeuds.la source
Python 2 ,
8177 octetsEssayez-le en ligne!
EDIT: Thx à M. Xcoder pour 4 octets ...
Prend une liste de tuples [u, v, w] où u et w sont -1 pour représenter le début / la fin du segment de liste liée.
la source
0
Falsy, etu>=0
peut donc être joué au golfu+1
et cela peut être encore raccourci-~u
pour supprimer les espaces blancs.Octave ,
817876 octetsEssayez-le en ligne!
Version plutôt simple. L'explication est laissée au lecteur comme exercice. Une version beaucoup plus amusante est présentée ci-dessous:
Octave ,
1429992 octetsEssayez-le en ligne!
Yo, j'ai entendu dire que vous aimiez les fonctions anonymes ...
Prend un
nx3
tableau, avec la première colonne le prédécesseur, la deuxième colonne la valeur et la troisième valeur les nœuds successeurs. Tous les indices de nœuds sont basés sur 1, ce qui est la valeur par défaut dans Octave.la source
Kotlin , 85 octets
Embellie
Tester
TIO
TryItOnline
la source
JavaScript ES6,
7063 octetsCas de test:
la source
alert
besoins doivent être dans le corps principal de votre fonction et comptés dans votre total d'octets.