Description de la tâche
Étant donné un entier, permutez ses (2k – 1) -e et 2k -e bits de poids faible pour tous les entiers k> 0 . Il s'agit de la séquence A057300 dans l'OEIS.
(Le nombre est supposé avoir «une infinité de zéros non significatifs». En pratique, cela signifie simplement ajouter un seul bit de 0 à des nombres de longueur impaire.)
Il s'agit de code-golf , donc le code le plus court (en octets) l'emporte.
Cas de test
0 -> 0
1 -> 2
9 -> 6
85 -> 170
220 -> 236
1827 -> 2835
47525 -> 30298
unsigned char array_of_bytes[1024]
de fonctionner comme vous le souhaitez (c'est-à-dire être un champ de bits avec 1024 *CHAR_BIT
entrées). J'imagine que la plupart des réponses prenant en charge des entrées de longueur arbitraire supposeraientCHAR_BIT
même, car le décalage des bits entre les octets est lourd. Vous pouvez donc absolument imposer une prisek
en charge jusqu'à une taille constante, comme 256 ou quelque chose de raisonnable pour AES, et les langues sans types entiers 256 bits devraient utiliser des boucles. Cela pourrait rendre les vecteurs SIMD à considérer pour une réponse asm x86: PRéponses:
Gelée ,
1097 octetsEssayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
Python 2, 26 octets
Astuces de bits!
Say
n
a la forme...ghfedcba
en binaire. Ensuite, nous pouvons le diviser en deuxEnsuite, le résultat à commutation de bits
s
peut être exprimé commes=2*o+e
.Nous préférons calculer un seul
e
eto
, donc nous exprimonso=n-2*e
et substituonsDonc, il reste maintenant à exprimer
e
en termes den
. Le nombreM=4**n/3
a la forme...10101010101
en binaire, qui sert de masque pour les chiffres impairs. L'exposantn
s'assure queM
c'est assez long. Prendre le bit à bitand
den/2
et cette valeur donnee
comme souhaité.On peut plutôt exprimer
e
en termes deo
e=(n-o)/2
, ce qui donnes=(n+o*3)/2
, ce qui économise un octet grâce à une optimisation de xsot.la source
n
. Cependant, je préfère la convention de dénomination des bits "impairs" et "pairs" opposée. Le LSB est le bit 0, qui est pair (même s'il s'agit du premier bit). Dans la programmation SIMD, où les shuffles sélectionnent souvent des éléments avec un index, les index comptent à partir de 0, il est donc normal de considérer l'élément bas comme un élément pair. par exemple[ 3 2 1 0 ]
lambda n:n+(n&4**n/3)*3>>1
f(x){return x+((x&~0U/3)*3)>>1;}
renvoie 1 pour l'entrée 2 .calc
(aka apcalc), pas vraiment C. Je pensais que j'allais bien car je n'avais pas besoin de troncature à 32 bits ou de complément à deux. Je ne pensais pas que l'expression avait l'air correcte, alors j'étais prêt à croire mes mauvais tests. Mais de toute façon, j'ai besoin d'un meilleur REPL pour développer des bithacks. Aucune suggestion? (idéalement la ligne de commande Linux, commebc -l
oucalc
, mais en fait exposantint32_t
/uint32_t
ou quelque chose, pas une précision étendue.)Fonction C, 38
Bit-twiddling:
Ideone.
Ou pour le plaisir:
Fonction récursive C, 43
Selon la formule OEIS ,
a(4n+k) = 4a(n) + a(k), 0 <= k <= 3
ou
Ideone.
la source
CJam,
161413 octetsTestez-le ici.
Explication
la source
Pyth, 9 octets
Essayez-le dans le compilateur Pyth .
Comment ça marche
la source
JavaScript (ES6),
3230 octetsFonctionne uniquement jusqu'à 1073741823 en raison des limitations des entiers JavaScript.
3836 octets fonctionne jusqu'à 4294967295:Edit: sauvé 2 octets grâce à @ user81655.
51 octets fonctionne jusqu'à 4503599627370495:
la source
n<<1
êtren*2
?n/2
aussi! Je ne sais pas pourquoi je n'y avais pas pensé auparavant.>>>
... qu'est-ce que c'est?>>>
mais ça fait un changement non signé.>>>0
convertit essentiellement en un entier non signé 32 bits.Fonction asm x86: 14 octets de code machine
version uint64_t: 24 octets
Convention d'appel SysV x86-64 (
x
enedi
), mais ce même code machine fonctionnera également en mode 32 bits. (Où lelea
décodera commelea eax, [edi + eax*2]
, ce qui donne des résultats identiques ).0x4f - 0x40
= 14 octetsC'est la sortie du compilateur qui utilise l'excellente idée de masquage unique de xnor dans le sens inverse. (Et terminologie opposée: le bit bas est le bit 0, ce qui est pair, pas impair.)
Je n'ai trouvé aucune amélioration par rapport à ce que fait le compilateur. Je pourrais l'avoir écrit comme
mov eax, 0x555...
/and eax, edi
, mais c'est la même longueur.La même fonction pour les entiers 64 bits prend 24 octets (voir le lien Godbolt). Je ne vois aucun moyen plus court que 10 octets
movabs rax, 0x55...
pour générer le masque dans un registre. (x86div
instructions sont maladroites, donc la division non signée de tous les uns par 3 n'aide pas.)J'ai trouvé une boucle pour générer le masque en rax, mais c'est 10 octets (exactement la même longueur que le
mov imm64
).Si nous savions qu'aucun des octets existants dans
rax
n'a leur bit faible défini, nous pourrions ignorer lexor
, et ce serait long de 8 octets.Une version précédente de cette réponse avait une boucle de 10 octets utilisant l'
loop
insn, mais elle avait un temps d'exécution d'0xFFFFFFFFFFFFFF08
itérations dans le pire des cas , car je ne fais que définircl
.la source
Oasis , 17 octets (non concurrent)
Essayez-le en ligne!
Oasis est un langage conçu par Adnan qui est spécialisé dans les séquences.
Actuellement, cette langue peut faire récursivité et forme fermée.
Nous utilisons cette formule:
a(4n+k) = 4a(n) + a(k), 0 <= k <= 3
Pour spécifier le cas de base est simple: le
3120
à la fin signifie simplement celaa(0)=0, a(1)=2, a(2)=1, a(3)=3
.la source
MATL , 10 octets
Essayez-le en ligne!
Version modifiée pour générer les premiers termes de la séquence ( OEIS A057300 ).
Explication
la source
zsh, 28 octets
Prend l'entrée comme argument de ligne de commande, sort sur STDOUT.
Il n'est pas compatible Bash car il utilise la syntaxe de conversion de base spécifique à zsh.
la source
Rétine, 70 octets
Suite de tests. (Légèrement modifié.)
Eh bien, juste pour le plaisir: 7 octets
Prend la base-4 comme entrée et les sorties comme base-4.
Essayez-le en ligne!
la source
05AB1E, 8 octets
Merci à @Adnan pour -5 octets!
Utilise l'encodage CP-1252.
Essayez-le en ligne!
Explication:
la source
1 2‚2 1‚
par12Â
8 octets.4в2‰íJJC
C,
323029 octetsAlgorithme copié à partir du commentaire de xsot sur la réponse Python de xnor . Au lieu de masquer dans les deux sens, masquez dans un sens et combinez.
Cela se compile au même format que la dernière version que j'ai testée , et cela fonctionne (pour x jusqu'à
0x3FFFFFFF
et pour x au-dessus, tant que le bit 30 n'est pas défini, voir ci-dessous). Dans le code machine, c'est la même longueur que ma réponse asm existante.La version ci-dessus efface toujours la partie haute du résultat . La meilleure version sûre est de 32 octets:
La version Python n'a pas ce problème, car python utilise des types entiers de précision arbitraire lorsque cela est nécessaire , au lieu de tronquer à une limite supérieure fixe.
la source
>>
cette priorité était si faible. Je ne joue pas assez souvent au golf pour me rappeler exactement quelles sont les règles, car les avertissements du compilateur suggérant des parens dans des cas dangereux me sauvent dans le vrai code. : PJavascript (ES6),
113109 octets4 octets enregistrés grâce à Upgoat
Comment ça marche
la source
+('0b"+binary_string_here)
au lieu de `parseInt (..., 2)J, 20 octets
Usage
Où
>>
est STDIN et<<
STDOUT.Non golfé
Trois fourchettes.
Sidenote
Dans l'interprète officiel,
^:_1
peut être remplacé parinv
, en économisant 1 octet.Cependant, aucun des interprètes en ligne ne l'implémente.
la source
C #, 44 octets
Basé sur l' implémentation C
int f(int n)=>n>3?4*f(n/4)+f(n%4):n%2*2+n/2;
Essayez-le ici: C # pad
la source
INTERCAL , 60 octets
Essayez-le en ligne!
Fonctionne pour les entiers 16 bits, avec les E / S effectuées dans le format le plus naturel pour INTERCAL: l'entrée est une série de chiffres décimaux énoncés dans l'un des plusieurs langages naturels ou construits, et la sortie est en "chiffres romains massacrés".
C'est l'un de ces rares défis où les opérateurs binaires d'INTERCAL peuvent en fait être utilisés de manière intuitive, car le repositionnement des bits est leur raison d'être. Select (
~
) prend les bits de son premier argument correspondant à ceux de son deuxième argument et les place à droite avec des zéros, et mingle ($
) entrelace les bits de ses arguments de telle sorte que les bits du premier argument soient plus significatifs. La solution la plus simple consiste donc à sélectionner les bits alternatifs les moins significatifs (.1~#21845
), à sélectionner les bits alternatifs les plus significatifs (.1~#43690
) et les entrelacer dans l'ordre inverse. Heureusement pour le nombre d'octets, bien que les opérateurs INTERCAL n'aient pas de priorité définie (car l'objectif du langage est de ne pas avoir de précédents), il s'avère que le C-INTERCAL sur TIO ne nécessite pas beaucoup de regroupement pour cette expression particulière, ne coûtant qu'un octet depuis'.
peut être abrégé!
.Avec prise en charge des entiers 32 bits:
INTERCAL , 67 octets
Essayez-le en ligne!
INTERCAL ne permet pas les littéraux 32 bits, ce qui en fait un peu plus facile à lire, car cela signifie que les constantes magiques pour sélectionner les bits alternés doivent être construites en mélangeant deux littéraux 16 bits ensemble, où chacun est à zéro et l'autre tous. (En fait, même s'il y avait des littéraux 32 bits, cela serait encore plus court.
#0$#65535
Est de deux octets de moins#1431655765
, et il en va de même pour l'autre.) Cela communique tout le processus de manière anormale pour INTERCAL.Une approche alternative avec une utilisation maladroite de la surcharge d'opérande :
INTERCAL , 71 octets
Essayez-le en ligne!
Cela supprime complètement la sélection en déclarant qu'il
:1
est.2
mélangé avec.3
, en définissant:1
l'entrée, puis en sortant.3
mélangé avec.2
. Depuis a:1
été surchargé en tant que.2$.3
,DO :1 <- :2
attribue des valeurs à.2
et.3
telles qui:1
acquièrent la valeur de:2
, ce qui a pour résultat de.2
contenir les bits alternatifs les plus significatifs:2
et de.3
contenir les bits alternatifs les moins significatifs. Ce serait la plus courte des deux solutions 32 bits de quatre octets si ellePLEASE WRITE IN :1
pouvait être remplacéePLEASE WRITE IN :2 DO :1 <- :2
par une surcharge:1
, maisCALCULATING
s'avère nécessaire pour utiliser la surcharge. J'ai également l'impression qu'il pourrait y avoir un moyen plus court d'effectuer la surcharge elle-même que de démarrer le programmeDO:1<-:1/.2$.3
, mais comme il s'agit d'INTERCAL, j'ai également l'impression qu'il ne peut pas y en avoir.la source
Mathematica, 44 octets
Même approche que ma réponse CJam: convertir en base-4, permuter 1 et 2, reconvertir. Il utilise également l'astuce d'alephalpha pour remplacer
FromDigits
par uneFold
opération de sauvegarde d'un octet.la source
En fait, 16 octets
Essayez-le en ligne!
Explication:
la source
J, 22 octets
Approche alternative basée sur la manipulation de tableaux au lieu de l'astuce de base 4.
Usage
Explication
la source
REXX, 88 octets
la source