0-1 Contador de fase máxima

21

Considere una variedad de bits, digamos

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

Llamamos a un subconjunto contiguo de longitud ≥ 5 una fase si al menos el 85% de los bits son iguales y los primeros / últimos bits son iguales al bit mayoritario. Además, llamamos a una fase máxima si no es un subconjunto estricto de alguna otra fase.

Estas son las fases máximas del ejemplo anterior:

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

Como puede ver, hay 3fases máximas. Por otro lado, esto

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

no es una fase máxima, ya que es un subconjunto estricto de al menos otra fase.

El reto

La entrada es una secuencia de ≥ 5 bits a través de STDIN, línea de comando o argumento de función. Los bits pueden venir como una cadena o una matriz.

Debe generar un número entero único, el número de fases máximas para la matriz, ya sea impreso a través de STDOUT o devuelto desde una función.

Tanteo

Este es el código de golf, por lo que gana el programa en la menor cantidad de bytes.

Casos de prueba

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

Aquí está la explicación para el último caso:

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

Dato curioso: este desafío surgió de un problema de minería de datos con el objetivo de detectar cambios en los datos temporales.

Sp3000
fuente
Pregunta sobre cuándo es un subconjunto contiguo. longitud ≥ 5 una fase si al menos el 85% de los bits son iguales Digamos que tenemos una longitud 5 como el 1 1 0 1 185% de 5 es 4.25, que es ¿Entonces la longitud 5 sería imposible o deberíamos redondearlo a 4?
Teun Pronk
@TeunPronk Significa que la longitud 5 es imposible a menos que todos los bits sean iguales
Sp3000
Estaba a punto de editar mi comentario para agregarlo, así que no es necesario redondearlo :)
Teun Pronk
Entonces, ¿estás destinado a encontrar la mayor cantidad posible de subarreglos o encontrar matrices tan grandes como sea posible? porque encuentro más de 1 en el caso de prueba 5 (no por código sino mirando)
Teun Pronk
@TeunPronk debes encontrar tantos como sea posible que no estén completamente contenidos en los más grandes. Solo hay una matriz de este tipo para el quinto caso de prueba, que comienza en el primero 0y termina en el último.
Martin Ender

Respuestas:

8

Python 2, 149 bytes

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

El primer bucle explora la matriz de izquierda a derecha. Cada bit, indexado por i, se verifica para ver si podría ser el primer bit en una fase máxima.

Esto se realiza mediante el bucle interno, que escanea de derecha a izquierda. Si la submatriz entre iy jes una fase, aumentamos el contador y seguimos adelante. De lo contrario, continuaremos hasta que el subconjunto se vuelva demasiado pequeño o j llegue al final de la fase máxima anterior.

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

Ejemplo:

$ 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
fuente
5

Pitón 2, 144

Ingrese la entrada en el formulario [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)

Las secuencias se verifican con el orden aumentando el elemento inicial y luego disminuyendo la longitud. De esta manera, se sabe que una nueva subsecuencia no es una subsecuencia de una subsecuencia previa si el índice de su último elemento es mayor que cualquier índice del último elemento de una secuencia encontrada previamente.

Feersum
fuente
4

Dyalog APL, 86 bytes *

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

Pruébalo aquí Uso:

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

Esto probablemente se puede jugar bastante, especialmente en la parte media, donde se verifica el estado de la fase.

Explicación

Primero recopilo las subcadenas del vector de entrada en una matriz, donde la esquina superior izquierda contiene toda la entrada, usando ⌽∘.{(⍺-1)↓⍵↑t}⍨⍳⍴t←⍵. Para la entrada 0 0 0 0 0 1 0, esta matriz es

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

Luego mapeo la condición de ser una fase sobre ella, lo que resulta en la matriz 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

Para obtener el número de fases máximas, inundo las 1's a la derecha y hacia abajo usando ∨⍀∨\,

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

recoge las filas únicas con ∪↓,

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

y cuente aquellos que contienen al menos uno 1usando +/∨/¨.

* Existe una codificación estándar de 1 byte para APL.

Zgarb
fuente
Bueno, es difícil explicar lo que estoy preguntando. Si tuviera una mejor explicación del código, entonces podría reformularlo. Eliminaré mi comentario por ahora.
Optimizador
@Optimizer amplié la explicación.
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)))))

y la versión ungolfed

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

invocable como esto: (s [0 1 0 1 0] 10 0). Requiere algunos argumentos adicionales, pero podría deshacerme de aquellos con 20 caracteres adicionales.

resueman
fuente
0

JavaScript (ES6) 141

El algoritmo de @ grc portado a JavaScript
Input puede ser una cadena o una matriz

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

Prueba en la consola FireFox / FireBug

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

Salida

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

CJAM, 110 103 bytes

Bastante largo. Se puede jugar mucho al golf.

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

La entrada es como

[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 salida es el número de fases.

Pruébalo en línea aquí

Optimizador
fuente
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}

Recurre a través de la matriz e inicia la iteración en el último índice de recursión. El argumento puede ser una matriz o una cadena.

f('011000000000001011111110100000'); //5
cPu1
fuente
1
Algunos trucos 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

Ejemplo

{}⊕{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
silbido
fuente
0

Java: 771 bytes

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

ejecutado llamando al método s (entrada int [])

PoweredByRice
fuente