Créons un mappage simple et surjectif des entiers positifs aux entiers gaussiens , qui sont des nombres complexes dans lesquels les parties réelle et imaginaire sont des entiers.
Par exemple, pour un entier positif 4538
, exprimez-le en binaire sans interligne 0
:
4538 base 10 = 1000110111010 base 2
Supprimez tous les éléments suivants 0
:
100011011101
Remplacez les exécutions d'un ou plusieurs 0
par un seul +
:
1+11+111+1
Remplacez tout 1
par i
des:
i+ii+iii+i
Evaluez l'expression complexe résultante et générez le nombre entier gaussien simplifié:
i+ii+iii+i = i+i*i+i*i*i+i = 2i+i^2+i^3 = 2i+(-1)+(-i) = -1+i
La sortie peut être exprimée de manière mathématique traditionnelle ou sous forme de deux entiers distincts pour les parties réelle et complexe. Pour l' 4538
exemple, n'importe lequel d'entre eux serait bien:
-1+i
i-1
-1+1i
(-1, 1)
-1 1
-1\n1
Pour les entrées 29
telles que 0
, les sorties au format mathématique telles que,, 0i
ou 0+0i
sont correctes .
Utiliser j
(ou autre chose) à la place de i
est acceptable si cela est plus naturel pour votre langue.
Le code le plus court en octets gagne.
la source
4+2j
->100+10j
...Réponses:
MATL , 7 octets
Essayez-le en ligne!
Comment ça marche
Considérons l'entrée
4538
par exemple.la source
Gelée , 8 octets
Essayez-le en ligne!
Comment ça marche
la source
Python 2, 53 octets
J'essaie de jouer au golf et cela semble golfable, mais je suis à court d'idées ...
la source
(k or 1)
ne semble pas optimal, mais la seule autre chose à laquelle je peux penser est(k+0**k)
...0**k
ne fonctionnent malheureusement pas pour les complexesk
...Mathematica,
4438 octetsExplication
Convertir l'entrée en base 2. (
4538
devient{1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
)Multiplier par
I
({1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
devient{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
)Divisé en pistes (
{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
devient{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
)Trouvez le produit au niveau 2. (
{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
devient{I, 0, -1, 0, -I, 0, I, 0}
)Somme le résultat. (
{I, 0, -1, 0, -I, 0, I, 0}
devient-1 + I
)la source
Tr[Times@@@(I*Split@RealDigits[#,2][[1]])]&
I
premier, mais j'aiIntegerDigits
fini par être plus court.Python 2 ,
777671 octetsMerci à @ZacharyT pour le golf d'un octet!
Essayez-le en ligne!
la source
JavaScript (ES6),
6764 octetsSort en tant que tableau à 2 éléments.
Explication
Puisque JavaScript n'a pas de nombres imaginaires, nous devons suivre les parties réelle et imaginaire dans des variables séparées. La façon la plus simple de procéder consiste à utiliser un seul tableau, avec la partie réelle en premier. i est représenté par [0,1] , i 2 (ou -1 ) par [-1,0] , i 3 (ou -i ) par [0, -1] et i 4 (ou 1 ) par [1 , 0] .
Premièrement, nous divisons le nombre par 2 à plusieurs reprises, en rassemblant chaque série de uns dans sa représentation binaire. Chaque série de n unités correspond à i n . Cela correspond à l'ajout de 1 - (n & 2) à l'item d'index n & 1 dans le tableau à deux items. Donc c'est ce que nous faisons.
Je devrais probablement ajouter plus d'explications, mais je ne peux pas penser à quoi d'autre a besoin d'expliquer. Ne hésitez pas à commenter avec toutes les questions que vous pourriez avoir.
la source
Python,
1991291241169490716361 octetsL'entrée est juste le nombre lui-même.
La sortie est au format
(a+bj)
, oùj
est l'unité imaginaire.0j
sera sorti au lieu de(0+0j)
Tout d'abord convertir en binaire. Tronquer le
'0b'
off. Tuez les zéros à la fin. Fractionner en utilisant un bloc de zéro (s) en tant que délimiteur. Mappez chaque bloc sur1j ** len
. Ensuite, prenez la somme de la chose entière.-70 octets en ne convertissant pas en plus.
-5 octets regex est plus court.
-8 octets en éliminant les deux variables inutiles appelées une seule fois.
-22 octets en utilisant des nombres complexes au lieu de mon étrange chose. Merci à la réponse de @Dennis de m'avoir informé des nombres complexes!
-4 octets en réalisant que
map
c'est juste une façon élégante de faire des compréhensions de liste, sauf plus longtemps.-19 octets en passant à une méthode légèrement mystérieuse pour éviter les erreurs
j ** 0
et éviter les expressions rationnelles. Inspiré par le commentaire de @ Griffin. Merci! :)-8 octets en déplaçant la
if
pièce à la fin.-2 octets Merci à @Griffin d'avoir économisé 2 octets en supprimant les crochets pour en faire une expression génératrice!
la source
sum(1j**x.count('1')for x in bin(input()).split('0')if x)
1
blocs et n'utilise pas de regex comme le mien. De plus, je ne veux pas vous voler le code car il est bien meilleur que ma version. :)1
s plutôt que la longueur, la0x
pièce est d'abord placée au premier plan. Merci pour l'idée de déplacer leif
à la fin; Je n'aurais jamais su que ça marche autrement!MATLAB, 58 octets
Utilisons
285
pour illustrer le processus:Heureusement ,
1+++1
se comporte comme1+1
dans Matlab, de sorte que les evalue ci - dessus à:1+111+1
.Maintenant, cet
strrep
appel est le vrai bijou! En inséranti*1
pour1
quelque chose de vraiment sympa. S'il n'y en a qu'un1
, nous obtenons simplementi*1
ce qui esti
. S'il y a plus d'un alorsi*1
se répète et concaténées en une séquence:i*1i*1i*1i*1
. Depuisi==1i
dans Matlab et1i*1==i
cela est tout simplement:i*i*i*i
.Ajouter
.0
semble inutile ici, mais il est nécessaire si le dernier caractèretemp3
est un+
. Nous ne pouvons pas ajouter un zéro, car cela donneraiti*10
le cas précédent et donnerait donc un résultat erroné.Et enfin:
Cela ne fonctionne pas dans Octave pour plusieurs raisons.
strrep
ne peut pas prendre les valeurs ASCII en entrée, il faut les caractères réels ('0'
au lieu de48
). De plus,+++
n'évalue pas uniquement+
Octave, cela casserait les raccourcis d'incrémentation / décrémentationx++
etx--
.la source
eval
:-P Ne pouvez-vous pas utiliser1i
au lieu de1*i
?i*1
partie ...Pyth - 15 octets
Frustrement long.
Suite de test .
la source
Mathematica, 84 octets
Fonction anonyme. Prend un nombre en entrée et renvoie un nombre complexe en sortie.
la source
Mathematica, 75 octets
Indépendamment est venu avec presque la même solution que LegionMammal978 a posté il y a 23 minutes! Remplacer
1
parI
(qui est le symbole interne de Mathematica pour la racine carrée de -1) fonctionne car les espaces sont traités comme une multiplication d'expressions voisines. La place que j'ai sauvegardée sur l'autre solution, à savoir en évitant de recourir àStringTrim
, est toujours ajoutée-0
: si le nombre binaire se termine par1
, alors cette expression se termine...I-0
sans affecter sa valeur; tandis que si le nombre binaire se termine par '0', alors cette expression se termine par...+-0
ce qui est analysé comme "ajoute un négatif" et supprime ainsi le signe plus final.la source
Matlab, 99 octets
Cas de test:
la source
Haskell,
102918987 octetsDivise à plusieurs reprises par deux et vérifie le bit. Conserve un accumulateur de
i^(number of odds)
oùa+b*i
est codé comme[a,b]
et*i
est[a,b]↦[-b,a]
(rotation de 90 degrés). La première(*2)
est d'éviter une recherche pour le premier bit.Utilisation (merci à @OwenMorgan pour les exemples):
la source
Java, 172 octets
la source
Clojure, 183 octets
Ai-je le droit de faire ça?
Utilisez la fonction comme suit:
la source
En fait , 35 octets
Essayez-le en ligne!
Explication:
Code Python 3 à peu près équivalent:
Essayez-le en ligne!
la source
'0@s
et utiliser``░
pour couper les dernières chaînes vides devrait vous faire économiser quatre octets.Gelée , 10 octets
Ce n'est pas mieux que la réponse de Dennis, mais je voulais quand même tenter ma chance. Suggestions de golf bienvenues! Essayez-le en ligne!
Ungolfing
la source
1 => 1 => 1j
équivaut à2 => 10 => 1 => 1j
.En fait , 15 octets
Suggestions de golf bienvenues! Essayez-le en ligne!
Ungolfing:
la source
Axiom,
140, 131, 118108 octets% i est le client imaginaire.Ungolfed
résultats
la source
Perl 6 ,
4046 octetsJe suis venu avec cela assez rapidement
Malheureusement, il est actuellement inexact dans l' implémentation de Rakudo sur MoarVM .
say i ** 3; # -1.83697019872103e-16-1i
Je devais donc faire la meilleure chose suivante:
Étendu:
Tester:
la source
PHP, 87 octets
Presque identique à la solution ETHproductions´; seulement itératif au lieu de récursif.
Prend les entrées en ligne de commande, définit les variables
${0}
et${1}
.la source
TI-Basic (TI-84 Plus CE), 70 octets
Il n’existe aucune possibilité de convertir une chaîne en binaire (ni d’analyser une chaîne), ce programme est donc divisé en 2 manuellement, incrémentant N chaque fois qu’il voit un 1, ajoutant i ^ N à S (N> 0) et réinitialisant. N s'il voit un zéro.
la source
Java , 100 octets
Essayez-le en ligne!
la source
R , 54 octets
Essayez-le en ligne!
n%/%2^(0:log2(n))%%2
calcule un vecteur des chiffres binaires. En utilisant le codage de longueur d'exécution, nous utilisons lecomplex
type de R pour calculer la somme appropriée, en multipliant par lex$values
pour supprimer les zéros.Retourne un
complex
vecteur d'un élément.la source