Pertimbangkan array bit, katakanlah
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
Kami menyebut subarray yang berdekatan dengan panjang ≥ 5 fase jika setidaknya 85% dari bit adalah sama dan bit pertama / terakhir sama dengan bit mayoritas. Selain itu, kami memanggil fase maksimal jika itu bukan subarray ketat dari beberapa fase lainnya.
Berikut adalah fase maksimal dari contoh di atas:
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
-------------
-------------
-------------
Seperti yang Anda lihat, ada 3
fase maksimal. Di sisi lain, ini
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
---------
bukan fase maksimal karena merupakan subarray ketat setidaknya satu fase lainnya.
Tantangan
Input adalah urutan ≥ 5 bit melalui STDIN, baris perintah atau argumen fungsi. Bit bisa berupa string atau array.
Anda akan menghasilkan bilangan bulat tunggal, jumlah fase maksimal untuk array, baik dicetak melalui STDOUT atau dikembalikan dari suatu fungsi.
Mencetak gol
Ini adalah kode-golf sehingga program dalam byte paling sedikit menang.
Uji kasus
0 1 0 1 0 -> 0
0 0 0 0 0 -> 1
0 0 0 0 1 0 1 1 1 1 -> 0
0 0 0 0 0 1 0 1 1 1 1 1 -> 2
1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -> 1
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 -> 2
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -> 1
0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 1 0 1 0 0 1 1 0 0 0 1 1 0 -> 0
1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 -> 4
0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 0 0 -> 5
Inilah penjelasan untuk kasus terakhir:
0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 0 0
---------------------------
-------------------------
-----------------
-----------------
-------------
Fakta menyenangkan: Tantangan ini muncul dari masalah penambangan data dengan tujuan mendeteksi perubahan data temporal.
sumber
1 1 0 1 1
85% dari 5 adalah 4,25 yang Jadi panjang 5 tidak mungkin atau haruskah kita membulatkannya menjadi 4?0
dan yang terakhir.Jawaban:
Dyalog APL, 62 karakter
{≢∪0~⍨+/∨⍀∨\⌽∘.{((⊃=⊃∘⌽)∧(.85≤(+/⊢=⊃)÷≢)∧5≤≢)(⍺-1)↓⍵↑a}⍨⍳⍴a←⍵}
Mirip dengan solusi Zgarb tetapi bermain golf sedikit lebih jauh.
sumber
Python 2, 149 byte
Loop pertama memindai array dari kiri ke kanan. Setiap bit, diindeks oleh
i
, diperiksa untuk melihat apakah itu bisa menjadi bit pertama dalam fase maksimal.Ini dilakukan oleh loop dalam, yang memindai dari kanan ke kiri. Jika subarray antara
i
danj
merupakan fase, kami meningkatkan penghitung dan melanjutkan. Kalau tidak, kita terus berjalan sampai subarray menjadi terlalu kecil atauj
mencapai akhir fase maksimal sebelumnya.Contoh:
sumber
Python 2, 144
Masukkan input dalam formulir
[0,1,0,1,0]
.Selanjutnya diperiksa dengan pemesanan dengan meningkatkan elemen awal, kemudian mengurangi panjang. Dengan cara ini, diketahui bahwa urutan baru bukanlah urutan dari urutan sebelumnya sebelumnya jika indeks elemen terakhirnya lebih besar daripada indeks dari elemen terakhir urutan yang sebelumnya ditemukan.
sumber
Dyalog APL, 86 byte *
Coba di sini. Pemakaian:
Ini mungkin bisa golf sedikit, terutama bagian tengah, di mana kondisi fase diperiksa.
Penjelasan
Saya pertama-tama mengumpulkan substring dari vektor input ke dalam matriks, di mana sudut kiri atas berisi seluruh input, menggunakan
⌽∘.{(⍺-1)↓⍵↑t}⍨⍳⍴t←⍵
. Untuk input0 0 0 0 0 1 0
, matriks ini adalahLalu saya memetakan kondisi menjadi fase di atasnya, menghasilkan 0-1-matriks
Untuk mendapatkan jumlah fase maksimal, saya membanjiri tanda
1
ke kanan dan ke bawah menggunakan∨⍀∨\
,kumpulkan baris unik dengan
∪↓
,dan hitung yang mengandung setidaknya satu
1
menggunakan+/∨/¨
.* Ada pengkodean 1 byte standar untuk APL.
sumber
Clojure, 302
dan versi yang sedikit tidak diubah
Callable seperti ini:
(s [0 1 0 1 0] 10 0)
. Ini membutuhkan beberapa argumen tambahan, tetapi saya dapat menyingkirkannya dengan 20 karakter tambahan.sumber
JavaScript (ES6) 141
Algoritma @ grc yang di-porting ke
Input JavaScript dapat berupa string atau array
Uji di konsol FireFox / FireBug
Keluaran
sumber
CJam,
110103 byteCukup lama. Dapat banyak bermain golf.
Inputnya seperti
Output adalah jumlah fase.
Cobalah online di sini
sumber
JavaScript (ECMAScript 6),
148139 BytesBerulang melalui array dan memulai iterasi pada indeks rekursi terakhir. Argumen dapat berupa array atau string.
sumber
f=(s,l=0,e=0,p=0)=>{for(n=s.length,o=[j=0,y=0],i=l;i<n;++j>4&x==s[l]&i>e&c>=.85*j&&(e=i,y=1))c=++o[x=s[i++]];return l-n?f(s,l+1,e,p+y):p}
Wolfram - 131
Contoh
sumber
Java: 771 byte
jalankan dengan memanggil metode s (int [] input)
sumber