0-1 Maksymalny licznik faz

21

Weźmy pod uwagę tablicę bitów, powiedzmy

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

Ciągłą pod-tablicę o długości ≥ 5 nazywamy fazą, jeśli co najmniej 85% bitów jest takich samych, a oba pierwsze / ostatnie bity są równe bitowi większości. Ponadto nazywamy fazę maksymalną, jeśli nie jest to ścisła podtablica innej fazy.

Oto maksymalne fazy powyższego przykładu:

1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
      -------------
                    -------------
                        -------------

Jak widać, są 3maksymalne fazy. Z drugiej strony to

1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
                        ---------

nie jest fazą maksymalną, ponieważ jest ścisłą podtablicą co najmniej jednej innej fazy.

Wyzwanie

Dane wejściowe to sekwencja ≥ 5 bitów przez STDIN, wiersz poleceń lub argument funkcji. Bity mogą przychodzić jako ciąg znaków lub tablica.

Wyprowadzasz jedną liczbę całkowitą, liczbę maksymalnych faz dla tablicy, albo drukowaną przez STDOUT, albo zwracaną z funkcji.

Punktacja

To jest golf golfowy, więc program w najmniejszej liczbie bajtów wygrywa.

Przypadki testowe

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

Oto wyjaśnienie ostatniego przypadku:

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

Ciekawostka: wyzwanie powstało w wyniku eksploracji danych w celu wykrycia zmian w danych czasowych.

Sp3000
źródło
Pytanie o to, kiedy jest to ciągła podtablica. długość ≥ 5 faza, jeśli co najmniej 85% bitów jest takich samych Powiedzmy, że mamy długość 5, np. 1 1 0 1 185% z 5 wynosi 4,25, co oznacza Więc długość 5 byłaby niemożliwa, czy powinniśmy zaokrąglić w dół do 4?
Teun Pronk
@TeunPronk Oznacza to, że długość 5 jest niemożliwa, chyba że wszystkie bity są takie same
Sp3000
Już miałem edytować mój komentarz, aby go dodać, więc nie ma zaokrąglania :)
Teun Pronk
Czy chcesz znaleźć jak najwięcej podpowiedzi, czy też tablice tak duże, jak to możliwe? ponieważ znajduję więcej niż 1 w przypadku 5 (nie kodem, ale patrząc)
Teun Pronk
@TeunPronk masz znaleźć jak najwięcej, które nie są w całości zawarte w większych. Jest tylko jedna taka tablica dla 5. przypadku testowego, zaczynając od pierwszego, 0a kończąc na ostatnim.
Martin Ender

Odpowiedzi:

8

Python 2, 149 bajtów

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

Pierwsza pętla skanuje tablicę od lewej do prawej. Każdy bit indeksowany wedługi , jest sprawdzany, aby sprawdzić, czy może to być pierwszy bit w fazie maksymalnej.

Odbywa się to za pomocą wewnętrznej pętli, która skanuje od prawej do lewej. Jeśli podtablica pomiędzy ii jjest fazą, zwiększamy licznik i przechodzimy dalej. W przeciwnym razie kontynuujemy, dopóki podtablica nie stanie się zbyt mała lub nie j osiągnie końca poprzedniej maksymalnej fazy.

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

Przykład:

$ 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
źródło
5

Python 2, 144

Wprowadź dane wejściowe w formularzu [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)

Kolejności są sprawdzane przy zamawianiu poprzez zwiększenie elementu początkowego, a następnie zmniejszenie długości. W ten sposób wiadomo, że nowy podsekwencja nie jest podsekwencją poprzedniej podsekwencji, jeżeli indeks jej ostatniego elementu jest większy niż jakikolwiek indeks ostatniego znalezionego ciągu sekwencji.

feersum
źródło
4

Dyalog APL, 86 bajtów *

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

Wypróbuj tutaj. Stosowanie:

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

Prawdopodobnie można to nieco pograć w golfa, szczególnie w środkowej części, gdzie sprawdzany jest stan fazowy.

Wyjaśnienie

Najpierw zbieram podciągi wektora wejściowego do macierzy, gdzie lewy górny róg zawiera całe wejście, używając ⌽∘.{(⍺-1)↓⍵↑t}⍨⍳⍴t←⍵. Dla danych wejściowych 0 0 0 0 0 1 0ta macierz to

┌───────────────┬─────────────┬───────────┬─────────┬───────┬─────┬───┬─┐
│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              │             │           │         │       │     │   │ │
└───────────────┴─────────────┴───────────┴─────────┴───────┴─────┴───┴─┘

Następnie odwzorowuję warunek bycia nad nią fazą, uzyskując macierz 0-1

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

Aby uzyskać maksymalną liczbę faz, zalewam 1je w prawo i w dół, używając ∨⍀∨\,

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

zbierz unikalne rzędy za pomocą ∪↓,

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

i policz te, które zawierają co najmniej jedno 1użycie +/∨/¨.

* Istnieje standardowe 1-bajtowe kodowanie APL.

Zgarb
źródło
Trudno wyjaśnić, o co proszę. Jeśli masz lepsze wyjaśnienie kodu, mógłbym sformułować inaczej. Na razie usunę mój komentarz.
Optymalizator
@Optimizer Rozszerzyłem wyjaśnienie.
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)))))

i nieco nie golfowa wersja

(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)))))

wywoływalnym tak: (s [0 1 0 1 0] 10 0). Wymaga to kilku dodatkowych argumentów, ale mogłem się pozbyć tych z dodatkowymi 20 znakami.

ratownik
źródło
0

JavaScript (ES6) 141

Algorytm @ grc przeniesiony do
wejścia JavaScript może być łańcuchem lub tablicą

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

Testuj w konsoli FireFox / FireBug

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

Wydajność

01010 0
00000 1
0000101111 0
000001011111 2
100000000000010 1
0000010000010000010 2
00000100000100000100 1
010100101010001111010011000110 0
111110000011111001000000001101 4
011000000000001011111110100000 5
edc65
źródło
0

CJam, 110 103 bajty

Pretttttty długi. Można dużo grać w golfa.

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

Dane wejściowe są jak

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

Wyjście to liczba faz.

Wypróbuj online tutaj

Optymalizator
źródło
0

JavaScript (ECMAScript 6), 148 139 bajtów

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}

Powtarza się przez tablicę i rozpoczyna iterację od ostatniego indeksu rekurencji. Argument może być tablicą lub łańcuchem.

f('011000000000001011111110100000'); //5
cPu1
źródło
1
Niektóre sztuczki golfowe: -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

Przykład

{}⊕{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
śmigać
źródło
0

Java: 771 bajtów

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();}}

uruchamiany przez wywołanie metody s (int [] input)

PoweredByRice
źródło