Considérez le processus suivant:
Prenez un entier non négatif N.
par exemple N =
571
Exprimez-le en binaire sans zéros au début. (Zéro est la seule exception, devenir
0
.)par exemple
571
=1000111011
en binaireSéparez les exécutions consécutives de uns et de zéros dans cette représentation binaire.
par exemple ,
1000111011
→1
,000
,111
,0
,11
Trier les pistes du plus long au plus court.
par exemple
1
,000
,111
,0
,11
→000
,111
,11
,1
,0
Ecraser tous les chiffres dans chaque course avec alternance
1
« s et0
» s, en commençant toujours avec1
« s.par exemple
000
,111
,11
,1
,0
→111
,000
,11
,0
,1
Concaténez le résultat pour obtenir un nouveau nombre binaire.
par exemple
111
,000
,11
,0
,1
→1110001101
=909
en décimal
Lorsque vous tracez les valeurs produites par ce processus, vous obtenez un graphique très soigné:
Et j'espère comprendre pourquoi j'appelle la séquence résultante la séquence Temple Skyline :
Défi
Ecrivez un programme ou une fonction qui prend un entier non négatif N et imprime ou renvoie le numéro de séquence Temple Skyline correspondant. Votre entrée et votre sortie doivent être toutes les deux en décimales.
Par exemple, si l'entrée est 571
la sortie doit être 909
.
Le code le plus court en octets gagne.
Pour référence, voici les termes de la séquence de N = 0 à 20:
0 1
1 1
2 2
3 3
4 6
5 5
6 6
7 7
8 14
9 13
10 10
11 13
12 12
13 13
14 14
15 15
16 30
17 29
18 26
19 25
20 26
.BQ
place dejQ2
, ce qui signifie que vous pouvez perdre l’espace entre le8
et le précédent2
.is*R`s=!Z_ShMr.BQ8 2
est une solution intéressante de même longueur. Publier principalement parce que je ne m'attendais pas vraiment à ce que l'assignation dans un argument de carte fonctionne.`s
par]
. Enregistre un octet.Python 2, 121 octets
125121: Merci à Sp3000 d'avoir supprimé 4 octets!
125
la source
n*`~i%2`for
au lieu de"10"[i%2]*n for
sorted(...,key=len)
au lieu d’utilisermap(len,...
mais je ne comprends pas tout à fait votre programme pour le moment, donc je ne suis pas certain que cela vous serait bénéfique.len
parce que c’est la seule information dont j’ai besoin pour reproduire le montant de 1 et 0. J’ai essayé votre suggestion et elle ajoute 2 octets, car je vais devoir l’utiliserlen
deux fois, mais merci pour la suggestion!JavaScript ES6, 110 octets
1131161191203 octets sauvegardés grâce à @intrepidcoder
3 octets sauvés grâce à @NinjaBearMonkey
Approche directe. Je n'aime pas la longueur de la fonction de tri, mais je ne vois pas comment le jouer au golf.
la source
+
au lieu deeval
.split(/(0+)/g)
devrais pouvoir le remplacermatch(/(.)\1*/g)
.+(s=0, ... .map(l=>l.replace(/./g,s^=1))...)
C ++,
535527 octets(merci zereges d'avoir réduit quelques octets.)
Maintenant que nous nous sommes débarrassés de ces octets, le programme est maintenant compétitif;)
Je suis nouveau dans le golf, alors donnez-moi des conseils dans les commentaires .
Des choses comme "vous n'avez pas besoin de ces crochets" ou "utilisez printf" sont toutes utiles, mais j'apprécie également les conseils sur la logique. Merci d'avance!
Pour faciliter la lecture, je présente la version non-golfée:
EDIT version golfée réduite de quelques octets, version non modifiée non modifiée
la source
int a; int b;
utiliserint a,b;
. Les variables de la portée globale sont également initialisées avec0
. De plus, vous n'avez pas besoin d'utiliser des accolades lorsqu'il n'y a qu'une seule commande à exécuter. Aussiones=!ones;
peut être simplifié commeones ^= 1;
for
boucle1
, c.for(int i=D;i;i--)
-à- d. Et utilisez-lapow(2,i-1)
à l'intérieur de la boucle.ones
peut également l'êtreint
. Peut - être macroingint(pow(i))
dansP(i)
. Je vous recommande de lire la discussion iciHaskell,
132131 octetsExemple d'utilisation:
Comment ça marche:
la source
J - 30 octets
Fonction prenant un entier à droite. Gère correctement 0.
#:
- Prenons la représentation binaire.1,2~:/\]
- Entre chaque chiffre, indiquez Vrai s'ils sont différents. Préfixez un True afin que la liste ait True au début de chaque "exécution".(#;.1~...)
- En utilisant le vecteur booléen ci-dessus, prenez la longueur de chaque exécution.\:~
- Triez ces longueurs du plus long au plus court.2|#\
- Prenez une liste d'alterner1 0 1 0 ...
aussi longtemps que la liste de longueurs.(...#...)
- Pour chaque nombre à gauche (longueurs triées), prenez autant d'éléments de droite à droite (en alternant des 1 et des 0)&.
- Convertissez cette nouvelle représentation binaire en un nombre.Exemples:
la source
Perl 5.10,
121101Je pense que la partie genre peut être plus courte.
Edit: -20 octets, grâce à symbabque!
la source
\n
, et lam
n'est pas requise pour la correspondance d'expression régulière. Dans votre substitution, utilisez simplement à la.
place du groupe char.grep
partie non plus. Leoct
est soigné cependant :)Python 3,
146136 octetsla source
map
d'unlambda
, serait-il préférable de faire''.join(... for ... in ...)
?Mathematica, 83 octets
Ceci définit une fonction non nommée.
la source
Ruby,
107104102 octets(sauvé 3 octets grâce à nimi )
Je ne vais pas battre CJam, mais je l'ai eu assez petit pour un langage sensé.
la source
(i+=1)%2
isi=1-i
.Java 8,
179176 octetsJ'ai utilisé deux importations statiques:
java.util.Integer.highestOneBit
etjava.util.Arrays.sort
.Pour plus de lisibilité, voici le code ungolfed:
la source
Python 2, 170 octets
la source
t(0) = 0
quand1
est prévu ett(4) = 1
quand 6 est attendu