Votre tâche est assez simple. Étant donné deux flottants, x ou leur représentation binaire au niveau du bit, et affichez-les comme un flottant.
Par exemple,
Normal: 16.7472 ^ 123.61 = 7.13402e-37
Binary: 01000001100001011111101001000100 ^ 01000010111101110011100001010010 = 00000011011100101100001000010110
Normal: 2.2 ^ 4.4 = 1.17549e-38
Binary: 01000000000011001100110011001101 ^ 01000000100011001100110011001101 = 00000000100000000000000000000000
Normal: 7.898 ^ 3.4444 = 1.47705e-38
Binary: 01000000111111001011110001101010 ^ 01000000010111000110101001111111 = 00000000101000001101011000010101
Restrictions / clarifications:
- L'entrée / sortie peut être donnée par n'importe quelle méthode pratique .
- Le programme peut être un programme complet ou simplement une fonction; n'importe quel.
- Le type flottant peut être de n'importe quelle taille, mais la taille minimale est de 2 octets.
- Les failles standard sont interdites.
- Le code le plus court gagne.
code-golf
bitwise
floating-point
virchau13
la source
la source
Réponses:
code machine x86-64, 4 octets
En montage:
Il s'agit d'une fonction appelable qui prend deux flottants ou doubles comme arguments (dans
xmm0
etxmm1
) et renvoie un flottant ou double (dansxmm0
).Cela correspond aux conventions d'appel de Windows x64 et de l'Axe SysV x86-64, et fonctionne pour les flottants ainsi que pour les doubles. (Ils sont passés / retournés dans les 4 ou 8 octets les plus bas des registres XMM).
la source
C ++ (gcc) ,
7432 octetsEssayez-le en ligne!
Je n'ai jamais joué au golf en C ++ donc je suis reconnaissant à tous ceux qui ont aidé à réduire de moitié la taille du code! Une macro qui prend des pointeurs sur deux flottants comme arguments et modifie le premier pour renvoyer le résultat.
Merci à @ 12Me1 pour avoir sauvé 2 octets et @Arnauld pour en avoir sauvé 4! Merci à @Nishioka pour avoir sauvé 14 autres, @Neil 6 autres et @AZTECCO et @Nishioka 11 autres! Merci à @PeterCordes pour avoir économisé 5 octets!
la source
z=*(int*)x^*(int*)y;
.#define f(x,y)({int z=*(int*)x^*(int*)y;*(float*)&z;})
(*(int*)x^=*(int*)y)
.#define f(x,y)({*(int*)x^=*(int*)y;*(float*)x;})
Code ARM Thumb Machine,
64 octets48 40 70 47
En montage:
Selon la convention d'appel standard Arm, les deux premiers paramètres sont passés dans les registres R0 et R1, les résultats sont retournés dans R0 et LR contient l'adresse de retour. En supposant que vous utilisez le soft float ABI avec des flottants 32 bits, cela effectuera l'opération souhaitée en 4 octets.
-2 octets grâce à Cody Gray
la source
EORS r0, r1
place, afin d'économiser 2 octets? Ce n'est qu'une instruction de 2 octets (48 40
), par rapport à votre 4 octetsEOR
. Vous ciblez déjà Thumb, donc cela devrait fonctionner correctement, autant que je sache. La seule différence est qu'il met à jour les indicateurs de statut, mais vous ne vous souciez pas de cet effet secondaire dans ce cas.s0
ets1
.Python 3 + numpy,
7559 octetsEssayez-le en ligne!
Définit un lambda qui prend deux tableaux numpy float32 comme arguments et renvoie un tableau numpy float32.
Merci à @ShadowRanger pour avoir sauvé 14 octets, et à Joel 2 autres!
Si l'importation peut être abandonnée (puisque mon lambda lui-même appelle des méthodes sur des objets numpy plutôt que sur des fonctions numpy de base), je pourrais économiser 13 octets supplémentaires. Je ne suis pas sûr à ce sujet des règles standard du code de golf.
la source
numpy.float32
afin que vous puissiez utiliser leurs méthodes) et en remplaçant les deuxint32
utilisations par'i'
et l'float32
utilisation avec'f'
; ledtype
paramètre peut être une chaîne qui est convertie en réeldtype
pour vous, et de manière pratique,'i'
et'f'
sont des moyens légaux de créer ces dtypes, ce qui supprime la nécessité pour la fonction d'importer desnumpy
éléments dans son espace de noms. Je ne sais pas si le code Golf est légal pour supprimer l'importation, mais suppose toujours desnumpy
entrées ...f
int32
à'i'
, quatre defloat32
à'f'
), mais c'est toujours quelque chose. Si l'importation est strictement requise, vous pouvez simplement la modifierimport numpy
pour affirmer que le package existe, sans utiliserfrom numpy import*
pour en extraire des noms. Cela vous donnerait encore six octets, jusqu'à 61 octets au total.Gelée + numpy,
8977 octetsEssayez-le en ligne!
A l'honneur douteux d'être plus long que le code Python 3 qu'il reproduit, en grande partie à cause de la nécessité de convertir vers / à partir de numpy objecte et du fait que numpy n'est pas chargé par Jelly donc le
__import__()
intégré doit être utilisé.Un lien monadique prenant les deux flottants comme liste comme argument et renvoyant un flottant.
Évalue le code Python 3 suivant:
où
x
ety
sont remplacés par l'entrée.la source
APL (Dyalog Unicode) , 14 octets SBCS
Programme complet. Demande une matrice à 1 colonne de deux nombres à virgule flottante 64 bits IEEE 754 (binaire64) de stdin. Imprime un de ces nombres sur la sortie standard.
Essayez-le en ligne!
⎕
invite (les nombres qui se réduisent à des non-flottants peuvent être forcés en flottants avec la fonction⊃⊢⎕DR⍨645,⍨⎕DR
)11⎕DR
convertir en binaire 1 bit (1) Représentation D ata R (matrice à 2 lignes et 64 colonnes)≠⌿
réduction XOR verticale645⎕DR
convertir en float 64 bits (5) Représentation D ata R (nombre unique)la source
VAX BASIC (plus tard VMS BASIC, puis Compaq Basic) , 11 octets
Cela me semble un peu idiot, évidemment, les anciennes langues feront mieux parce qu'elles ne se préoccupaient pas autant des problèmes de frappe forte.
la source
Octave , 59 octets
Essayez-le en ligne!
Typecast est la manière MATLAB / Octave de caster sans changer les bits sous-jacents. Ceci est nécessaire car
bitxor
ne fonctionne que sur des entiers. Aucune idée pourquoi ils n'ont jamais implémenté de nombres à virgule flottante, même si vous pouvez explicitement spécifier leAssumedType
comme troisième argument debitxor
. Je suppose que la seule utilisation est la programmation récréative.la source
exp()
implémentation. Mais je suppose qu'Octave a déjà des fonctions / opérateurs pour la copie et la négation. Et ils ne se soucient pas des micro-optimisations comme l'utilisation de AND (avec un masque constant) puis de XOR pour inverser conditionnellement le signe d'une valeur en fonction du signe d'une autre. Dans un vrai projet d'optimisation en asm (en fait C avec intrinsèques AVX), j'ai utilisé XOR de flottants puis en regardant le bit de signe pour éviter cmp contre zéro.C # (compilateur interactif Visual C #) , 92 octets
Essayez-le en ligne!
la source
Perl 5
-p
,3127 octets-4 octets grâce à Grimy
Essayez-le en ligne!
la source
MATL , 10 octets
Essayez-le en ligne!
La séparation avec
Z}
était plus courte que la prise de deux entrées,4Z%]
la source
C, 23 octets
Essayez-le en ligne!
Cela pourrait être un peu sournois; il prend les pointeurs vers
float
s comme pointeurs versint
s.Cependant, cela fonctionne (c'est C après tout).
Cela profite d'une entrée acceptable en prenant un pointeur sur la variable et en la modifiant en place. Aucune valeur (utilisable) n'est retournée.
la source
JavaScript (Node.js) ,
105101 octetsVersion plus courte du nœud proposée par @Neil
Économise 4 octets supplémentaires grâce à @ShieruAsakoto
Prend l'entrée comme
(x)(y)
.Essayez-le en ligne!
JavaScript (ES6), 115 octets
Prend l'entrée comme un tableau de 2 flottants.
Essayez-le en ligne!
la source
Buffer
enregistre quelques octets:a=>(v=new Buffer(4),[x,y]=a.map(n=>v.writeFloatLE(n)&&v.readInt32LE()),v.writeInt32LE(x^y),v.readFloatLE())
.map
)new
dansnew Buffer(4)
doit aussi travailler IIRCWolfram Mathematica , 50 octets
Bien que je soupçonne fortement que cela pourrait être plus joué, les deux arguments supplémentaires en
RealDigits
fonction semblent être nécessaires pour obtenir un résultat correct.Essayez-le en ligne!
la source
Lua , 73 octets
Essayez-le en ligne!
Ce code suppose des entiers non signés de 4 octets et des flottants sur lesquels la configuration est activée
tio.run
. Exécuter en tant que programme complet avec entrée comme arguments.la source
Rubis ,
7867 octets-11 octets grâce à @grawity.
Essayez-le en ligne!
L'entrée est un tableau de deux flottants.
la source
x.map{|v|[v].pack(?g).unpack(?N)[0]}
⇒x.pack("gg").unpack("NN")
Java (JDK) ,
10976 octetsEssayez-le en ligne!
Cela fait un moment que je n'ai pas joué au golf à Java et je ne sais pas si j'ai besoin de la déclaration sur le LHS dans le cadre du décompte d'octets? S'il utilisait DoubleBinaryOperator, le LHS serait plus court, mais le RHS devrait utiliser Double.doubleToLongBits et Double.longBitsToDouble, donc c'est en fait plus long.
Merci à Neil pour une économie substantielle sur le nombre d'octets!
la source
Nettoyer , 36 octets
Essayez-le en ligne!
Heureusement, les types
Real
etInt
sont de la même taille sur les plates-formes 64 bits ...Malheureusement, nécessite une signature complète, sinon le graphique se transforme en bretzel et tout segfaults.
la source