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 3
des 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.
la source
1 1 0 1 1
85% de 5 soit 4,25 qui est donc la longueur 5 serait impossible ou devrions-nous l'arrondir à 4?0
et se terminant au dernier.Réponses:
Dyalog APL, 62 caractères
{≢∪0~⍨+/∨⍀∨\⌽∘.{((⊃=⊃∘⌽)∧(.85≤(+/⊢=⊃)÷≢)∧5≤≢)(⍺-1)↓⍵↑a}⍨⍳⍴a←⍵}
Similaire à la solution de Zgarb mais a joué un peu plus loin.
la source
Python 2, 149 octets
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
i
etj
est une phase, nous augmentons le compteur et passons. Sinon, nous continuons jusqu'à ce que le sous-tableau devienne trop petit ouj
atteigne la fin de la phase maximale précédente.Exemple:
la source
Python 2, 144
Saisissez une entrée dans le formulaire
[0,1,0,1,0]
.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.
la source
Dyalog APL, 86 octets *
Essayez-le ici. Usage:
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ée0 0 0 0 0 1 0
, cette matrice estEnsuite, je mappe la condition d'être une phase sur elle, résultant en la matrice 0-1
Pour obtenir le nombre de phases maximales, j'inonde les
1
vers la droite et vers le bas en utilisant∨⍀∨\
,collecter les lignes uniques avec
∪↓
,et compter ceux qui contiennent au moins une en
1
utilisant+/∨/¨
.* Il existe un codage standard à 1 octet pour APL.
la source
Clojure, 302
et la version légèrement non golfée
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.la source
JavaScript (ES6) 141
L'algorithme de @ grc porté sur l'
entrée JavaScript peut être une chaîne ou un tableau
Test dans la console FireFox / FireBug
Production
la source
CJAM,
110103 bytesJoliment longue. Peut être joué beaucoup au golf.
L'entrée est comme
La sortie est le nombre de phases.
Essayez-le en ligne ici
la source
JavaScript (ECMAScript 6),
148139 octetsRé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.
la source
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
Exemple
la source
Java: 771 octets
exécuté en appelant la méthode s (entrée int [])
la source