pengantar
Misalkan Anda memiliki penggaris dengan angka dari 0 hingga r-1 . Anda menempatkan semut di antara dua angka, dan ia mulai merangkak tak menentu pada penggaris. Penguasa sangat sempit sehingga semut tidak bisa berjalan dari satu posisi ke posisi lain tanpa berjalan di semua nomor di antaranya. Saat semut berjalan pada nomor untuk pertama kalinya, Anda merekamnya, dan ini memberi Anda permutasi dari angka r . Kami mengatakan bahwa permutasi adalah gelisah jika dapat dihasilkan oleh semut dengan cara ini. Atau, permutasi p gelisah jika setiap entri p [i] kecuali yang pertama berada dalam jarak 1 dari beberapa entri sebelumnya.
Contohnya
Panjang-6 permutasi
4, 3, 5, 2, 1, 0
gelisah, karena 3 berada dalam jarak 1 dari 4 , 5 berada dalam jarak 1 dari 4 , 2 berada dalam jarak 1 dari 3 , 1 berada dalam jarak 1 dari 2 , dan 0 berada dalam jarak 1 dari 1 . Permutasi
3, 2, 5, 4, 1, 0
tidak gelisah, karena 5 tidak berada dalam jarak 1 dari 3 atau 2 ; semut harus melewati 4 untuk sampai ke 5 .
Tugas
Diberi permutasi dari angka-angka dari 0 ke r-1 untuk sekitar 1 ≤ r ≤ 100 dalam format apa pun yang masuk akal, mengeluarkan nilai yang benar jika permutasi itu gelisah, dan nilai yang salah jika tidak.
Uji kasus
[0] -> True
[0, 1] -> True
[1, 0] -> True
[0, 1, 2] -> True
[0, 2, 1] -> False
[2, 1, 3, 0] -> True
[3, 1, 0, 2] -> False
[1, 2, 0, 3] -> True
[2, 3, 1, 4, 0] -> True
[2, 3, 0, 4, 1] -> False
[0, 5, 1, 3, 2, 4] -> False
[6, 5, 4, 7, 3, 8, 9, 2, 1, 0] -> True
[4, 3, 5, 6, 7, 2, 9, 1, 0, 8] -> False
[5, 2, 7, 9, 6, 8, 0, 4, 1, 3] -> False
[20, 13, 7, 0, 14, 16, 10, 24, 21, 1, 8, 23, 17, 18, 11, 2, 6, 22, 4, 5, 9, 12, 3, 15, 19] -> False
[34, 36, 99, 94, 77, 93, 31, 90, 21, 88, 30, 66, 92, 83, 42, 5, 86, 11, 15, 78, 40, 48, 22, 29, 95, 64, 97, 43, 14, 33, 69, 49, 50, 35, 74, 46, 26, 51, 75, 87, 23, 85, 41, 98, 82, 79, 59, 56, 37, 96, 45, 17, 32, 91, 62, 20, 4, 9, 2, 18, 27, 60, 63, 25, 61, 76, 1, 55, 16, 8, 6, 38, 54, 47, 73, 67, 53, 57, 7, 72, 84, 39, 52, 58, 0, 89, 12, 68, 70, 24, 80, 3, 44, 13, 28, 10, 71, 65, 81, 19] -> False
[47, 48, 46, 45, 44, 49, 43, 42, 41, 50, 40, 39, 38, 51, 37, 36, 52, 35, 34, 33, 32, 53, 54, 31, 30, 55, 56, 29, 28, 57, 58, 59, 60, 27, 26, 61, 25, 62, 63, 64, 65, 66, 67, 24, 23, 22, 21, 68, 69, 20, 19, 18, 17, 70, 71, 16, 15, 72, 73, 74, 75, 76, 14, 13, 12, 77, 11, 10, 9, 8, 78, 7, 79, 80, 6, 81, 5, 4, 3, 82, 2, 83, 84, 1, 85, 86, 87, 0, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99] -> True
Fakta menyenangkan: untuk r ≥ 1 , ada tepat 2 r-1 permutasi panjang gelisah r .
Jawaban:
Pyth, 7 byte
Cobalah online. (Hanya kasus uji kecil yang disertakan karena run-time eksponensial.) Output 2 untuk Truthy, 0 untuk Falsey.
Dengan kata lain,
di mana
subseq
menampilkan apakah elemen-elemen dari daftar pertama muncul secara berurutan dalam daftar kedua, tidak harus berdekatan. Halsubseq
ini dilakukan dalam Pyth dengan mengambil semua himpunan bagian dari daftar kedua, yang menjaga urutan elemen, dan menghitung jumlah kemunculan daftar pertama. Ini membutuhkan waktu yang eksponensial.Mengapa ini bekerja? Untuk permutasi menjadi gelisah, melangkah dari 0 ke n-1 harus terdiri dari hanya akan pergi, kemudian pergi hanya ke kanan. Ini karena elemen yang lebih besar dari elemen pertama harus meningkat dari kiri ke kanan, dan yang kurang dari itu harus berkurang dari kiri ke kanan.
Jika kita mirror daftar dengan meletakkan salinan terbalik ke kiri, jalan ini sekarang hanya berjalan dengan benar.
Sebaliknya, setiap kanan daftar cermin ini sesuai dengan jalan kiri-lalu-kanan dari daftar asli. Kanan ini hanya merupakan urutan berikutnya dari 0 hingga n-1. Dalam daftar gelisah, urutan diurutkan ini unik, kecuali untuk pilihan sewenang-wenang antara dua salinan yang berdekatan dari elemen pertama yang asli.
sumber
Haskell, 46 byte
Cek apakah perbedaan vektor maxima yang sedang berjalan dan minima yang sedang berjalan adalah [0,1,2,3 ...].
Zgarb menyimpan 2 byte dengan
(%)=scanl1
.sumber
(#)=scanl1
?JavaScript (ES6), 45
Saya pikir itu terlalu sederhana untuk dibutuhkan sebagai penjelasan, tetapi ada trik, dan untuk berjaga-jaga, ini adalah versi pertama saya, pra-golf
Catatan: dalam kode golf
a
digunakan bukank
, karena saya tidak perlu referensi ke array asli di dalamevery
panggilan. Jadi saya menghindari mencemari namespace global menggunakan kembali parameterUji
sumber
f=([q,...a],x=[])=>x&&(x[q]=!(x+x)|x[q+1]|x[q-1])&&(a+a?f(a,x):1)
Python 2, 49 byte
Cek apakah setiap awalan daftar berisi semua angka antara min dan maks inklusif. Ia melakukannya dengan memeriksa apakah perbedaan max dan min kurang dari panjangnya.
54 byte:
Memeriksa apakah elemen terakhir kurang dari satu min dari elemen lainnya, atau satu lebih dari maks. Kemudian, hapus elemen terakhir dan berulang. Pada daftar elemen tunggal, menghasilkan True.
Ini juga dapat diperiksa melalui pemahaman daftar yang lucu tapi lebih lama.
Saya ingin menggunakan ketidaksetaraan
min(l)-2<l.pop()<max(l)+2
, tetapipop
kebutuhan harus terjadi terlebih dahulu. Menggunakan program untuk menghasilkan melalui kode kesalahan kemungkinan akan lebih pendek.sumber
Mathematica, 42 byte
Gunakan pencocokan pola untuk mencoba dan menemukan awalan
a
yang selisih maksimumnya dari elemen berikutnyab
lebih besar dari1
(dan meniadakan hasilMatchQ
).sumber
Perl,
393835 byteTermasuk +1 untuk
-p
Berikan urutan pada STDIN:
antsy.pl
:sumber
MATL , 11 byte
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Ini menghitung matriks dari semua perbedaan mutlak berpasangan dan menjaga bagian segitiga atas. Hasilnya benar jika ada setidaknya nilai 1 di semua kolom kecuali yang pertama.
sumber
R,
726460 bytePermutasi gelisah jika dan hanya jika semua subpermutasi kirinya kontinu (yaitu memiliki perbedaan satu ketika diurutkan).
Jika input dijamin memiliki panjang lebih dari satu, maka kita dapat menggantinya1:sum(1|v)
denganseq(v)
, yang menghemat empat byte.Kondisi
seq(v)
in jika berperilaku berbeda ketika inputnya panjang satu --- itu menghasilkan urutan1:v
bukanseq_along(v)
. Namun, untungnya, hasilnya ternyataTRUE
dalam kasus ini, yang merupakan perilaku yang diinginkan. Hal yang sama juga terjadi untuk input panjang nol.Dalam R,
T
adalah variabel preset sama denganTRUE
(tetapi R memungkinkan Anda untuk mendefinisikannya kembali).TRUE
juga dianggap sama dengan1
.Terima kasih kepada @Billywob untuk beberapa peningkatan bermanfaat pada solusi asli.
sumber
scan
akan menghemat dua byte. Dalam hal ini jumlah byte yang persis sama denganfor
pendekatan loop:v=scan();c=c();for(i in 1:sum(1|v))c=c(c,diff(sort(v[1:i])));all(c==1)
yang akan menjadi 2 byte lebih pendek dari pendekatan vektor Anda.T
. Akan diedit.05AB1E , 7 byte
Cobalah online! atau sebagai test suite yang dimodifikasi .
Penjelasan
Menggunakan proses yang dijelaskan oleh xnor dalam jawaban Pyth-nya yang brilian .
Mengembalikan 2 untuk contoh yang benar dan 0 untuk yang salah.
sumber
Perl, 63 byte
Perhatikan bahwa @Gabriel Banamy datang dengan (55 bytes) lebih pendek jawabannya . Tapi saya pikir solusi ini masih menarik, jadi saya mempostingnya.
Hitungan byte mencakup 62 byte kode dan
-n
bendera.Untuk menjalankannya:
Penjelasan singkat : mengonversi setiap angka
k
ke representasi unaryk+1
(yang+1
diperlukan agar0
tidak diabaikan). Kemudian untuk setiap angkak+1
(dinyatakan dalam unary as1(1*)
), kita melihat apakah adak
($1
memegangk
) atauk+2
(yang kemudian11$1
) ada dalam string sebelumnya (direferensikan oleh$-backtick
). Jika tidak, maka kita atur$.
ke nol. Pada akhirnya kami mencetak$.
yang akan menjadi1
jika kami tidak pernah mengaturnya ke nol, atau nol sebaliknya.sumber
Brain-Flak
302 264256 BytesTerima kasih kepada Wheat Wizard untuk menyimpan 46 byte
Bagian atas tumpukan akan menjadi 1 untuk truey dan 0 untuk falsy.
Truthy: Cobalah Online!
Falsy: Cobalah Online!
Idenya adalah untuk memegang nomor minimum dan maksimum yang telah dikunjungi semut di tumpukan. Kemudian bandingkan setiap nomor dengan keduanya dan perbarui yang sesuai. Jika angka berikutnya tidak 1 kurang dari min atau 1 lebih dari maks, keluar dari loop dan kembalikan false.
Penjelasan singkat:
sumber
([]){({}[()]<({}<>)<>>)}{}
dengan([]){{}({}<>)<>([])}{}
untuk menyimpan beberapa byte lagiJelly ,
987 byteCobalah secara Online!
Terjemahan Jelly untuk jawaban xnor.
Solusi lama:
Cobalah online!
Bekerja sangat mirip dengan jawaban Pyth saya di bawah:
sumber
»\_«\⁼Ṣ
tetapi jauh lebih efisienŒBŒPċṢ
dan;\Ṣ€IỊȦ
harus menyimpan satu byte dalam setiap pendekatan.UŒBŒPċṢ
yang tidak menyimpan byte. ItuỊ
bagus, meskipun; Saya telah salah membaca atom itu untuk menghasilkan BUKAN logis dari apa yang sebenarnya dilakukannya.U
(atau@
sekarang saya memikirkannya). Jika sebuah array gelisah, begitu pula array terbalik, bukan?[2, 1, 3, 0]
gelisah tetapi[0, 3, 1, 2]
tidak.CJam (
2120 byte)Test suite online
Pembedahan
Ini menggunakan pengamatan oleh xnor dalam jawabannya Haskell bahwa perbedaan antara maksimum dan minimum
n
elemen pertama harusn-1
.Pendekatan alternatif (juga 20 byte)
Test suite online
Ini memeriksa secara langsung bahwa setiap elemen setelah yang pertama berada pada jarak 1 dari elemen sebelumnya. Karena input adalah permutasi dan karenanya tidak mengulangi nilai, ini adalah tes yang cukup. Terima kasih kepada Martin untuk penghematan 1 byte.
Pembedahan
sumber
{_{a+_)f-:z1&,*}*^!}
Java,
100987975 byteDahulu:
Disimpan 3 byte dengan mengganti
true
danfalse
dengan1>0
dan0>1
.Disimpan 23 byte berkat saran luar biasa dari Peter Taylor!
Tidak Disatukan:
Melacak nilai tertinggi dan terendah yang terlihat sejauh
m
dann
; hanya menerima nilai baru jika itum + 1
ataun - 1
yaitu nilai berikutnya yang lebih tinggi atau lebih rendah; inisialisasi nilai tinggi,m
,, menjadi satu kurang dari elemen pertama sehingga akan "cocok" pertama kali di sekitar loop. Catatan: ini adalah algoritma online waktu linear. Ini hanya membutuhkan tiga kata memori, untuk nilai saat ini, tertinggi sejauh ini, dan terendah sejauh ini, tidak seperti banyak solusi lainnya.Jika nilai berikutnya melewatkan ujung tinggi dan rendah dari kisaran, nilai terendah sejauh ini diatur ke
-1
dan kemudian ujung rendah tidak akan pernah dapat melanjutkan dan mencapai nol. Kami kemudian mendeteksi urutan gelisah dengan memeriksa apakah nilai rendah,n
,, mencapai nol.(Sayangnya ini kurang efisien karena kita selalu harus melihat seluruh urutan daripada menyerah setelah kesalahan pertama nomor yang , tetapi sulit untuk berdebat dengan penghematan 23-byte (!) Ketika solusi lain menggunakan O (n ^ 2 ) dan pendekatan waktu eksponensial.)
Pemakaian:
Catatan: ini juga dapat ditulis tanpa memanfaatkan Java 8 lambdas:
Java 7, 89 byte
sumber
int m,n;m=n=a[0];--m;
bisa jadiint n=a[0],m=n-1;
, dan yang mahalreturn
danelse
bisa dikurangi dengani==m+1?m++:n=(i==n-1)?i:-1;return n==0;
(atau yang serupa - saya belum menguji ini).m++
atau dim+=1
sana, jadi saya masih membutuhkanif
danelse
, dan kehilangan aspek hubungan pendek pada nilai buruk pertama, tetapi itu adalah peningkatan besar. Terima kasih!j
dan menetapkan hasilnya, tetapi curiga akan ada cara yang lebih baik untuk melakukannya.g
, dan saya tidak bisa membuatnya berfungsi. (Saya menggunakan Java 9-ea + 138, mungkin itu perbedaan antara Java 8 dan Java 9?) Saya dapat mencoba lagi besok.n-=i==m+1?m-m++:i==n-1?1:n+1;
Pyth ( fork ), 13 byte
Tidak ada tautan Try Try Online untuk garpu Pyth ini. Garpu menyertakan fungsi delta
.+
, yang bukan bagian dari pustaka Pyth standar.Penjelasan:
sumber
Perl,
6654 +1 = 55 byte+1 byte untuk
-n
.Penjelasan:
Mencetak 0 jika salah, 1 jika benar.
-11 byte terima kasih kepada @Dada
sumber
perl -nE 's/\d+/$.&=!@a||1~~[map{abs$_-$&}@a];push@a,$&/eg;say$.'
::-n
alih-alih<>=~
memungkinkan Anda untuk menghapus/r
modifier. gunakan\d+
lalu$&
ganti(\d+)
dan$1
.!@a
bukannya0>$#a
.$.&=
bukannya$.&&=
.push@a,$&
bukannya@a=(@a,$&)
Brainfuck, 60 byte
Permutasi diberikan sebagai byte tanpa pemisah dan tanpa baris baru terminasi. Karena
\x00
terjadi pada input, ini dirancang untuk implementasi denganEOF = -1
. Output\x00
untuk false dan\x01
true.Jika permutasi
\x01
hinggachr(r)
diizinkan, maka kami dapat mengganti semua instance,+
dengan,
untuk skor 57 dengan aEOF = 0
implementasi.Cobalah secara online (versi 57-byte): Input dapat diberikan sebagai permutasi dari setiap rentang byte yang berdekatan tidak termasuk
\x00
, dan output akan menjadi\x00
false dan minimum rentang untuk true.Kami melacak min dan max yang terlihat sejauh ini, dan untuk setiap karakter setelah yang pertama, periksa apakah min-1 atau max + 1 atau tidak. Dalam kasus keduanya, pindahkan pointer ke luar ruang kerja normal sehingga sel-sel lokal menjadi nol.
Tata letak memori dari ruang kerja normal pada awal loop utama adalah
c a b 0 0
di mana
c
karakter saat ini,a
min, danb
maks. (Untuk versi 60-byte, semuanya ditangani dengan offset 1 karena,+
.)sumber
Brachylog , 22 byte
Cobalah online!
Penjelasan
Saya belum menemukan cara singkat untuk memeriksa apakah daftar berisi bilangan bulat berturut-turut atau tidak. Yang terpendek yang saya temukan adalah untuk menghasilkan rentang antara elemen pertama dan terakhir dari daftar itu dan memeriksa bahwa rentang itu adalah daftar asli.
sumber
1
. Saya tidak tahu betapa mudahnya itu di Brachylog.Batch, 133 byte
Mengambil input sebagai argumen baris perintah. Keluar dengan tingkat kesalahan 0 untuk sukses, 1 untuk kegagalan.
sumber
J, 14 byte
Ini didasarkan pada @ xnor metode .
Penjelasan
sumber
Java, 170 byte
Array
x
memiliki nilai dari 0 hingga angka maksimum secara berurutan (Python akan jauh lebih baik di sini ...). Lingkaran mundur mencoba mencocokkan nomor terendah (x[b]
) atau tertinggi (x[e]
) yang belum ditemukan; jika ya, angka itu dapat dicapai pada langkah itu.Uji kode di sini .
sumber
Mathematica, 47 byte
Sedikit lebih lama dari solusi Martin Ender (kejutan kejutan!). Tapi itu salah satu upaya saya yang lebih sulit dibaca, jadi itu bagus: D
Penjelasan:
sumber
Java 7,
170169 byteTidak digabungkan & kode uji:
Coba di sini.
Keluaran:
sumber