0-1 Penghitung Fase Maksimal

21

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 3fase 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.

Sp3000
sumber
Pertanyaan tentang kapan subarray yang berdekatan. panjang ≥ 5 fase jika setidaknya 85% dari bit adalah sama. Katakanlah kita memiliki panjang 5 seperti 1 1 0 1 185% dari 5 adalah 4,25 yang Jadi panjang 5 tidak mungkin atau haruskah kita membulatkannya menjadi 4?
Teun Pronk
@TeunPronk Berarti panjang 5 tidak mungkin kecuali semua bit sama
Sp3000
Saya akan mengedit komentar saya untuk menambahkan itu, jadi tidak ada pembulatannya :)
Teun Pronk
Jadi, apakah Anda dimaksudkan untuk menemukan sebanyak mungkin subarrays atau menemukan array sebesar mungkin? karena saya menemukan lebih dari 1 di testcase 5 (bukan dengan kode tetapi dengan melihat)
Teun Pronk
@ TeunPronk Anda harus menemukan sebanyak mungkin yang tidak sepenuhnya terkandung dalam yang lebih besar. Hanya ada satu array untuk test case ke-5, mulai dari yang pertama 0dan yang terakhir.
Martin Ender

Jawaban:

8

Python 2, 149 byte

a=input()
l=len(a)
n=p=0
for i in range(l):
 for j in range(l-1,i+3,-1):
  if(j>p)>(.15<sum(a[i:j+1])/(j+1.-i)+a[i]+a[j]<2.85):n+=1;p=j;break
print n

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 idan jmerupakan fase, kami meningkatkan penghitung dan melanjutkan. Kalau tidak, kita terus berjalan sampai subarray menjadi terlalu kecil atau j mencapai akhir fase maksimal sebelumnya.

1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
i ->                               <- j

Contoh:

$ python phase.py
[1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0]
3
grc
sumber
5

Python 2, 144

Masukkan input dalam formulir [0,1,0,1,0].

a=input()
o=[2];i=-1
while a[i:]:
 j=len(a);i+=1
 while j>i+4:o+=sum(j>max(o)>x==a[i]==a[j-1]for x in a[i:j])*20/(j-i)/17*[j];j-=1
print~-len(o)

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.

feersum
sumber
4

Dyalog APL, 86 byte *

{+/∨/¨∪↓∨⍀∨\{⊃({(.5>|k-⍵)∧.35≤|.5-⍵}(+/÷⍴)⍵)∧(5≤⍴⍵)∧(⊃⌽⍵)=k←⊃⍵}¨⌽∘.{(⍺-1)↓⍵↑t}⍨⍳⍴t←⍵}

Coba di sini. Pemakaian:

   f ← {+/∨/¨∪↓∨⍀∨\{⊃({(.5>|k-⍵)∧.35≤|.5-⍵}(+/÷⍴)⍵)∧(5≤⍴⍵)∧(⊃⌽⍵)=k←⊃⍵}¨⌽∘.{(⍺-1)↓⍵↑t}⍨⍳⍴t←⍵}
   f 0 0 0 0 0 1 0 1 1 1 1 1
2

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 input 0 0 0 0 0 1 0, matriks ini adalah

┌───────────────┬─────────────┬───────────┬─────────┬───────┬─────┬───┬─┐
│1 0 0 0 0 0 1 0│1 0 0 0 0 0 1│1 0 0 0 0 0│1 0 0 0 0│1 0 0 0│1 0 0│1 0│1│
├───────────────┼─────────────┼───────────┼─────────┼───────┼─────┼───┼─┤
│0 0 0 0 0 1 0  │0 0 0 0 0 1  │0 0 0 0 0  │0 0 0 0  │0 0 0  │0 0  │0  │ │
├───────────────┼─────────────┼───────────┼─────────┼───────┼─────┼───┼─┤
│0 0 0 0 1 0    │0 0 0 0 1    │0 0 0 0    │0 0 0    │0 0    │0    │   │ │
├───────────────┼─────────────┼───────────┼─────────┼───────┼─────┼───┼─┤
│0 0 0 1 0      │0 0 0 1      │0 0 0      │0 0      │0      │     │   │ │
├───────────────┼─────────────┼───────────┼─────────┼───────┼─────┼───┼─┤
│0 0 1 0        │0 0 1        │0 0        │0        │       │     │   │ │
├───────────────┼─────────────┼───────────┼─────────┼───────┼─────┼───┼─┤
│0 1 0          │0 1          │0          │         │       │     │   │ │
├───────────────┼─────────────┼───────────┼─────────┼───────┼─────┼───┼─┤
│1 0            │1            │           │         │       │     │   │ │
├───────────────┼─────────────┼───────────┼─────────┼───────┼─────┼───┼─┤
│0              │             │           │         │       │     │   │ │
└───────────────┴─────────────┴───────────┴─────────┴───────┴─────┴───┴─┘

Lalu saya memetakan kondisi menjadi fase di atasnya, menghasilkan 0-1-matriks

0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

Untuk mendapatkan jumlah fase maksimal, saya membanjiri tanda 1ke kanan dan ke bawah menggunakan ∨⍀∨\,

0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

kumpulkan baris unik dengan ∪↓,

┌───────────────┬───────────────┐
│0 0 0 0 0 0 0 0│1 1 1 1 1 1 1 1│
└───────────────┴───────────────┘

dan hitung yang mengandung setidaknya satu 1menggunakan +/∨/¨.

