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 3
fases 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.
fuente
1 1 0 1 1
85% de 5 es 4.25, que es ¿Entonces la longitud 5 sería imposible o deberíamos redondearlo a 4?0
y termina en el último.Respuestas:
Dyalog APL, 62 caracteres
{≢∪0~⍨+/∨⍀∨\⌽∘.{((⊃=⊃∘⌽)∧(.85≤(+/⊢=⊃)÷≢)∧5≤≢)(⍺-1)↓⍵↑a}⍨⍳⍴a←⍵}
Similar a la solución de Zgarb, pero jugó un poco más.
fuente
Python 2, 149 bytes
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
i
yj
es una fase, aumentamos el contador y seguimos adelante. De lo contrario, continuaremos hasta que el subconjunto se vuelva demasiado pequeño oj
llegue al final de la fase máxima anterior.Ejemplo:
fuente
Pitón 2, 144
Ingrese la entrada en el formulario
[0,1,0,1,0]
.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.
fuente
Dyalog APL, 86 bytes *
Pruébalo aquí Uso:
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 entrada0 0 0 0 0 1 0
, esta matriz esLuego mapeo la condición de ser una fase sobre ella, lo que resulta en la matriz 0-1
Para obtener el número de fases máximas, inundo las
1
's a la derecha y hacia abajo usando∨⍀∨\
,recoge las filas únicas con
∪↓
,y cuente aquellos que contienen al menos uno
1
usando+/∨/¨
.* Existe una codificación estándar de 1 byte para APL.
fuente
Clojure, 302
y la versión ungolfed
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.fuente
JavaScript (ES6) 141
El algoritmo de @ grc portado a JavaScript
Input puede ser una cadena o una matriz
Prueba en la consola FireFox / FireBug
Salida
fuente
CJAM,
110103 bytesBastante largo. Se puede jugar mucho al golf.
La entrada es como
La salida es el número de fases.
Pruébalo en línea aquí
fuente
JavaScript (ECMAScript 6),
148139 BytesRecurre 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.
fuente
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
Ejemplo
fuente
Java: 771 bytes
ejecutado llamando al método s (entrada int [])
fuente