Cela a été inspiré par le problème 13 - Binaire non répétitif de la récente compétition de HP CodeWars.
Prenons un nombre décimal aléatoire, disons
727429805944311
et regardez sa représentation binaire:
10100101011001011111110011001011101010110111110111
Maintenant, divisez cette représentation binaire en sous-séquences où les chiffres 0
et 1
alternent.
1010 010101 10 0101 1 1 1 1 1 10 01 10 0101 1 1010101 101 1 1 1 101 1 1
Et reconvertissez chaque sous-séquence en décimal.
10 21 2 5 1 1 1 1 1 2 1 2 5 1 85 5 1 1 1 5 1 1
La tâche
Prenez un seul entier positif comme entrée et sortez la séquence d'entiers positifs obtenue par le processus ci-dessus.
Détails
- L'entrée et la sortie doivent être décimales ou unaires.
- Les nombres dans la sortie doivent être séparés d'une manière sensible et lisible par l'homme, et ils doivent être décimaux ou unaires. Aucune restriction sur l'espace blanc. Styles de sortie valides:
[1,2,3]
,1 2 3
,1\n2\n3
où\n
sont les nouvelles lignes littérales, etc.
Cas de test
Input | Output
0 | 0
1 | 1
2 | 2
3 | 1 1
4 | 2 0
5 | 5
6 | 1 2
7 | 1 1 1
8 | 2 0 0
9 | 2 1
10 | 10
50 | 1 2 2
100 | 1 2 2 0
1000 | 1 1 1 1 10 0 0
10000 | 2 1 1 2 0 2 0 0 0
12914 | 1 2 2 1 1 2 2
371017 | 5 42 10 2 1
Remarque supplémentaire: tous les nombres dans la sortie doivent être de la forme (2^k-1)/3
ou 2*(2^k-1)/3
. Autrement dit, 0 1 2 5 10 21, 42, 85, 170, ...
qui est A000975 dans l'OEIS.
code-golf
sequence
base-conversion
binary
subsequence
El'endia Starman
la source
la source
|tac
restera dans ma réponse alors :)Réponses:
Pyth,
1716 octets1 octet grâce à Jakube
Manifestation
Une belle solution intelligente. Utilise certaines fonctionnalités moins connues de Pyth, comme
x<int><list>
etc<str><list>
.la source
tJ
par+dJ
vous pouvez supprimerhM
.Mathematica, 47 octets
Non golfé:
Split[list,f]
divise une liste en plusieurs listes, la rupture à la position entrea
etb
si sifff[a,b]
ne revient pasTrue
.FromDigits[n,2] => Fold[#+##&,n]
est une astuce soignée des alephalpha.la source
Python, 86 octets
Depuis que je me suis horriblement surpassé en Pyth, faisons-le à nouveau en Python.
Essayez-le ici!
Explication
Nous commençons par convertir le numéro d'entrée
n
en une chaîne binaire.bin(n)[2:]
s'occupe de ça. Nous devons supprimer les 2 premiers caractères de cette chaîne, carbin()
renvoie la chaîne au format0b10101
.Ensuite, nous devons identifier les frontières des sous-séquences. Cela peut être fait avec l'expression régulière
(?<=(.))(?=\1)
qui correspond aux positions de longueur nulle dans la chaîne qui ont le même nombre à gauche et à droite.La manière la plus évidente d'obtenir une liste de toutes les sous-séquences serait d'utiliser
re.split()
ce qui sépare une chaîne sur une certaine expression régulière. Malheureusement, cette fonction ne fonctionne pas pour les correspondances de longueur nulle. Mais heureusementre.sub()
, nous remplaçons simplement ces correspondances de longueur nulle par des espaces et divisons la chaîne sur celles après cela.Ensuite, nous devons simplement analyser chacune de ces sous-séquences en un nombre décimal avec
int(s,2)
et nous avons terminé.la source
Gelée, 12 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
Utilitaires Bash + GNU, 51
Entrée provenant de STDIN.
dc -e2o?p
lit l'entier d'entrée de STDIN et sort une chaîne de base 2sed -r ':;s/(.)\1/\1 \1/;t'
divise la chaîne de base 2 avec un espace partout, il y a les mêmes chiffres consécutifsdc -e2i?f
lit le binaire divisé en une fois, en plaçant chaque partie sur la pile, puisf
vide ladc
pile entière (numéros de sortie dans l'ordre inverse) ...tac
.la source
JavaScript (ES6) 58
62 63modifier 1 octet enregistré thx @ETHproductions
Modifier 4 octets enregistrés thx @Neil
la source
/(01)*0?|(10)*1?/g
, ou est-ce que cela gâcherait quelque chose ??x=>'0b'+x-0+' '
pour enregistrer un octet./((.)(?!\2))*./g
régulière vous fait économiser 4 octets.Pyth, 26 octets
Essayez-le ici!
Explication
Étant donné que la fonction split () de Python ne se divise pas sur les correspondances de longueur nulle, je dois remplacer ces correspondances par un espace et diviser le résultat à ce sujet.
la source
Pyth,
2221 octetsEssayez-le en ligne: Démonstration
Vraiment une tâche fastidieuse en Pyth.
Explication:
la source
05AB1E , 18 octets
Code:
Explication:
Essayez-le en ligne!
Utilise l' encodage CP-1252 .
la source
MATL ,
1817 octetsEssayez-le en ligne!
la source
zsh,
676355 octetsJe ne sais pas pourquoi, mais cela ne fonctionne pas dans Bash.
Merci à Dennis pour 8 octets!
la source
for
syntaxe. ... Attendez, nonfor
?for i in `grep -oP '1?(01)*0?'<<<$[[##2]$1]`;<<<$[2#$i]
.PHP,
Vue éclatée171168162160158121120131124118116113 113112 bytesUtilisez
d(int)
et vous êtes désactivé, la sortie est uneecho
chaîne ed deint
s séparés par un espace.Modifications:
-3:
$b
définition déplacée dans l'strlen()
appel.-6: Suppression de l'
$c
instanciation.-2: Finalement corrigé le problème de concaténation.
-2: Pas de crochets pour une seule ligne
for()
.-37: Révision totale. Aller avec des
Array
chunklets au lieu d' appels répétésArray
->String
->Array
.-1:
$c
Réinitialisation sournoise .+11: Bugfix. Il manquait le dernier morceau. Pas plus.
-7: Vous n'avez pas du tout besoin d'instancier
$d
? Agréable.-6:
return
->echo
.-2: Crunching
$c
.-3:Ternary, mon premier amour.
-1: Sournois sournois
$u
.la source
function d($i){for(;$d<$l=strlen($b=decbin($i));print$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"")$c.=$u=$b[$d];}
.Convexe 0,2+, 25 octets
Convex est un nouveau langage que je développe qui est fortement basé sur CJam et Golfscript. L'interprète et l'IDE peuvent être trouvés ici . L'entrée est un entier dans les arguments de la ligne de commande. Il utilise l' encodage CP-1252 .
Explication:
la source
Java 8,
127119 octetsIl existe probablement une meilleure expression régulière pour diviser la chaîne. Je ne suis pas compétent en regex, mais je continuerai d'expérimenter.
-8 octets grâce à @FryAmTheEggman
la source
APL (APL) ,
2125 octetsGère désormais 0 également.
Essayez-le en ligne!
2⊥⍣¯1⊢
convertir en base-2, en utilisant autant de bits que nécessaire (conversion inversée par rapport à la base-2){
…}
Appliquer la fonction anonyme suivante0::
en cas d'erreur:0
retour 0⋄
Essayez maintenant:2=/⍵
égalité par paire de l'argument (échouera la représentation binaire de longueur 0 de 0)1,
ajouter 1⍵⊂⍨
utiliser cela pour partitionner l'argument (commence une nouvelle section sur chaque 1)2⊥¨
convertir chacun de base-2la source
⊂
est vraiment utile ici. Je devrais ajouter ça à Jelly.R←X⊂Y
: Avec⎕ML<3
(c'est-à-dire le style Dyalog), une nouvelle partition est démarrée dans le résultat correspondant à chaque 1 dans X jusqu'à la position avant que le 1 suivant dans X (ou le dernier élément de X) devienne les éléments successifs de R. Avec⎕ML=3
(ie style IBM), une nouvelle partition est démarrée dans le résultat chaque fois que l'élément correspondant dans X est supérieur au précédent. Les éléments en Y correspondant à 0 en X ne sont pas inclus dans le résultat.⎕ML←1 ⋄ 1 0 0 1 0 1 1 ⊂ ⍳7
Est donc équivalent à⎕ML←3
⋄ 4 3 2 4 4 5 7 ⊂ ⍳7`Japt , 7 octets
Essaye-le
Explication
la source
Python 3, 115 octets
Explication
Résultats
solution précédente (118 octets)
la source
Haskell,
147, 145 octetsmap(sum.zipWith((*).(2^))[0..]).([]%).b
est une fonction sans nom qui calcule la liste.Moins golfé:
la source
Perl, 53 octets
Comprend +1 pour
-p
Courir avec le numéro sur STDIN
alterbits.pl
:la source
PowerShell, 103 octets
Puisque je suis horrible à regex, j'utilise la même expression que la réponse d'edc65 .
Absolument détruit par les longs appels .NET pour effectuer la conversion vers / depuis le binaire et l'appel .NET pour obtenir les correspondances d'expression régulière. Sinon, c'est assez simple. Prend l'entrée
$args[0]
,convert
s en binaire, l'introduit dansMatches
, prend le.Value
s résultant , les canalise à travers une boucle|%{...}
etconvert
renvoie ces valeurs àint
. La sortie est laissée sur le pipeline et implicitement imprimée avec des retours à la ligne.Pour un crédit supplémentaire - une version (principalement) non regex à 126 octets
Nous prenons à nouveau l'entrée
$args[0]
etconvert
le binaire. Nous avons recréé en tant que tableau de caractères, stockant le premier caractère dans$l
et les caractères restants dans$r
. Nous envoyons ensuite à$r
travers une boucle|%{...}
où chaque itération que nous sélectionnons à partir du caractère précédé d'un espace ou simplement du caractère, en fonction du résultat d'un xor binaire avec$l
, puis défini comme$l
égal au caractère. Cela garantit effectivement que si nous avons le même caractère deux fois de suite, nous ajoutons un espace entre eux.La sortie de la boucle est
-join
éditée ensemble et ajoutée au premier caractère$l
, puis-split
sur les espaces (qui est techniquement une expression régulière, mais je ne vais pas le compter). Nous faisons ensuite la même boucle que la réponse régulièreconvert
et la sortie des entiers.la source
Java 345 octets
Tester
Sortie
la source
package
etclass
, et supprimer les espaces inutiles. Faites moi savoir si vous avez des questions!Julia,
7057 octetsIl s'agit d'une fonction anonyme qui accepte un entier et renvoie un tableau d'entiers. Pour l'appeler, affectez-le à une variable.
L'approche ici est similaire à la jolie réponse Python de DenkerAffe . Nous obtenons la représentation binaire de l'
n
utilisationbin(n)
et divisons la chaîne résultante à toutes les correspondances de l'expression régulière(?<=(.))(?=\1)
. C'est en fait une correspondance de longueur nulle;(?<=(.))
est un lookbehind positif qui trouve n'importe quel caractère, et(?=\1)
est un lookahead positif qui trouve le caractère correspondant dans le lookbehind. Cela localise les endroits où un nombre est suivi de lui-même dans la représentation binaire. Justeparse
chacun comme un entier dans la base 2 en utilisantmap
et le tour est joué!la source
C,
137129 octetsL'entrée et la sortie sont sur les flux standard.
la source
puts
, même si ce serait désagréable à utiliser, la spécification ne nécessite pas de retour à la ligne.J , 16 octets
Essayez-le en ligne!
Explication
la source
q / kdb +, 52 octets
Solution:
Exemples:
Explication:
q
est interprété de droite à gauche.Transtypez les entrées en binaire, coupez les zéros en tête, trouvez les indices où différents, inversez pour obtenir les indices où les mêmes, divisez la liste sur ces indices, reconvertissez en base-10. Semble un peu lourd par rapport à la solution APL ...
la source
PHP, 147
Besoin de mettre de l'espace supplémentaire à la fin de la sortie car il n'y a aucune restriction. Les avis sont affichés pour un codage court.
Version non golfée
la source
Rétine, 60
Essayez-le en ligne! Ou essayez une version légèrement modifiée pour tous les cas de test (avec E / S décimales).
Malheureusement, les correspondances de longueur nulle semblent avoir deux "côtés", ce qui entraîne une duplication lorsqu'elles sont utilisées avec l'expression régulière de la troisième étape. Cependant, cela ne coûte qu'un octet.
Prend l'entrée comme unaire, les sorties comme unaire. Pas vraiment sûr d'utiliser différentes valeurs unaires d'entrée / sortie, mais cela économiserait 4 octets.
la source
Gelée , 9 octets (non concurrentiel?)
Essayez-le en ligne!
la source