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ą 3
maksymalne 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.
źródło
1 1 0 1 1
85% 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?0
a kończąc na ostatnim.Odpowiedzi:
Dyalog APL, 62 znaki
{≢∪0~⍨+/∨⍀∨\⌽∘.{((⊃=⊃∘⌽)∧(.85≤(+/⊢=⊃)÷≢)∧5≤≢)(⍺-1)↓⍵↑a}⍨⍳⍴a←⍵}
Podobne do rozwiązania Zgarba, ale grał nieco dalej.
źródło
Python 2, 149 bajtów
Pierwsza pętla skanuje tablicę od lewej do prawej. Każdy bit indeksowany według
i
, 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
i
ij
jest fazą, zwiększamy licznik i przechodzimy dalej. W przeciwnym razie kontynuujemy, dopóki podtablica nie stanie się zbyt mała lub niej
osiągnie końca poprzedniej maksymalnej fazy.Przykład:
źródło
Python 2, 144
Wprowadź dane wejściowe w formularzu
[0,1,0,1,0]
.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.
źródło
Dyalog APL, 86 bajtów *
Wypróbuj tutaj. Stosowanie:
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ściowych0 0 0 0 0 1 0
ta macierz toNastępnie odwzorowuję warunek bycia nad nią fazą, uzyskując macierz 0-1
Aby uzyskać maksymalną liczbę faz, zalewam
1
je w prawo i w dół, używając∨⍀∨\
,zbierz unikalne rzędy za pomocą
∪↓
,i policz te, które zawierają co najmniej jedno
1
użycie+/∨/¨
.* Istnieje standardowe 1-bajtowe kodowanie APL.
źródło
Clojure, 302
i nieco nie golfowa wersja
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.źródło
JavaScript (ES6) 141
Algorytm @ grc przeniesiony do
wejścia JavaScript może być łańcuchem lub tablicą
Testuj w konsoli FireFox / FireBug
Wydajność
źródło
CJam,
110103 bajtyPretttttty długi. Można dużo grać w golfa.
Dane wejściowe są jak
Wyjście to liczba faz.
Wypróbuj online tutaj
źródło
JavaScript (ECMAScript 6),
148139 bajtówPowtarza się przez tablicę i rozpoczyna iterację od ostatniego indeksu rekurencji. Argument może być tablicą lub łańcuchem.
źródło
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
Przykład
źródło
Java: 771 bajtów
uruchamiany przez wywołanie metody s (int [] input)
źródło