* Ada pengkodean 1 byte standar untuk APL.

Zgarb
sumber
Sulit menjelaskan apa yang saya tanyakan. Jika Anda memiliki penjelasan yang lebih baik tentang kode tersebut, maka saya dapat menyusun ulang. Saya akan menghapus komentar saya untuk saat ini.
Pengoptimal
@ Opptizer Saya memperluas penjelasannya.
Zgarb
1

Clojure, 302

(defn p[v l](if(or(<(count v)5)(= 0 l))nil(if((fn[v](let[f(first v)c(apply + v)o(count v)r(/ c o)t(+ f f r)](and(= f(last v))(or(> t 2.85)(< t 0.15)))))v)0(let[r(p(vec(drop-last v))(dec l))](if r(+ r 1)r)))))(defn s[v l c](if(empty? v)c(let[n(p v l)](if n(s(vec(rest v))n(inc c))(s(vec(rest v))l c)))))

dan versi yang sedikit tidak diubah

(defn is-phase [vector]
  (let [f (first vector)
        c (apply + vector)
        o (count vector)
        r (/ c o)
        t (+ f f r)]
    (and (= f (last vector))
         (or (> t 2.85) (< t 0.15)))))
(defn phase-index [vector last]
  (if (or (<(count vector)5)(= 0 last)) nil
    (if (is-phase vector) 0
      (let [r (phase-index (vec(drop-last vector)) (dec last))]
        (if r (+ r 1) r)))))
(defn phase-count [vector last count]
  (if (empty? vector) count
    (let [n (phase-index vector last)]
         (if n (phase-count (vec(rest vector)) n (inc count))
             (phase-count (vec(rest vector)) last count)))))

Callable seperti ini: (s [0 1 0 1 0] 10 0). Ini membutuhkan beberapa argumen tambahan, tetapi saya dapat menyingkirkannya dengan 20 karakter tambahan.

resueman
sumber
0

JavaScript (ES6) 141

Algoritma @ grc yang di-porting ke
Input JavaScript dapat berupa string atau array

F=b=>
  (l=>{
    for(c=e=i=0;i<l;++i)
      for(j=l;j>i+4&j>e;--j)
        (k=0,[for(d of b.slice(i,j))k+=d==b[i]],k<(j-i)*.85)|b[i]-b[j-1]||(++c,e=j)
  })(b.length)|c

Uji di konsol FireFox / FireBug

;['01010', '00000', '0000101111',
'000001011111', '100000000000010',
'0000010000010000010', '00000100000100000100',
'010100101010001111010011000110',
'111110000011111001000000001101',
'011000000000001011111110100000'].forEach(t => console.log(t,F(t)))

Keluaran

01010 0
00000 1
0000101111 0
000001011111 2
100000000000010 1
0000010000010000010 2
00000100000100000100 1
010100101010001111010011000110 0
111110000011111001000000001101 4
011000000000001011111110100000 5
edc65
sumber
0

CJam, 110 103 byte

Cukup lama. Dapat banyak bermain golf.

q~_,,\f>{_,),5>\f<{:X)\0==X1b_X,.85*<!\.15X,*>!X0=!*\X0=*+&},:,W>U):U+}%{,(},_{{_W=IW=>\1bI1b>!&!},}fI,

Inputnya seperti

[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]

Output adalah jumlah fase.

Cobalah online di sini

Pengoptimal
sumber
0

JavaScript (ECMAScript 6), 148 139 Bytes

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}

Berulang melalui array dan memulai iterasi pada indeks rekursi terakhir. Argumen dapat berupa array atau string.

f('011000000000001011111110100000'); //5
cPu1
sumber
1
Beberapa trik golf: -11. 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}
edc65
0

Wolfram - 131

{x_, X___}⊕{Y__, x_, y___}/;MemberQ[t={x, X, Y, x}, 1-x] && t~Count~x > .85 Length@t := 
  1 + {X, Y, x}⊕{y} 
{_, X___}⊕y_ := {X}⊕y
{}⊕{y_, Y__} := {y}⊕{Y}
_⊕_ := 0

Contoh

{}⊕{1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0}
> 3
{}⊕{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
desir
sumber
0

Java: 771 byte

import java.util.*;public class A{static int[]a;static class b{int c,d,e,f,g,h;b(int i,int j){this.c=i;this.d=j;this.h=j-i+1;this.e=k();this.f=this.h-this.e;this.g=e>f?1:0;}
boolean l(b n){return this.c>=n.c&&this.d<=n.d;}
int k(){int o=0;for(int i=c;i<=d;i++){if(a[i]==1){o++;}}
return o;}
public boolean equals(Object o){b x=(b)o;return x.c==this.c&&x.d==this.d;}
float p(){if(g==0){return(float)f/h;}else{return(float)e/h;}}
boolean q(){float r=p();return a[c]==a[d]&&a[d]==g&&r>=0.85F;}}
static int s(int[]t){a=t;List<b>u=new ArrayList<>();for(int v=0;v<t.length-4;v++){int x=v+4;while(x<t.length){b y=new b(v,x);if(y.q()){u.add(y);}
x++;}}
List<b>a=new ArrayList<>();for(b c:u){for(b d:u){if(!c.equals(d)&&c.l(d)){a.add(c);break;}}}
u.removeAll(a);return u.size();}}

jalankan dengan memanggil metode s (int [] input)

PoweredByRice
sumber