Daftar tertaut ganda adalah struktur data di mana setiap node memiliki value
serta "tautan" ke kedua previous
dan berikutnya nodes
dalam daftar. Misalnya, pertimbangkan simpul berikut dengan nilai 12, 99, dan 37:
Di sini, node dengan nilai 12 dan 99 menunjuk ke masing-masing next
node, dengan nilai 99 dan 37 . Node dengan nilai 37 tidak memiliki next
pointer karena ini adalah node terakhir dalam daftar. Demikian juga, node dengan nilai 99 dan 37 menunjuk ke masing-masing previous
node, 12 dan 99 , tetapi 12 tidak memiliki previous
pointer karena itu adalah simpul pertama dalam daftar.
Pengaturan
Dalam praktiknya, "tautan" simpul diimplementasikan sebagai petunjuk ke lokasi simpul sebelumnya dan berikutnya dalam memori. Untuk keperluan kita, "memori" akan menjadi array node dan lokasi node akan menjadi indeksnya dalam array. Node dapat dianggap sebagai 3-tupel dari formulir ( prev value next )
. Contoh di atas, maka, mungkin terlihat seperti ini:
Tapi ini mungkin terlihat seperti ini:
Mulai dari sembarang simpul, Anda dapat mengikuti previous
tautan (ditampilkan sebagai asal dari panah merah) untuk sampai ke simpul yang mendahuluinya dan next
tautan (panah hijau) untuk menemukan simpul berikutnya untuk mendapatkan semua nilai simpul secara berurutan: [12, 99, 37]
.
Diagram pertama di atas dapat direpresentasikan dalam array sebagai [[null, 12, 1], [0, 99, 2], [1, 37, null]]
. Maka, yang kedua adalah [[2, 99, 1], [0, 37, null], [null, 12, 0]]
.
Tantangan
Tulis sebuah program yang mengambil input array node dan indeks node dan mengembalikan, dalam urutan daftar, nilai-nilai node dalam daftar yang ditautkan dua kali lipat.
Komplikasi
"Memori" tidak akan selalu berisi node hanya dari satu daftar. Mungkin berisi beberapa daftar:
Array di atas berisi tiga daftar tertaut ganda, kode warna untuk kenyamanan Anda:
Node di indeks
7
,10
,1
,4
,3
,12
(hanya menampilkannext
link untuk mengurangi kekacauan; klik untuk memperbesar):Dengan array ini dan salah satu dari indeks ini, program Anda harus mengembalikan, sesuai urutan, nilainya
[0, 1, 1, 2, 3, 5, 8]
.Node pada indeks
9
:Diberikan indeks
9
, program Anda harus kembali[99]
.Node di indeks
11
,8
,0
,6
,2
:Mengingat salah satu dari indeks ini, itu harus kembali
[2, 3, 5, 7, 11]
.
Aturan
Memasukkan
Program Anda akan menerima sebagai masukan:
Daftar 𝒏 simpul (3-tupel seperti dijelaskan di atas), di mana 1 ≤ 𝒏 ≤ 1.000, dalam format apa pun yang mudah digunakan, misalnya array array, array "flat" bilangan bulat dengan panjang 3𝒏, dll.
Elemen 3-tupel mungkin dalam urutan apa pun:
( prev value next )
,,( next prev value )
dll. Untuk setiap node,prev
dannext
akan menjadinull
(atau nilai lain yang nyaman, misalnya-1
), menunjukkan node pertama atau terakhir dalam daftar yang ditautkan ganda, atau indeks yang valid dari daftar, baik berbasis 0 atau 1 sesuai nyaman.value
akan menjadi bilangan bulat 32-bit yang ditandatangani atau jenis bilangan bulat terbesar yang didukung bahasa Anda, mana yang lebih kecil.Indeks 𝒑 dari sebuah simpul dalam daftar (1). Node yang ditunjukkan mungkin merupakan simpul pertama dalam daftar yang tertaut ganda, simpul terakhir, simpul tengah, atau bahkan satu-satunya simpul.
Daftar input (1) dapat berisi data patologis (mis. Siklus, simpul yang ditunjuk oleh banyak simpul lain, dll.), Tetapi indeks input (2) akan selalu menunjuk ke suatu simpul dari mana satu output tunggal yang terbentuk dapat disimpulkan.
Keluaran
Program Anda harus menampilkan nilai-nilai node dari daftar yang ditautkan ganda di mana simpul pada indeks 𝒑 adalah anggota, dalam urutan daftar. Output dapat dalam format apa pun yang nyaman, tetapi datanya harus hanya menyertakan node value
s.
Kemenangan
Ini adalah kode-golf . Jawaban terpendek dalam byte menang. Celah standar berlaku.
Uji kasus
Di bawah ini, setiap test case berbentuk:
X)
prev value next, prev value next, ...
index
value value value ...
... di mana X
adalah huruf untuk mengidentifikasi kasus uji, baris kedua adalah daftar input, baris ketiga adalah indeks input berbasis 0, dan baris keempat adalah output.
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
sumber
Jawaban:
05AB1E , 25 byte
Cobalah online!
Penjelasan
sumber
Haskell ,
79655955 byte-6 byte berkat Brute Force .
Menentukan fungsi
#
yang menerima daftar daftar bilangan bulat,null
yang direpresentasikan sebagai-1
, dan mengembalikan daftar nilai simpul.Cobalah online!
Penjelasan
Tentukan fungsi
!
yang berulang melalui node mulai dari nodei
dan mengembalikan daftar indeks yang dikunjungi. Ia menerima argumen keduad
yang menentukan indeks mana dari "tuple" yang digunakan sebagai indeks dari node berikutnya (d==2
untuk beralih ke depan,d==0
untuk beralih ke belakang).Iterate mundur mulai dari indeks yang diberikan dan kembali indeks yang dikunjungi.
Ambil indeks yang terakhir dikunjungi, yang merupakan awal daftar.
Iterate dari awal daftar.
Ganti setiap indeks yang dikunjungi dengan nilai node.
sumber
x!!i!!1
sebagaii!1!!1
, tetapi rusak karena-1
di output. Jika Anda hanya memilih nilai sentinel lain untuk diwakilinull
(katakan,-9
), itu akan berfungsi, tetapi akan selalu rusak untuk beberapa input, yang cukup mengganggu.Python 2 , 60 byte
Cobalah online!
Ini adalah jawaban Chas Brown, minus golf ini:
sumber
Bersih ,
949088 byteCobalah online!
sumber
MATL , 39 byte
Cobalah online!
Hampir merupakan port langsung dari jawaban Oktaf saya, tetapi versi ini menemukan akhir terlebih dahulu, dan kemudian bekerja kembali, daripada sebaliknya, yang menghemat satu byte.
sumber
PHP, 132 byte
Cobalah online!
Input diambil sebagai QueryString
x[]=-1&x[]=1&x[]=1...
(semua node dalam array datar), di urutannext
,prev
makavalue
untuk setiap node dengan -1 digunakan untuk mengakhiri node.sumber
Python 2 ,
8177 byteCobalah online!
EDIT: Thx to Mr. Xcoder untuk 4 byte ...
Mengambil daftar tupel [u, v, w] di mana u dan w adalah -1 untuk mewakili awal / akhir segmen daftar tertaut.
sumber
0
Falsy, dan karena ituu>=0
bisa di-golf-kanu+1
dan ini bisa lebih pendek-~u
untuk menghilangkan spasi.Oktaf ,
817876 byteCobalah online!
Versi yang agak mudah. Penjelasan dibiarkan sebagai latihan untuk pembaca. Versi yang jauh lebih menyenangkan disajikan di bawah ini:
Oktaf ,
1429992 byteCobalah online!
Yo, saya dengar Anda menyukai fungsi anonim ...
Mengambil
nx3
array, dengan kolom pertama pendahulunya, kolom kedua nilai, dan nilai ketiga node penerus. Semua indeks node berbasis 1, yang merupakan standar dalam Oktaf.sumber
Kotlin , 85 byte
Yg diperindahkan
Uji
TIO
TryItOnline
sumber
JavaScript ES6,
7063 BytesKasus cobaan:
sumber
alert
kebutuhan untuk berada di tubuh utama dari fungsi dan dihitung terhadap total byte Anda.