Considere uma matriz de bits, digamos
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
Chamamos um sub-arranjo contíguo de comprimento ≥ 5 uma fase se pelo menos 85% dos bits forem iguais e o primeiro / último bits forem iguais ao bit maioritário. Além disso, chamamos uma fase de máximo se não for um sub-arranjo estrito de alguma outra fase.
Aqui estão as fases máximas do exemplo acima:
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
-------------
-------------
-------------
Como você pode ver, existem 3
fases máximas. Por outro lado, isso
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
---------
não é uma fase máxima, pois é um sub-arranjo estrito de pelo menos uma outra fase.
O desafio
Entrada é uma sequência de ≥ 5 bits via STDIN, linha de comando ou argumento de função. Os bits podem aparecer como uma string ou uma matriz.
Você deve gerar um único número inteiro, o número máximo de fases da matriz, impresso via STDOUT ou retornado de uma função.
Pontuação
Isso é código-golfe, então o programa com o menor número de bytes vence.
Casos de teste
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
Aqui está a explicação para o ú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
---------------------------
-------------------------
-----------------
-----------------
-------------
Curiosidade: esse desafio surgiu de um problema de mineração de dados com o objetivo de detectar alterações nos dados temporais.
fonte
1 1 0 1 1
85% de 5 é 4,25, o que é Então o comprimento 5 seria impossível ou devemos arredondar para 4?0
e terminando no último.Respostas:
Dyalog APL, 62 caracteres
{≢∪0~⍨+/∨⍀∨\⌽∘.{((⊃=⊃∘⌽)∧(.85≤(+/⊢=⊃)÷≢)∧5≤≢)(⍺-1)↓⍵↑a}⍨⍳⍴a←⍵}
Semelhante à solução de Zgarb, mas jogou um pouco mais.
fonte
Python 2, 149 bytes
O primeiro loop varre a matriz da esquerda para a direita. Cada bit, indexado por
i
, é verificado para ver se poderia ser o primeiro bit em uma fase máxima.Isso é feito pelo loop interno, que digitaliza da direita para a esquerda. Se a sub-matriz entre
i
ej
é uma fase, aumentamos o contador e seguimos em frente. Caso contrário, continuamos até o subarray ficar muito pequeno ouj
chegar ao final da fase máxima anterior.Exemplo:
fonte
Python 2, 144
Digite a entrada no formulário
[0,1,0,1,0]
.As subseqüências são verificadas com a ordem aumentando o elemento inicial e depois diminuindo o comprimento. Dessa maneira, sabe-se que uma nova subsequência não é uma subsequência de uma subsequência anterior se o índice do seu último elemento for maior que qualquer índice do último elemento da sequência encontrada anteriormente.
fonte
Dyalog APL, 86 bytes *
Experimente aqui. Uso:
Provavelmente isso pode ser bastante praticado, especialmente a parte do meio, onde a condição da fase é verificada.
Explicação
Primeiro coleciono as substrings do vetor de entrada em uma matriz, onde o canto superior esquerdo contém toda a entrada, usando
⌽∘.{(⍺-1)↓⍵↑t}⍨⍳⍴t←⍵
. Para a entrada0 0 0 0 0 1 0
, essa matriz éEntão mapeio a condição de ser uma fase sobre ela, resultando na matriz 0-1
Para obter o número de fases máximas, inunço as
1
letras para a direita e para baixo usando∨⍀∨\
,colete as linhas exclusivas com
∪↓
,e conte os que contêm pelo menos um
1
usando+/∨/¨
.* Existe uma codificação padrão de 1 byte para APL.
fonte
Clojure, 302
e a versão levemente não-gasta
que pode ser chamado assim:
(s [0 1 0 1 0] 10 0)
. Requer alguns argumentos extras, mas eu poderia me livrar daqueles com mais 20 caracteres.fonte
JavaScript (ES6) 141
O algoritmo do @ grc portado para JavaScript
Input pode ser uma string ou uma matriz
Teste no console do FireFox / FireBug
Saída
fonte
CJam,
110103 bytesMuito tempo. Pode ser jogado muito.
Entrada é como
Saída é o número de fases.
Experimente online aqui
fonte
JavaScript (ECMAScript 6),
148139 bytesRecursa pela matriz e inicia a iteração no último índice de recursão. O argumento pode ser uma matriz ou sequência.
fonte
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
Exemplo
fonte
Java: 771 bytes
executado chamando o método s (int [] input)
fonte