Compteur de phase maximal 0-1


21

Considérons un tableau de bits, disons

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

Nous appelons un sous-tableau contigu de longueur ≥ 5 une phase si au moins 85% des bits sont les mêmes et les premier / dernier bits sont tous les deux égaux au bit majoritaire. De plus, nous appelons une phase maximale si ce n'est pas un sous-tableau strict d'une autre phase.

Voici les phases maximales de l'exemple ci-dessus:

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

Comme vous pouvez le voir, il existe 3des phases maximales. D'un autre côté, ce

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

n'est pas une phase maximale car c'est un sous-tableau strict d'au moins une autre phase.

Le défi

L'entrée est une séquence de ≥ 5 bits via STDIN, ligne de commande ou argument de fonction. Les bits peuvent entrer sous forme de chaîne ou de tableau.

Vous devez sortir un seul entier, le nombre de phases maximales pour le tableau, imprimé via STDOUT ou renvoyé par une fonction.

Notation

Il s'agit de code-golf, le programme gagne donc le moins d'octets.

Cas de test

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

Voici l'explication du dernier cas:

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

Fait amusant: ce défi est né d'un problème d'exploration de données dans le but de détecter les changements dans les données temporelles.


Question sur le moment où c'est un sous-tableau contigu. longueur ≥ 5 une phase si au moins 85% des bits sont les mêmes Supposons que nous ayons une longueur 5 comme 1 1 0 1 185% de 5 soit 4,25 qui est donc la longueur 5 serait impossible ou devrions-nous l'arrondir à 4?
Teun Pronk

@TeunPronk Cela signifie que la longueur 5 est impossible à moins que tous les bits ne soient identiques
Sp3000

J'étais sur le point de modifier mon commentaire pour y ajouter, donc pas d'arrondi c'est :)
Teun Pronk

Alors, êtes-vous censé trouver autant de sous-réseaux que possible ou trouver des tableaux aussi grands que possible? car j'en trouve plus de 1 dans le testcase 5 (pas par code mais en regardant)
Teun Pronk

@TeunPronk vous devez en trouver autant que possible qui ne sont pas entièrement contenus dans les plus grands. Il n'y a qu'un seul tableau de ce type pour le cinquième cas de test, commençant au premier 0et se terminant au dernier.
Martin Ender

Réponses:



8

Python 2, 149 octets

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

La première boucle parcourt le tableau de gauche à droite. Chaque bit, indexé par i, est vérifié pour voir s'il pourrait être le premier bit dans une phase maximale.

Cela se fait par la boucle intérieure, qui balaye de droite à gauche. Si le sous-tableau entre iet jest une phase, nous augmentons le compteur et passons. Sinon, nous continuons jusqu'à ce que le sous-tableau devienne trop petit ou j atteigne la fin de la phase maximale précédente.

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

Exemple:

$ 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

Saisissez une entrée dans le formulaire [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)

Les suites sont vérifiées lors de la commande en augmentant l'élément initial, puis en diminuant la longueur. De cette manière, il est connu qu'une nouvelle sous-séquence n'est pas une sous-séquence d'une sous-séquence précédente si l'indice de son dernier élément est supérieur à tout indice du dernier élément d'une séquence trouvée précédemment.


4

Dyalog APL, 86 octets *

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

Essayez-le ici. Usage:

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

Cela peut probablement être beaucoup joué au golf, en particulier la partie centrale, où l'état de phase est vérifié.

Explication

Je recueille d'abord les sous-chaînes du vecteur d'entrée dans une matrice, où le coin supérieur gauche contient toute l'entrée, en utilisant ⌽∘.{(⍺-1)↓⍵↑t}⍨⍳⍴t←⍵. Pour l'entrée 0 0 0 0 0 1 0, cette matrice est

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

Ensuite, je mappe la condition d'être une phase sur elle, résultant en la matrice 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

Pour obtenir le nombre de phases maximales, j'inonde les 1vers la droite et vers le bas en utilisant ∨⍀∨\,

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

collecter les lignes uniques avec ∪↓,

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

et compter ceux qui contiennent au moins une en 1utilisant +/∨/¨.

* Il existe un codage standard à 1 octet pour APL.


Eh bien, c'est difficile d'expliquer ce que je demande. Si vous aviez une meilleure explication du code, je pourrais reformuler. Je vais supprimer mon commentaire pour l'instant.
Optimizer

@Optimizer J'ai développé l'explication.
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)))))

et la version légèrement non golfée

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

appelable comme ceci: (s [0 1 0 1 0] 10 0). Cela nécessite quelques arguments supplémentaires, mais je pourrais me débarrasser de ceux avec 20 caractères supplémentaires.


0

JavaScript (ES6) 141

L'algorithme de @ grc porté sur l'
entrée JavaScript peut être une chaîne ou un tableau

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

Test dans la console FireFox / FireBug

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

Production

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

0

CJAM, 110 103 bytes

Joliment longue. Peut être joué beaucoup au golf.

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

L'entrée est comme

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

La sortie est le nombre de phases.

Essayez-le en ligne ici


0

JavaScript (ECMAScript 6), 148 139 octets

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}

Récursive à travers le tableau et démarre l'itération au dernier index de récursivité. L'argument peut être un tableau ou une chaîne.

f('011000000000001011111110100000'); //5

1
Quelques tours de 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

Exemple

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

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

exécuté en appelant la méthode s (entrée int [])

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.