Ikhtisar
Beberapa dari Anda mungkin mengetahui tentang Urutan Kolakoski ( A000002 ), urutan referensial yang diketahui dengan baik yang memiliki properti berikut:
Ini adalah urutan yang hanya berisi 1 dan 2, dan untuk setiap grup 1 dan dua, jika Anda menjumlahkan panjang run, itu sama dengan dirinya sendiri, hanya setengah panjangnya. Dengan kata lain, barisan Kolakoski menggambarkan panjang run dalam barisan itu sendiri. Ini adalah satu-satunya urutan yang melakukan ini kecuali untuk urutan yang sama dengan 1 awal dihapus. (Ini hanya benar jika Anda membatasi diri pada urutan yang terdiri dari 1s dan 2s - Martin Ender)
Tantangan
Tantangannya adalah, diberi daftar bilangan bulat:
- Keluarkan
-1
jika daftar BUKAN awalan bekerja dari urutan Kolakoski. - Keluarkan jumlah iterasi sebelum urutan menjadi
[2]
.
Contoh Berolahraga
Menggunakan gambar yang disediakan sebagai contoh:
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] # Iteration 0 (the input).
[1,2,2,1,1,2,1,2,2,1,2] # Iteration 1.
[1,2,2,1,1,2,1,1] # Iteration 2.
[1,2,2,1,2] # Iteration 3.
[1,2,1,1] # Iteration 4.
[1,1,2] # Iteration 5.
[2,1] # Iteration 6.
[1,1] # Iteration 7.
[2] # Iteration 8.
Oleh karena itu, angka yang dihasilkan adalah 8
untuk input [1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1]
.
9
juga baik jika Anda melakukan pengindeksan 1.
The Test Suite (Anda juga dapat menguji dengan sub-iterasi)
------------------------------------------+---------
Truthy Scenarios | Output
------------------------------------------+---------
[1,1] | 1 or 2
[1,2,2,1,1,2,1,2,2,1] | 6 or 7
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] | 8 or 9
[1,2] | 2 or 3
------------------------------------------+---------
Falsy Scenarios | Output
------------------------------------------+---------
[4,2,-2,1,0,3928,102904] | -1 or a unique falsy output.
[1,1,1] | -1
[2,2,1,1,2,1,2] (Results in [2,3] @ i3) | -1 (Trickiest example)
[] | -1
[1] | -1
Jika Anda bingung:
Kebenaran: Pada akhirnya akan mencapai dua tanpa langkah perantara memiliki elemen selain 1
dan 2
. -Einkorn Enchanter 20 hours ago
Falsy: Nilai akhir bukan [2]
. Istilah menengah mengandung sesuatu selain dari sesuatu yang diatur [1,2]
. Beberapa hal lain, lihat contoh.
Ini adalah kode-golf , byte-count terendah akan menjadi pemenangnya.
-1
?[2]
sampai saya melihat[2,2,1,1,2,1,2]
test case.1
dan2
.[1]
sebagai ujian.Jawaban:
Haskell ,
12687797675 byte39 byte disimpan berkat Ørjan Johansen
Cobalah online!
Ini kesalahan pada input yang buruk.
sumber
f
(dan akibatnya!
) dapat dipersingkat banyak dengan menggunakan produksi malas +span
/length
bukannya akumulator. Cobalah online![1]
import Data.List;f l=length<$>group l
. (<$>
adalah sinonim untuk dimap
sini.) Juga, alih-alih memiliki dua-1
kasus berbeda , lebih pendek menggunakan@(_:_:_)
pola untuk memaksa kasus utama hanya mencocokkan panjang> = 2 daftar. Cobalah online!05AB1E , 22 byte
Cobalah online!
Penjelasan
sumber
[1,1,2,2,1,2,1,1,2,2,1,2,2,1,1,2,1,1]
SCALA, 290 (282?) Karakter, 290 (282?) Byte
Butuh sooo loong ... Tapi akhirnya aku selesai!
dengan kode ini:
Saya tidak tahu apakah saya harus menghitung
var u=t
ke dalam byte, mengingat saya tidak menggunakant
selama algoritma (salinan hanya untuk mendapatkan yang dapat dimodifikasi,var
bukan parameter yangt
dianggap sebagaival
- terima kasih ScaLa ). Tolong beritahu saya jika saya harus menghitungnya.Cukup sulit. Cobalah online!
PS: Saya sedang berpikir untuk melakukannya secara rekursif, tetapi saya harus melewati penghitung sebagai parameter dari "subfungsi" rekursif yang sebenarnya; fakta ini membuat saya mendeklarasikan dua fungsi, dan karakter / byte ini tidak lain adalah hilang.
EDIT: Saya harus mengubah (?) Karena kami tidak yakin kami harus mengambil dalam jumlah
[1]
kasus. Jadi di sini adalah kode yang dimodifikasi:Itu tidak dioptimalkan (saya memiliki duplikat "keluar" untuk kondisi yang sama: ketika saya sampai
[2]
dan ketika param[2]
diperlakukan secara terpisah).BIAYA BARU = 342 (saya tidak sengaja memodifikasi judul)
sumber
[1]
[2]
"[1]
tidak pernah mencapai[2]
dan dengan demikian mengembalikan -1 .JavaScript,
146142 byteCoba pertama kali dalam kode golf, tampaknya "kembali" dalam fungsi yang lebih besar cukup membosankan ...
Juga, pemeriksaan b = 1 dan b = 2 memakan beberapa byte ...
Ini kodenya:
Penjelasan
Data uji (menggunakan data uji yang diberikan)
Sunting 1: 146 -> 142: Mencabut edit saya pada pengurangan byte, karena ini mempengaruhi output; dan beberapa edit pada pernyataan terakhir
sumber
f=a=>{for(i=t=!a[0];a[1];)r=[],c=j=0,a.map(a=>{t|=a-1&&a-2;a-c&&(0<j&&r.push(j),c=a,j=0);j++}),(a=r).push(j),i++;return t||a[0]-2?-1:0^i}
menghemat 5 byte (untuk loop bukan while; koma vs kurung; && vs jika). Anda dapat menggunakan kompilator penutupan Google ( closure-compiler.appspot.com ) untuk menyelesaikan optimasi ini untuk AndaJelly ,
2625222120 byteCobalah online!
Kode ini sebenarnya tidak berfungsi dengan benar sampai 20 byte dan saya bahkan tidak menyadarinya; itu gagal pada
[2,2]
test case. Seharusnya bekerja dengan sempurna sekarang.sumber
JavaScript (ES6),
1271269580 byteDiindeks 0. Melempar
"ReferenceError: X is not defined"
dan"InternalError: too much recursion"
input buruk.Uji kasus
Tampilkan cuplikan kode
sumber
Clojure, 110 byte
Dasar
loop
dengan pra-periksa pada kasus tepi. Pengembaliannil
untuk input yang tidak valid. Saya tidak tahu(= [2] '(2))
adalahtrue
: osumber
Python 2, 146 byte (hanya fungsi)
Mengembalikan 0 pada input palsu (ok karena ini 1-diindeks). Cukup gunakan seperti ini:
sumber
Mathematica, 82 byte
Function
yang berulang kali mengganti{2}
dengan simbol yang tidak ditentukanT
, daftar (satu atau lebih)1
dan2
s dengan iterasi berikutnya, dan apa pun dengan0
sampai titik tetap tercapai, kemudian mengembalikanFirstPosition
simbolT
dalamFixedPointList
minus yang dihasilkan1
. Keluaran adalah di{n}
manan
jumlah (1
-index) dari iterasi yang diperlukan untuk meraih{2}
kasus kebenaran dan-1+Missing["NotFound"]
untuk kasus palsu.Jika output harus
n
lebih daripada{n}
, biayanya tiga byte lebih:sumber
Python 2 ,
184 163156 bytesPython 2 , 156 byte
Cobalah online!
Penjelasan:
sumber
Jelly , 17 byte
Cobalah online!
sumber
Python 2 , 122 byte
Cobalah online!
Python 3 , 120 byte
Cobalah online!
Penjelasan
Urutan baru (w) diinisialisasi untuk menyimpan iterasi pengurangan berikutnya. Penghitung (c) diinisialisasi untuk melacak jumlah iterasi.
Setiap item dalam urutan asli dibandingkan dengan nilai sebelumnya. Jika mereka sama, nilai item terakhir dari (w) meningkat dengan 1. Jika mereka berbeda, urutan (w) diperpanjang dengan [1].
Jika w == [2], penghitung (c) dikembalikan. Lain, jika urutan asli berisi item lain dari 1 dan 2, nilai -1 dikembalikan. Jika tidak demikian halnya, fungsi ini disebut secara rekursif dengan urutan baru (w) sebagai (s) dan penghitung (c) meningkat sebesar 1.
sumber
def f(s,c=2,j=0,w=[1]):
, tetapi itu memberikan hasil yang berbeda. Adakah yang bisa menjelaskan mengapa itu?R, 122 byte
Lewati semua kasus uji. Melempar satu atau lebih kesalahan sebaliknya. Saya benci cek validitas; kode ini bisa jadi golf jika inputnya bagus; akan lebih pendek bahkan jika inputnya adalah urutan 1 dan 2, belum tentu merupakan awalan dari urutan Kolakoski. Di sini, kita harus memeriksa vektor awal (jika tidak, test case
[-2,1]
) akan lulus) dan vektor yang dihasilkan (jika tidak[1,1,1]
akan lulus).sumber
Ruby ,
8177 byteCobalah online!
Sunting: Disimpan 4 byte dengan mengonversi ke lambda rekursif.
Mengembalikan jumlah iterasi 1-indeks atau 0 sebagai falsey.
Memanfaatkan metode chunk Ruby enumerable, yang melakukan persis apa yang kita butuhkan - pengelompokan bersama berturut-turut dari angka yang sama. Panjang run merupakan array untuk iterasi berikutnya. Terus iterasi saat array lebih panjang dari 1 elemen dan tidak ada angka selain 1 dan 2 yang ditemukan.
sumber
Pyth , 45 byte
Cobalah online!
Ini mungkin masih golf. Ini jelas golf jika
.?
bekerja seperti yang saya harapkan (menjadielse
struktur paling dalam dan bukan yang terluar)sumber
Perl 5
-p
, 71 byteCobalah online!
1
-indeks Keluaran0
untuk falsy.sumber