Tulis sebuah program untuk menentukan apakah urutan periodik bilangan bulat positif memiliki properti yang, untuk setiap bilangan bulat yang n
terjadi dalam urutan, tidak pernah ada lebih dari n
bilangan bulat lainnya antara dua kejadian berturut-turut n
.
Misalnya, 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...
memang memiliki properti ini: setiap pasangan kejadian berurutan 2
memiliki paling banyak dua bilangan bulat di antara mereka (seperti 2, 3, 5, 2
dan 2, 3, 6, 2
; setiap pasangan kejadian berurutan 3
memiliki paling banyak tiga bilangan bulat di antara mereka, dan sama untuk 5
dan 6
.
Namun, 2, 3, 5, 2, 3, 4, 2, 3, 5, 2, 3, 4, ...
tidak memiliki properti ini: dua kejadian berturut-turut 4
, yaitu 4, 2, 3, 5, 2, 3, 4
, memiliki lebih dari empat bilangan bulat di antara mereka.
Input : representasi wajar dari urutan periodik bilangan bulat positif. Misalnya, daftar hingga seperti {2, 3, 5, 2, 3, 6}
dapat mewakili urutan tak terbatas pertama di 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...
atas. (Dalam hal ini, masalahnya bisa dinyatakan untuk daftar terbatas yang membungkus bukan untuk daftar periodik tak terbatas.)
Output : nilai kebenaran / kepalsuan.
Contoh kebenaran:
{1}
{8, 9}
{2, 3, 4}
{5, 5, 3, 3, 6}
{2, 3, 5, 2, 3, 6}
{6, 7, 3, 5, 3, 7}
{9, 4, 6, 7, 4, 5}
{1, 1, 1, 1, 1, 100, 1}
{1, 9, 1, 8, 1, 7, 1, 11}
Contoh-contoh palsu:
{1, 2, 3}
{2, 3, 9, 5}
{3, 5, 4, 4, 6}
{2, 3, 5, 2, 3, 4}
{3, 5, 7, 5, 9, 3, 7}
{5, 6, 7, 8, 9, 10, 11}
{1, 9, 1, 8, 1, 6, 1, 11}
Ini codegolf , jadi kode terpendek menang. Jawaban dalam semua bahasa dianjurkan.
sumber
Jawaban:
Haskell,
60575655 byteMengasumsikan bahwa daftar input mengandung setidaknya satu elemen.
Contoh penggunaan:
g [1]
->True
. Cobalah online!Biarkan
a
menjadi kepala daftar danb
ekor. Hasilnya adalahTrue
jikab
kosong atau jumlah elemen pada awalb
yang tidak sama dengana
tidak lebih besar daria
dan panggilan rekursiff b
jugaTrue
, lainFalse
. Mulai dengan dua kali daftar input.Sunting: @ Leo disimpan 3 byte. Terima kasih!
Sunting 2: @Laikoni menyimpan 1 byte. Terima kasih!
sumber
span
lebih pendek daripada menggunakantakeWhile
, jadi saya tidak melihatnya sama sekali.takeWhile
hampir selalu dapat disingkat menjadifst$span
ataufst.span
, yang menghemat byte lain.Python ,
5756 byte-1 byte terima kasih kepada Dennis (ganti
i+1:i+v+2
dengani:i-~v
dengani
offset 1 darienumerate
)Cobalah online!
Fungsi yang tidak disebutkan namanya mengambil daftar,,
a
dan menguji kondisi bahwa setiap nilai,v
munculin
irisan yang relevan di sebelah kanannya dalam gabungana
dengan dirinya sendiri(a+a)[i:i-~v]
, di mana indeks berbasis 1v
dalama
,i
disediakan olehenumerate(a,1)
.sumber
JavaScript (ES6),
67 65 55 54 5149 byteDisimpan 3B berkat @ETHproduksi dan 2B berkat @Arnauld
Penjelasan
Ini mendefinisikan fungsi yang mengambil array
a
sebagai input. Kemudian,.some
metode ini mengulangi array itu, menjalankan fungsi lain untuk setiap elemen.Fungsi dalam ini mengambil dua argumen,
b
danc
, nilai saat ini dan indeksnya. Fungsi menemukan indeks nilai saat ini, mulai dari indeksc + 1
. Kemudian memeriksa apakah indeks ini lebih besar dari nilai saat ini ditambah indeks saat ini (perbedaan antara dua kejadian dari nilai yang sama lebih besar darib
). Perhatikan bahwa ini mengembalikan kebalikan dari apa yang kita inginkan.Jika salah satu dari nilai-nilai ini dikembalikan
true
,.some
fungsi kembalitrue
juga. Jika tidak ada cek yang kembalitrue
,.some
fungsi kembalifalse
. Sekali lagi kebalikan dari nilai yang ingin kita kembalikan, sehingga hasil ini dinegasikan dan kemudian dikembalikan.Menguji
Coba semua test case di sini:
sumber
.shift()
a=>!a.some(b=>z.indexOf(z.shift())>b,z=a.concat(a))
a=>!a.some((n,i)=>a.concat(a).indexOf(n,++i)>n+i)
bekerjaJelly , 11 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Jelly , 8 byte
Tertipu oleh jawaban Python @ JonathanAllan's .
Cobalah online!
Bagaimana itu bekerja
sumber
SWI-Prolog, 83 byte
Daftar harus dimasukkan dua kali:
Jika ini dianggap tidak dapat diterima, Anda dapat menambahkan predikat
yang menambahkan 14 byte tambahan.
Cobalah online
nb: Anda dapat menguji berbagai kasus palsu sekaligus dengan memisahkan pertanyaan Anda dengan ';' (atau) dan uji untuk berbagai kasus nyata yang berbeda dengan memisahkan dengan ',' (dan)
yaitu, menggunakan contoh OP:
dan
sumber
PHP, 52 byte
mengambil urutan dari argumen baris perintah; keluar dengan kode
1
untuk kepalsuan,0
untuk kebenaran.Jalankan dengan
-nr
.$n
melalui argumen:maka jangan lakukan apa-apa, keluar dengan kode
1
$$n
( variabel variabel )0
(implisit)sumber
Retina , 50 byte
Input sebagai daftar nomor unary yang terpisah koma.
Cobalah online!
Penjelasan
Gandakan input sehingga kami dapat memeriksa langkah-langkah yang membungkus bagian akhir.
Cocokkan dan kembalikan setiap bagian (terpendek) antara dua nilai yang identik, misalnya
11,111,1,11
.Hapus angka berulang-ulang dari angka pertama, bersama dengan seluruh nomor setelahnya. Jika celahnya cukup kecil, ini akan sepenuhnya menghapus angka pertama. Kalau tidak, setidaknya satu digit akan tetap.
Hitung seberapa sering
1,
muncul di semua baris. Jika muncul di mana saja, salah satu langkahnya terlalu lebar.Cobalah untuk mencocokkan angka yang dimulai dengan
0
(yaitu hanya0
dirinya sendiri). Ini secara efektif negasi logis dari output.sumber
JavaScript (ES6), 47 byte
Bagaimana itu bekerja
Kami menggunakan kembali larik input
a
untuk menyimpan posisi kemunculan terakhir setiap bilangan bulat dia
. Kami menggunakan kunci-n
untuk menyimpan posisi ini sehingga tidak mengganggu indeks aslia
.Ketika
a[-n]
ada, tes yang sebenarnya terjadi. Ketikaa[-n]
tidak ada, ekspresia[-n] - (a[-n] = i)
samaundefined - i == NaN
dan perbandingan dengan~n
selalu palsu, yang merupakan hasil yang diharapkan.Uji kasus
Tampilkan cuplikan kode
sumber
Retina ,
4139 byte2 byte golf berkat Martin Ender, yang omong-omong memperkenalkan saya pada menyeimbangkan kelompok dengan panduannya yang fantastis di SO
Input adalah daftar nomor unary yang dipisahkan koma. Output
0
untuk false dan1
true.Cobalah online! (Test suite yang secara otomatis mengkonversi dari desimal)
Saya baru-baru ini belajar tentang menyeimbangkan kelompok, jadi saya ingin mencoba mereka. Mereka bukan salah satu alat termudah untuk digunakan, tetapi yakin mereka kuat.
Penjelasan
Seperti banyak kiriman lainnya lakukan, kami menduplikasi daftar untuk menangani pembungkus. Kami juga menambahkan koma di bagian akhir, jadi setiap angka diikuti oleh koma (ini membuat segalanya lebih mudah nanti)
Di sinilah hal-hal menjadi menarik. Ini adalah tahap penggantian, kami mengganti semua yang cocok dengan baris pertama dengan baris kedua, dalam hal ini kami ingin menghapus semua angka yang
n
tidak diikuti olehn+1
angka berbeda lainnya.Untuk melakukannya, pertama-tama kita mencocokkan angka, menangkap masing-masing
1
dalam suatu kelompok (menangkap kelompok nomor 2 dalam kasus ini). Kemudian dengan lookahead positif, untuk memiliki penegasan nol-lebar, kami berulang kali mencoba untuk mencocokkan dalam kelompok penyeimbang-2
, yang akan berhasil tidak lebih dari jumlah tangkapan yang dibuat oleh kelompok2
, angka yang diikuti oleh koma. Setelah urutan angka-angka ini, kami puas jika kami mencapai angka pertama lagi atau akhir baris.Catatan: ungkapan ini hanya bisa cocok dengan bagian terakhir dari angka, jika tidak berhasil menemukan kecocokan dengan angka lengkap. Ini bukan masalah, karena dengan demikian bagian pertama dari angka akan tetap berada di string dan kita akan tahu bahwa penggantian tidak sepenuhnya berhasil.
Akhirnya, hasilnya harus benar jika kita benar-benar menghapus semua angka dari daftar. Kami mencoba mencocokkan string kosong dan mengembalikan jumlah kecocokan yang ditemukan.
sumber
\b
. Menghapusnya akan menyebabkan kecocokan nyasar tetapi mereka akan gagal untuk menghapus seluruh nomor, sehingga Anda tidak akan berakhir dengan string kosong.Jelly , 11 byte
Cobalah online!
sumber
Python 3 , 101 byte
Cobalah online!
sumber
Röda , 50 byte
Cobalah online!
Akhirnya! Saya telah menunggu untuk tantangan ini ...
Ini adalah fungsi yang mengembalikan nilai yang benar atau salah. Dibutuhkan satu argumen, array.
Ini beralih pada aliran indeks dan memeriksa untuk setiap indeks
_1
bahwa jarak indeks saat ini dan indeks berikutnyaa[_1]
tidak lebih daria[_1]
.sumber
_1
kerjanya?_
, tetapi mengacu pada nilai yang ditarik pertama. Jika saya menggunakan banyak_
s, masing-masing akan menarik nilai yang terpisah. Misalnya,[1, 2, 3] | print(_, _, _)
mencetak123
, tetapi[1,2,3] | print(_, _1, _1)
mencetak111 222 333
(pada garis yang terpisah).05AB1E , 13 byte
Cobalah online! atau sebagai Test suite
Penjelasan
sumber