La séquence Baum-Sweet (A086747 avec une torsion)
Prenez un entier positif n
et imprimez les entiers de 1 à n pour lesquels la séquence Baum-Sweet renvoie vrai. La séquence Baum-Sweet devrait retourner la fausse si la représentation binaire du nombre contient un nombre impair de zéros consécutifs n'importe où dans le nombre, et vrai sinon. Pour plus d'informations, cliquez sur le lien. Voici quelques exemples:
1 -> 1 -> Truthy
2 -> 10 -> Falsy
3 -> 11 -> Truthy
4 -> 100 -> Truthy (Even run of zeros)
Voici un exemple donné n=32
Étape 1: La séquence Baum-Sweet visualisée pour n=32
1 1 (1)
1 0 0 (2)
11 1 (3)
1 00 1 (4)
1 0 1 0 (5)
11 0 0 (6)
111 1 (7)
1 000 0 (8)
1 00 1 1 (9)
1 0 1 0 0 (10)
1 0 11 0 (11)
11 00 1 (12)
11 0 1 0 (13)
111 0 0 (14)
1111 1 (15)
1 0000 1 (16)
1 000 1 0 (17)
1 00 1 0 0 (18)
1 00 11 1 (19)
1 0 1 00 0 (20)
1 0 1 0 1 0 (21)
1 0 11 0 0 (22)
1 0 111 0 (23)
11 000 0 (24)
11 00 1 1 (25)
11 0 1 0 0 (26)
11 0 11 0 (27)
111 00 1 (28)
111 0 1 0 (29)
1111 0 0 (30)
11111 1 (31)
1 00000 0 (32)
Donc, après avoir calculé la séquence de Baum-Sweet pour n, prenez les nombres qui étaient véridiques pour la séquence et recueillez-les pour le résultat final. Car n=32
nous aurions:
[1, 3, 4, 7, 9, 12, 15, 16, 19, 25, 28, 31]
Comme réponse finale.
Il s'agit du code-golf , le nombre d'octets le plus court gagne.
code-golf
sequence
base-conversion
binary
Urne de poulpe magique
la source
la source
Réponses:
05AB1E ,
109 octetsUn octet enregistré grâce à Adnan
Essayez-le en ligne!
Explication
la source
ƒ
au lieu de>G
?.¡
utilisé;).JavaScript (ES6),
706863 octetsSolution récursive légèrement plus intéressante:
67 octets grâce à @Neil.
g
est la fonction à appeler.la source
f
est similaire à une fonction que j'utilise occasionnellement pour compter le nombre de 1 bits dans un nombre.f
quandn=0
? De plus, commef
ne renvoie que 0 ou 1, vous pouvez raser deux octets en utilisantn&f(n>>1)
.n = 0
n'est pas le cas;).filter
:n=>[...Array(n+1).keys()].filter(f=n=>n<2?n:n%4?n&f(n>>1):f(n/4))
Python 2, 62 octets
Vérifie les exécutions impaires de 1 dans la représentation binaire en se séparant
00
et en vérifiant s'il reste des zéros dans la représentation sous forme de chaîne de la liste résultante. Chose ennuyeuse, les nombres binaires commencent par0b
, qui a un zéro qui doit être supprimé pour éviter un faux positif.L'énumération se fait par récurrence.
la source
Frapper,
58, 46 octetsMODIFICATIONS:
Golfé
Tester
Expliqué
coquille
sed
Essayez-le en ligne!
la source
Lot, 143 octets
la source
Perl 6 , 40 octets
Essayez-le
(
[]
sont utilisés pour le regroupement sans capture, avec<[]>
pour les classes de caractères)la source
PowerShell ,
7961 octetsEssayez-le en ligne!
J'ai eu l'inspiration ce matin pour changer la façon
-split
dont j'exécute l' opération, puis je vois que c'est similaire à la façon dont la réponse de xnor est construite, alors, je suppose que les grands esprits pensent de la même façon?Nous effectuons une boucle du
1
haut vers l'entrée$args[0]
et utilisons unWhere-Object
opérateur pour extraire les nombres appropriés|?{...}
. La clause est une simple valeur booléenne - nous nous assurons que0
c'est-notin
le résultat de(...)
.À l'intérieur des parens, nous avons
[convert]::
le nombre actuel$_
ToString
avec la base2
(c'est-à-dire, le transformer en une chaîne binaire). Nous avons ensuite-split
la chaîne sur l'expression régulière1|00
- c'est une correspondance gourmande, et se traduit par un tableau de chaînes (par exemple,100010
se transformerait en'','','0','','0'
et ainsi de suite).Ainsi, si chaque série de
0
s dans la chaîne binaire est même ( ce qui signifie l'expression régulière leur a divisé en plusieurs chaînes vides), puis0
sera-notin
le résultat, de sorte que laWhere
clause est vrai, et le nombre est sélectionné. Ces chiffres sont laissés sur le pipeline et la sortie est implicite.la source
Python 2 ,
6747 octetsMerci à @xnor d'avoir joué au golf sur 20 (!) Octets!
Renvoie une liste non ordonnée. C'est assez efficace: l'entrée 100 000 prend environ 40 ms sur TIO.
Essayez-le en ligne!
la source
[1][n:]or
. Aussi,x-~x
pour2*x+1
.f=lambda n,k=1:n/k*[1]and[k]+f(n,k-~k)+f(n,4*k)
en supposant que les sorties peuvent être dans n'importe quel ordre.Mathematica, 59 octets
Réponse mathématique numéro 4 ...
la source
MATL ,
1211 octetsEssayez-le en ligne!
Explication
Pour détecter si un nombre est valide, celui-ci est converti en binaire, applique un encodage de longueur d'exécution, conserve uniquement les exécutions de longueur impaire et vérifie si aucune exécution de zéros ne survit.
la source
R, 75 octets
Lit l'entrée de stdin et utilise la
bin
fonction dumiscFuncs
package pour convertir du vecteur décimal en vecteur binaire. Effectue donc un codage de longueur d'exécution pour vérifier les valeurs== 0
et les longueurs sont impaires.la source
Empilé , 69 octets
Essayez-le ici!
Ou, non compétitif à 67 octets:
Et, encore plus non compétitif à 49 octets:
Tous prennent l'entrée comme TOS et laissent la sortie sur TOS.
Explication
La fonction:
Explication de la non concurrence:
C'est la même chose que ci-dessus, avec quelques différences clés:
la source
Befunge,
845149 octetsAprès un peu d'expérimentation, j'ai réalisé que je pouvais faire un peu mieux que ma solution d'origine en utilisant une technique similaire à la réponse par lots que Neil a proposée .
Essayez-le en ligne!
Comme avec ma solution d'origine, il y a deux boucles - la boucle externe itérant sur les nombres que nous voulons tester, et une boucle interne testant la séquence de bits pour chaque nombre. Le fonctionnement du test consiste à examiner deux bits à la fois (modulo 4 de la valeur actuelle). Si c'est égal à 2, nous avons une séquence étrange de zéros et pouvons abandonner la boucle intérieure et passer au numéro suivant.
Si le modulo 4 n'est pas égal à 2, nous devons continuer à tester les bits restants, donc nous remontons les bits qui ont déjà été testés. Cela se fait en divisant la valeur, appelons-la n , par
2+2*!(n%2)
. Cela signifie que si le premier bit était un 1, nous divisons par 2 (en supprimant ce 1 bit), mais si c'était un 0, nous divisons par 4, donc nous supprimerons toujours des paires de zéros.Si nous finissons par descendre à zéro, cela signifie qu'il n'y avait pas de séquences impaires de zéro bit, nous écrivons donc le nombre.
la source
Visual Basic (.net 4.5) 163 octets
Répondez d'abord ici, donc je suis sûr que j'ai foiré quelque chose. Faites le moi savoir et je réparerai. Les lambdas Visual Basic sont-ils même autorisés?
Merci à MamaFunRoll pour l'idée de supprimer les zéros consécutifs
Sorties R (32)
la source
Java,
144130128 octetsCe n'est pas aussi golfé que je pense que cela peut être, mais je pensais que ce serait une solution mignonne d'utiliser une Regex, même si je n'en avais jamais utilisé.
Golfé:
static String a(int n){String s="";for(Integer i=0;i++<n;)if(i.toString(i,2).replaceAll("00|1","").isEmpty())s+=i+" ";return s;}
Non golfé:
Edit: j'ai pu économiser 14 octets en créant l'expression régulière 00 | 1 au lieu de 00, et en supprimant ".replace (" 1 "," ")" entre replaceAll et isEmpty!
Edit 2: J'ai pu enregistrer 2 octets en faisant i un entier et en référençant Integer.toString avec i.toString.
la source
Clojure, 103 octets
Je ne pense pas que ce soit le chemin le plus court ...
Utilise
re-seq
pour trouver des zéros consécutifs, mappe leurs longueurs modulo-2 à aset
, les élimine si un nombre1
est trouvé dans l'ensemble.la source
Wonder , 38 octets
Usage:
Explication
Plus lisible:
rng 1 +1 #0
: Plage de 1 à l'entrée.fltr@ ...
: Plage de filtrage avec le prédicat suivant.bn #0
: Convertit l'élément actuel en binaire. (Cela aura un début0b
).Rstr #["00"]
: Taille récursivement toutes les occurrences de00
dans la chaîne.len iO 0
: Comptez les quantités de0
s dans la chaîne.=1
: Vérifiez si le montant est égal à 1. Si le seul0
reste dans la chaîne après l'élagage est en tête0b
, cela renvoie vrai; sinon, cela renvoie faux.la source
Rubis,
786968 octetsVersions plus anciennes:
la source
Mathematica, 81 octets
Calcule, pour chaque série de chiffres consécutifs d'un nombre, {le chiffre commun de cette série plus (1 si la longueur est impaire, 2 si la longueur est paire)}; si l'une des réponses est {1}, le nombre n'est pas dans la séquence.
la source
Mathematica, 75 octets
#~IntegerDigits~2
calcule la liste des chiffres binaires de l'entrée#
.Split
cette liste en séries d'éléments identiques, prenez laCases
correspondance{0..}
, prenez celleLength
de chacun, prenezEvenQ
les longueurs, puis retournezAnd
les résultats.la source
!Or@@OddQ/@...
Python 3,
8682 octetsGolf en cours ...
Golfé de 4 octets en changeant
bin(x)[2:]
en justebin(x)
- cela laisse0b
au début de la chaîne, mais j'ai réalisé que cela n'affecte pas réellement les calculs :)la source
Python, 142 octets
C'est principalement juste pour pratiquer le golf sur mon Python.
la source
Gelée , 10 octets
Terriblement inefficace. Essayez-le en ligne!
la source
Rubis,
545348 octetsJe ne pensais pas que l'expression régulière de cela allait être assez basique.
modifier 1: changé pour rejeter pour se débarrasser de la négation pour -1.
édition 2: basculé
match
sur=~
-5.la source
C #
159157155 octetsEnregistré 2 x deux octets grâce à TuukkaX.
Remarque: imprime les encres dans l'ordre inverse.
Explication:
la source
c%2==0
pourrait l'êtrec%2<1
.N
.b[i++] == '0'
pourrait êtreb[i++]==48
, mais comme l'autre caractère possible est '1' (ASCII 49), vous pouvez simplement vérifier sib[i++]<49
.Mathematica, 69 octets
La même longueur:
la source
Rubis, 53 octets
la source
Gelée,
151310 octetsenregistré deux octets après avoir regardé d'autres réponses, encore 3 octets grâce à Dennis
Explication
la source