0-1 Maksimum Faz Sayacı


21

Bir bit dizisi düşünün

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

Bitlerin en az% 85'i aynıysa ve ilk / son bitlerin her ikisi de çoğunluk bitine eşitse, ≥5 faz uzunluğuna bitişik bir alt dizi diyoruz . Ayrıca, eğer başka bir fazın katı bir alt dizisi değilse, bir faz maksimal olarak adlandırırız .

İşte yukarıdaki örneğin maksimum aşamaları:

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

Gördüğünüz gibi, 3maksimum aşama var. Öte yandan, bu

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

en az bir başka fazın katı bir alt dizisi olduğu için maksimum faz değildir.

Meydan okuma

Giriş, STDIN, komut satırı veya işlev argümanı ile ≥ 5 bitlik bir dizilimdir. Bitler bir dizge ya da dizi olarak gelebilir.

STDOUT aracılığıyla basılan veya bir fonksiyondan döndürülen tek bir tamsayı, dizi için maksimum faz sayısını gösterirsiniz.

puanlama

Bu kod-golf olduğundan, en az bayttaki program kazanır.

Test durumları

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

İşte son durumun açıklaması:

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

Eğlenceli gerçek: Bu zorluk, zamansal verilerdeki değişimi saptamak amacıyla bir veri madenciliği probleminden kaynaklandı.


Bitişik bir alt dizi ne zaman hakkında soru. uzunluk ≥ 5 bir faz bitlerin en az% 85'i aynıysa Lets 5 uzunluğunun 5 olduğu gibi 5'in 1 1 0 1 1% 85'i olduğunu söyleyebiliriz ki bu 5'tir.
Teun Pronk

@TeunPronk Tüm bitler aynı olmadıkça 5 uzunluğunun imkansız olduğu anlamına gelir
Sp3000,

Bunu eklemek için yorumumu düzenlemek üzereydim, bu yüzden aşağı yuvarlamak yok :)
Teun Pronk

Yani mümkün olduğunca çok sayıda alt dizi bulmak veya mümkün olduğunca büyük dizileri bulmak içindir? çünkü testcase 5'te 1'den fazla buluyorum (kodlara göre değil ama bakarken)
Teun Pronk

@TeunPronk, tamamen daha büyük olanlarda bulunmayan, mümkün olduğunca çok sayıda bulabilirsiniz. 5. sınama durumu için ilk 0baştan ve sondan son bulan tek bir dizi var .
Martin Ender,

Yanıtlar:



8

Python 2, 149 bayt

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

İlk döngü dizi boyunca soldan sağa tarar. İndekslenen her bit, imaksimum fazda ilk bit olup olmadığını görmek için kontrol edilir.

Bu, sağdan sola tarayan iç döngü tarafından yapılır. Alt dizi arasındaki ive jbir faz ise, sayacı artırır ve devam ederiz. Aksi takdirde, alt dizi çok küçük olana veya bir j önceki maksimum fazın sonuna ulaşana kadar devam ediyoruz .

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

Örnek:

$ python phase.py
[1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0]
3

5

Python 2, 144

Formdaki girişi girin [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)

Alt sıralar, ilk elemanı artırarak, ardından uzunluğu azaltarak sırayla kontrol edilir. Bu şekilde, yeni bir sıranın, önceki elemanının bir dizini olmadığı, son elemanının indeksi, daha önce bulunan bir sıranın son elemanının herhangi bir indeksinden daha büyük olduğu bilinmektedir.


4

Dyalog APL, 86 bayt *

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

Burada dene. Kullanımı:

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

Bu, muhtemelen faz durumunun kontrol edildiği orta kısım olmak üzere biraz golf oynayabilir.

açıklama

Öncelikle giriş vektörünün alt dizgilerini bir matris halinde toplarım, burada sol üst köşeyi kullanarak bütün girişi içerir ⌽∘.{(⍺-1)↓⍵↑t}⍨⍳⍴t←⍵. Giriş için 0 0 0 0 0 1 0bu matris

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

Sonra bunun üzerinde bir faz olma şartının haritasını çıkarıp, 0-1 matrisi ile sonuçlanır.

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

Maksimum faz sayısını elde etmek için, 1'yi sağa ve aşağıya doğru bastırdım ∨⍀∨\.

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

benzersiz satırları toplamak ∪↓,

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

ve 1kullanarak en az bir tane içerenleri sayın +/∨/¨.

* APL için standart bir 1 bayt kodlaması vardır.


Ne sorduğumu açıklamak zor. Eğer kodun daha iyi bir açıklaması olsaydı, tekrar ifade edebilirdim. Yorumumu şimdilik sileceğim.
Doktor

@Optimizer Ben açıklama genişletti.
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)))))

ve biraz ungolfed versiyonu

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

Böyle çağrılabilir: (s [0 1 0 1 0] 10 0). Birkaç ekstra argüman gerektirir, ancak fazladan 20 karaktere sahip olanlardan kurtulabilirim.


0

JavaScript (ES6) 141

@ grc'nin JavaScript
Girişine aktarılan algoritması bir dize veya bir dizi olabilir

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

FireFox / FireBug konsolunda test edin

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

Çıktı

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

0

CJam, 110 103 bayt

Pretttttty uzun. Çok golf oynayabilir.

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

Giriş gibidir

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

Çıkış, faz sayısıdır.

Burada çevrimiçi deneyin


0

JavaScript (ECMAScript 6), 148 139 Bayt

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}

Dizi boyunca tekrarlar ve son özyineleme dizininde yinelemeye başlar. Argüman bir dizi veya dize olabilir.

f('011000000000001011111110100000'); //5

1
Bazı golf hileleri: -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

Örnek

{}⊕{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

0

Java: 771 bayt

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

s yöntemini kullanarak çalıştırın (int [] girişi)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.