Étant donné un entier n > 0
, affiche la longueur de la plus longue séquence contiguë de 0
ou 1
dans sa représentation binaire.
Exemples
6
est écrit110
en binaire; la plus longue séquence est11
, alors nous devrions revenir2
16
→10000
→4
893
→1101111101
→5
1337371
→101000110100000011011
→6
1
→1
→1
9965546
→100110000000111111101010
→7
code-golf
sequence
binary
subsequence
Arnaud
la source
la source
Réponses:
Python 2 ,
4645 octetsEssayez-le en ligne!
Comment ça marche
En XORing n et n / 2 (en divisant par 2, on coupe essentiellement le dernier bit), on obtient un nouvel entier m dont les bits non définis indiquent les bits correspondants correspondants dans n .
Par exemple, si n = 1337371 , nous avons ce qui suit.
Cela réduit la tâche de trouver la plus longue série de zéros. Comme la représentation binaire d'un entier positif commence toujours par un 1 , nous allons essayer de trouver la chaîne de chiffres la plus longue ( 10 *) qui apparaît dans la représentation binaire de m . Cela peut être fait de manière récursive.
Initialise k comme 1 . Chaque fois que f est exécuté, nous testons d’abord si la représentation décimale de k apparaît dans la représentation binaire de m . Si c'est le cas, on multiplie k par 10 et on appelle à nouveau f . Si ce n'est pas le cas, le code à droite de
and
n'est pas exécuté et nous renvoyons False .Pour ce faire, nous calculons d’abord
bin(k)[3:]
. Dans notre exemple,bin(k)
retourne'0b111100101110000010110'
et0b1
le début est supprimé avec[3:]
.Maintenant, l'
-~
appel avant l'appel récursif incrémente Faux / 0 une fois pour chaque fois que f est appelé de manière récursive. Lorsque 10 {j} ( 1 suivi de j répétitions de 0 ) n'apparaît pas dans la représentation binaire de k , la plus longue série de zéros de k a une longueur de j - 1 . Puisque j - 1 zéros consécutifs dans k indiquent j correspondant à des bits adjacents dans n , le résultat souhaité est j , ce que nous obtenons en incrémentant Faux / 0.un total de j fois.la source
Python 2, 46 octets
Essayez-le en ligne
Extrait les chiffres binaires
n
en sens inverse en prenant plusieurs foisn/2
etn%2
. Suit la longueur de la série actueller
de chiffres égaux en la réinitialisant à 0 si les deux derniers chiffres sont inégaux, puis en ajoutant 1.L’expression
~-n/2%2
indique si les deux derniers chiffres sont égaux, c’est-àn
- dire 0 ou 3 modulo 4. Vérifier que les deux derniers chiffres ensemble ont été raccourcis au lieu de se souvenir du chiffre précédent.la source
05AB1E , 6 octets
Essayez-le en ligne!
Explication
la source
.¡
, je peux arrêter de me forcer à essayer de l'utiliser.Mathematica, 38 octets
ou
la source
Python, 53 octets
Fonction lambda anonyme.
la source
Gelée , 6 octets
Essayez-le en ligne!
Comment ça marche
la source
Ruby,
41 à40 octetsTrouver la plus longue séquence de '1' dans b ou son inverse.
Merci à manatwork d’avoir économisé 1 octet.
la source
%b
.JavaScript (ES6), 54 octets
Une solution récursive avec beaucoup de manipulation de bits.
n
stocke l'entrée,r
stocke la longueur de l'exécution en cours,l
stocke la longueur de l'exécution la plus longue etd
stocke le chiffre précédent.Extrait de test
la source
f=(x,b,n,m)=>x?f(x>>1,x&1,n=x&1^b||-~n,m>n?m:n):m
Ruby,
514443 octetsSolution fonctionnelle.
@manatwork est fait de magie
la source
0
s consécutifs ?->s{s.to_s(2).scan(/0+|1+/).map(&:size).max}
.Python 2, 57 octets
Une solution récursive. Il pourrait y avoir une forme plus courte pour le bit magique.
la source
Perl, 43 octets
En comptant le shebang comme un, l'entrée est prise de stdin.
Essayez-le en ligne!
la source
#!perl
compte pour zéro, pas#!perl -p
.-p
coûts 1, dans l'hypothèse où votre ligne de commande Perl aurait de toute façon un argument (par exemple-e
ou-M5.010
), vous pouvez donc insérer un pointp
juste après l'un des tirets. Le#!perl
est gratuit (bien que inutile).Pip , 16 octets
On dirait qu'il doit y avoir un moyen plus court pour obtenir les exécutions du même chiffre ...
Prend l'entrée comme argument de ligne de commande. Essayez-le en ligne!
Explication
la source
Perl 6 , 36 octets
Explication:
Essayez-le en ligne .
la source
Haskell, 79 caractères
où
Ou en version non-golfée:
Explication:
intToBin
convertit un int en une liste de chiffres binaires (lsb en premier).group
groupe des séquences contiguës, telles qu'elles[1, 1, 0, 0, 0, 1]
deviennent[[1, 1],[0, 0, 0],[1]]
.maximum . map length
calcule pour chaque liste interne sa longueur et renvoie la longueur de la plus longue.Edit: Merci à @xnor et @Laikoni pour la sauvegarde d’octets
la source
group
n'est pas dans Prelude par défaut, vous devez le faireimport Data.List
pour l'utiliser.let
:i n|(q,r)<-n`quotRem`2=r:i q
. Voir nos conseils de golf Haskell .quotRem
peut êtredivMod
. Je pense que vous pouvez utiliseri 0=[]
comme cas de base.div
etmod
directement est encore plus court:i n=mod n 2:i(div n 2)
.Pyth, 7 octets
Effectuez la longueur de la séquence binaire sur la chaîne binaire, puis triez-la de manière à ce que les plus longues exécutions arrivent en dernier, puis prenez le premier élément (la longueur) du dernier élément (la plus longue) de la liste.
En pseudocode:
la source
J , 21 octets
Essayez-le en ligne!
Explication
la source
MATLAB 71 octets
Ceci convertit la variable entière 'a' en un tableau binaire int8 puis compte le nombre de fois que le résultat doit être différencié jusqu'à ce qu'il n'y ait plus de zéro dans le résultat.
Je suis nouveau ici. Est-ce que ce type de saisie et de ligne unique est autorisé par les règles du GCPC?
la source
a
aveca=input('');
. En outre, quelques conseils de golf:~a
au lieu dea==0
. Avez-vous vraiment besoinint8
)?Octave , 31 octets
Essayez-le en ligne!
Explication
Ceci est une traduction de ma réponse MATL. Mon plan initial était une approche différente, à savoir
@(n)max(diff(find(diff([0 +dec2bin(n) 0]))))
. Mais il s'avère qu'Octave a unerunlength
fonction (que je viens de découvrir). Par défaut, il ne sort que le tableau de longueurs d'exécution, le résultat souhaité est donc celuimax
de ce tableau. La sortie dedec2bin
, qui est un tableau de caractères (chaîne) contenant'0'
et'1'
, doit être convertie en un tableau numérique en utilisant+
, carrunlength
attend une entrée numérique.la source
Utilitaires Bash / Unix,
666542 octetsMerci à @DigitalTrauma pour des améliorations significatives (23 octets!).
Essayez-le en ligne!
la source
Bash (+ coreutils, + GNU grep),
33, 32 octetsEDITS:
Golfé
A expliqué
Essayez-le en ligne!
la source
Brachylog , 9 octets
Essayez-le en ligne!
Explication
la source
C #, 106 octets
Version formatée:
Et une autre approche accédant à la chaîne par index à 118 octets, en supprimant les espaces:
la source
Javascript, 66 octets
Merci à manatwork pour le code.
Explication
Convertir le nombre en chaîne binaire.
Diviser chaque caractère différent (0 ou 1) (cette expression rationnelle capture les espaces vides mais ils peuvent être ignorés)
Pour chaque élément du tableau, obtenez sa longueur et mettez-le dans le tableau retourné.
Convertir un tableau en liste d'arguments ([1,2,3] -> 1,2,3)
Obtenez le plus grand nombre des arguments.
la source
x=>x.toString(2).split(/(0+|1+)/g).map(y=>y.length).sort().pop()
. Ou la même longueur:x=>Math.max(...x.toString(2).split(/(0+|1+)/g).map(y=>y.length))
.sort((a,b)=>b-a)
. Par défaut, la fonction de tri se situe10
entre1
et2
.Merveille , 27 octets
Usage:
Convertit en binaire, correspond à chaque séquence de 0 et de 1, obtient la longueur de chaque correspondance et obtient le maximum.
la source
Lot, 102 octets
Port de la réponse de @ edc65.
%2
..%4
sera vide lors du premier appel, je dois donc écrire les expressions de manière à ce qu'elles fonctionnent encore. Le cas le plus général est celui pour%3
lequel je devais écrire(%3+0)
.%2
est plus facile, car il ne peut être que0
ou1
, qui sont les mêmes en octal,0%2
fonctionne donc ici.%4
s’est avéré être encore plus facile, car je n’ai besoin que de le soustraire.(%4-r>>5)
est utilisé pour comparerl
avecr
comme lot deset/a
ne dispose pas d' un opérateur de comparaison.la source
Dyalog APL , 22 octets
Train de fonctions anonyme
⌈/∘(
... Le maximum des résultats du train de fonctions anonyme suivant ...≢¨
le décompte de chaque⊢⊂⍨
partition de l'argument, où le partitionnement est déterminé par ceux de1,
on a préposé à2≠/
l'inégale paire de⊢
l'argument)
appliqué à2⊥⍣¯1
à partir de la base 2 appliquée une fois (c’est-à-dire à la base 2, une fois) à⊢
l'argumentTryAPL en ligne!
la source
Japt, 15 octets
Testez-le en ligne! ou Vérifiez tous les cas de test à la fois .
Comment ça marche
la source
R,
4534 octetsCorrection d'un malentendu idiot grâce à @rturnbull et @plannapus.
la source
0
ou1
non, pas seulement0
, non?PowerShell ,
787473 octetsEssayez-le en ligne!
Ugh ces méthodes .Net.
Cela utilise juste une expression rationnelle pour trouver (et faire correspondre) des séquences contiguës de uns et de zéros, puis prend la
Length
propriété (avec un nouveau motif que j'ai trouvé qui utilise un jeu de paramètres peu connuForEach-Object
, pour enregistrer 1 octet) des objets correspondants obtenus, les trie et sort le dernier (le plus grand).la source
J, 27 octets
Une approche légèrement différente (et malheureusement plus longue) de la réponse de miles .
Usage:
Explication
la source