Bayangkan Anda memiliki array bilangan bulat, yang nilai non-negatifnya adalah pointer ke posisi lain dalam array yang sama, hanya saja nilai-nilai itu mewakili terowongan, jadi jika nilai di posisi A positif dan menunjuk ke posisi B, maka nilai di posisi B harus juga positif dan arahkan ke posisi A untuk mewakili kedua ujung terowongan. Begitu:
Tantangan
- Diberikan array bilangan bulat, periksa apakah array sesuai dengan batasan menjadi array tunneling dan mengembalikan dua nilai koheren yang berbeda untuk truthy dan falsey.
- Nilai dalam array akan berada di bawah nol untuk posisi non-terowongan, dan nol atau di atas untuk posisi terowongan. Jika larik Anda diindeks 1, maka nilai nol mewakili posisi non-terowongan. Nilai-nilai non-terowongan tidak perlu diperiksa.
- Jika nilai positif dalam sel menunjuk ke dirinya sendiri, itu adalah kesalahan. Jika A menunjuk ke B, B ke C dan C ke A, itu kesalahan. Jika nilai positif menunjuk di luar batas array, itu kesalahan.
Contohnya
Contoh-contoh berikut diindeks 0:
[-1, -1, -1, 6, -1, -1, 3, -1, -1] Truthy (position 3 points to position 6 and vice versa)
[1, 0] Truthy (position 0 points to position 1 and vice versa)
[0, 1] Falsey (positions 0 and 1 point to themselves)
[4, 2, 1, -1, 0, -1] Truthy
[2, 3, 0, 1] Truthy
[1, 2, 0] Falsey (no circular tunnels allowed)
[-1, 2, -1] Falsey (tunnel without end)
[] Truthy (no tunnels, that's OK)
[-1, -2, -3] Truthy (no tunnels, that's OK)
[1, 0, 3] Falsey (tunnel goes beyond limits)
[1] Falsey (tunnel goes beyond limits)
[1, 0, 3, 7] Falsey (tunnel goes beyond limits)
Ini adalah kode-golf , jadi semoga kode terpendek untuk setiap bahasa menang!
[0]
?[0,1]
dan[0,-1,2]
kasing?[0,1]
ada dalam contoh. "Jika nilai positif dalam sel menunjuk ke dirinya sendiri, itu kesalahan"[2,3,0,1]
Jawaban:
R , 47 byte
Cobalah online!
Kode dan penjelasan yang belum dibuka:
sumber
Python 2 ,
666160 byteCobalah online!
sumber
APL (Dyalog Unicode) ,
1924 byteCobalah online!
Awali lambda anonim, kembalikan 1 untuk truey dan 0 untuk falsy. TIO link berisi versi "prettified" dari output untuk kasus uji.
Shoutouts to @ngn dan @ Adám untuk menghemat sekitar satu miliar bita.
Sebuah shoutout ekstra ke @ngn untuk bantuan memperbaiki jawaban untuk beberapa kasus uji, dan menjadikannya kereta.
Jawaban yang diperbarui menggunakan
⎕IO←0
, mengatur I ndex O rigin ke 0.Bagaimana:
sumber
0<
→×
Saya pikirJavaScript (ES6), 35 byte
Disimpan 1 byte berkat @Shaggy
Cobalah online!
Berkomentar
sumber
a=>a.every((v,i)=>v<0|v!=i&a[v]==i)
.Python 2 , 65 byte
Cobalah online!
sumber
Jelly , 16 byte
Cobalah online!
1-diindeks.
sumber
Perl 6 , 36 byte
Cobalah online!
Ide dasarnya adalah untuk memeriksa apakah set
{ i, a[i], a[a[i]] }
berisi tepat dua elemen yang berbeda untuk masing-masing indeksi
dengana[i] >= 0
. Jika sebuah elemen menunjuk ke dirinya sendiri, set hanya berisi satu elemen yang berbeda. Jika ujung yang lain tidak mengarah ke belakangi
, set tersebut berisi tiga elemen berbeda. Jikaa[i] < 0
,xx
faktornya nol atau negatif, maka himpunannya{ i, a[i] }
, juga dengan dua elemen berbeda.sumber
MATL ,
1918 Bytes-1 Byte, terima kasih untuk Luis
Cobalah online! , untuk yang pertama saja, karena saya tidak tahu bagaimana melakukan semuanya!
Memberi
0
jika benar, bilangan bulat bukan nol jika falsey, mis. untuk test case 6 memberikan4
.Harap diingat bahwa seperti MATLAB, MATL 1-diindeks jadi 1 harus ditambahkan ke dalam test case!
Tidak pernah bermain golf di Esolang sebelumnya, jadi saran sangat diterima!
Dijelaskan:
sumber
05AB1E ,
161514 byte-1 byte terima kasih kepada @Dorian .
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
ε
dengany
. Jadi tidak perlu©
, dan masing-masing®
digantikan olehy
Japt
-e
, 11 byteCobalah
Asli (tanpa bendera),
1413 byteCobalah atau jalankan semua test case
sumber
Python,
112979686 byteCobalah secara Online!
Pengembalian
True
atauFalse
.-10 byte berkat @Rod dan @TFeld.
sumber
K (ngn / k) , 33 byte
Cobalah online!
sumber
Haskell , 48 byte
Verifikasi semua testcases!
Penjelasan
Mari kita ungolf sedikit kode dulu. Sama
f =<< g
seperti\x -> f (g x) x
, kode ini setara denganyang sedikit lebih jelas.
Solusi ini didasarkan pada pengamatan sederhana: biarkan
a
menjadi array input, danu
daftar pasangan di(i, a[i])
manai
indeks. Kemudiana
adalah array valid jika dan hanya jika untuk setiap(x, y)
dalamu
dengany >= 0
, pasangan(y, x)
miliku
juga.sumber
Java (JDK) , 89 byte
Cobalah online!
Kredit
sumber
r
dan keluar dari loop analog dengan di siniArang , 22 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Keluaran
-
untuk kebenaran dan tidak ada untuk kepalsuan. Catatan: Memasukkan array kosong tampaknya menabrak Arang, tetapi untuk saat ini Anda dapat memasukkan spasi, yang cukup dekat. Penjelasan:sumber
Pascal (FPC) ,
165155153 byteCobalah online!
Berfungsi kali ini karena inputnya adalah array. Kembali
1
untuk kebenaran dan0
kepalsuan.sumber
Bersih , 60 byte
Cobalah online!
Bersih , 142 byte
Versi monster yang sangat rumit:
Cobalah online!
Dijelaskan:
sumber
Ruby , 44 byte
Cobalah online!
sumber
Pyth ,
1716 byteCoba online di sini , atau verifikasi semua uji sekaligus di sini .
Sunting: menyadari bahwa trailing k juga tidak perlu
sumber
Groovy , 52 byte
Cobalah online!
sumber
Perl 5 , 54 byte
Cobalah online!
sumber
C (gcc) , 95 byte
Cobalah online!
sumber
Mathematica, 42 byte
Fungsi murni. Mengambil daftar angka 1-diindeks sebagai input dan pengembalian
True
atauFalse
sebagai output. Cukup ikuti terowongan, pastikan0
peta untuk0
, tidak ada siklus 1, dan semua siklus siklus 2. (Saya tidak sepenuhnya yakin apakah ini gagal pada setiap kasus tepi, tetapi memberikan hasil yang benar untuk contoh-contoh.)sumber
Jawaban ini tidak berfungsi. Di sini hanya untuk ilustrasi.
Jawaban ini melewati semua kasus uji yang diposting (saat ini). Namun, gagal (menimbulkan kesalahan) pada input yang valid lainnya, seperti
[1, 2]
atau[1, 0, 3, 7]
.Bagaimana itu bisa berlalu
[1, 0, 3]
dan gagal[1, 0, 3, 7]
? Yah, itu berlanjut melalui daftar, seperti yang Anda harapkan. Ketika membaca elemenx
daftara
, itu pertama-tama memeriksa apakahx
kurang darilen(a)
, dan segera kembaliFalse
, jika demikian. Jadi benar mengembalikanFalse
pada[1, 0, 3]
, karena3
tidak kurang darilen(a)
.Tetapi dengan asumsi bahwa
x
melewati pemeriksaan itu, kode kemudian akan melakukan beberapa pemeriksaan lain, dan pada titik tertentu itu terjadi untuk mengevaluasia[a[x]]
. Kami sudah dijamin bahwa evaluasia[x]
akan OK ... tapi tidaka[a[x]]
, yang memutuskan untuka[7]
saatx
ini3
dalam[1, 0, 3, 7]
contoh. Pada titik ini Python memunculkanIndexError
, bukannya kembaliFalse
.Untuk kelengkapan, inilah jawabannya.
Python 2 , 59 byte
Cobalah online!
Saya ingin melakukannya
x<len(a)and-1<a[x]...
, tetapi tentu sajalen(a)
selalu>-1
, jadi di atas adalah setara. Pemeriksaan ini total 5 hubungan dirantai (<
,>
,<
,!=
, dan==
), ditambah pemeriksaan terpisah-1<x
diif
kondisi.Python (dengan mudah) hubungan pendek hubungan berantai seperti ini, jadi misalnya jika
x>=len(a)
kemudian cek kembaliFalse
sebelum sampai kea[x]
(yang sebaliknya akan meningkatkan suatuIndexError
).sumber