Ваша задача довольно проста. Если дано два числа с плавающей запятой, поразрядно xor их двоичное представление и выведите его как число с плавающей запятой.
Например,
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
Ограничения / разъяснение:
- Ввод / вывод может быть дан любым удобным способом .
- Программа может быть полной программой или просто функцией; либо в порядке.
- Тип float может быть любого размера, но минимальный размер составляет 2 байта.
- Стандартные лазейки запрещены.
- Самый короткий код выигрывает.
code-golf
bitwise
floating-point
virchau13
источник
источник
Ответы:
машинный код x86-64, 4 байта
В сборе:
Это вызываемая функция, которая принимает два числа с плавающей запятой или удваивается в качестве аргументов (in
xmm0
иxmm1
) и возвращает число с плавающей запятой или double (inxmm0
).Это соответствует соглашениям о вызовах как Windows x64, так и x86-64 SysV ABI, и работает как с плавающими, так и с двойными числами. (Они передаются / возвращаются в младших 4 или 8 байтах регистров XMM).
источник
C ++ (gcc) ,
7432 байтаПопробуйте онлайн!
Раньше я не играл в гольф на C ++, поэтому я благодарен всем, кто помог уменьшить размер кода вдвое! Макрос, который принимает указатели на два числа с плавающей точкой в качестве аргументов и изменяет первый, чтобы вернуть результат.
Спасибо @ 12Me1 за сохранение 2 байта и @Arnauld за сохранение 4! Спасибо @Nishioka за сохранение еще 14, @Neil еще 6 и @AZTECCO и @Nishioka еще 11! Спасибо @PeterCordes за сохранение 5 байтов!
источник
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;})
Машинный код большого пальца ARM,
64 байта48 40 70 47
В сборе:
Согласно стандартному соглашению о вызове Arm, первые два параметра передаются в регистры R0 и R1, результаты возвращаются в R0, а LR содержит адрес возврата. Предполагая, что вы используете программный интерфейс с плавающей запятой с 32-разрядными числами с плавающей запятой, эта операция будет выполняться в 4 байта.
-2 байта благодаря Коди Грей
источник
EORS r0, r1
вместо этого, чтобы сохранить 2 байта? Это всего лишь 2-байтовая инструкция (48 40
) по сравнению с 4-байтовойEOR
. Вы уже нацеливаетесь на Thumb, так что, насколько я вижу, это должно работать нормально. Разница лишь в том, что он обновляет флаги состояния, но в этом случае вам не нужен этот побочный эффект.s0
иs1
.Python 3 + NumPy,
7559 байтПопробуйте онлайн!
Определяет лямбду, которая принимает в качестве аргументов два массива с массивом float32 и возвращает массив с массивом float32.
Спасибо @ShadowRanger за сохранение 14 байтов, а Джоэлю еще 2!
Если импорт может быть отброшен (так как моя лямбда сама вызывает методы для numpy объектов, а не для любых базовых numpy функций), я мог бы сохранить еще 13 байтов. Я не уверен в этом из кодекса правил игры в гольф.
источник
numpy.float32
s, чтобы вы могли использовать их методы) и заменив обаint32
использования на,'i'
аfloat32
использование на'f'
;dtype
параметр может быть строкой , которая преобразуется в реальномdtype
для вас, и удобно,'i'
и'f'
законные способы , чтобы сделать этот dtypes, что устраняет необходимость в функцию для импортаnumpy
материала в его пространство имен вообще. Не уверен, законно ли Code Golf удалить импорт, но все же предполагаетсяnumpy
f
int32
до'i'
, по четыре отfloat32
до'f'
), но это все еще что-то. Если импорт строго необходим, вы можете просто изменить его,import numpy
чтобы утверждать, что пакет существует, без использованияfrom numpy import*
для извлечения имен из него. Это даст вам еще шесть байтов, всего до 61 байта.Желе + NumPy,
8977 байтПопробуйте онлайн!
Имеет сомнительную честь быть длиннее, чем код Python 3, который он воспроизводит, в основном из-за необходимости конвертировать в / из numpy objecte и того факта, что jelly не загружается Jelly, поэтому необходимо использовать
__import__()
встроенное.Монадическая ссылка, принимающая два числа с плавающей точкой в качестве аргумента и возвращающая число с плавающей точкой.
Оценивает следующий код Python 3:
где
x
иy
подставляются с вводом.источник
APL (Dyalog Unicode) , 14 байтов SBCS
Полная программа. Запрашивает 1-столбцовую матрицу из двух 64-разрядных чисел с плавающей точкой IEEE 754 (binary64) из stdin. Выводит один такой номер на стандартный вывод.
Попробуйте онлайн!
⎕
подсказка (числа, которые сворачиваются в не-числа с плавающей запятой, могут быть переведены в число с плавающей точкой с помощью функции⊃⊢⎕DR⍨645,⍨⎕DR
)11⎕DR
преобразовать в 1-битовой двоичной (1) D ата R epresentation (2-строку, 64-матрица - столбец)≠⌿
вертикальное уменьшение XOR645⎕DR
обращенный к 64-битной плавающей точкой (5) Д ата Р epresentation (единственное число)источник
VAX BASIC (позже VMS BASIC, затем Compaq Basic) , 11 байт
Мне кажется немного глупым, очевидно, что старые языки будут лучше, потому что они не слишком беспокоятся о проблемах со строгой типизацией.
источник
Октава , 59 байт
Попробуйте онлайн!
Typecast - это способ приведения MATLAB / Octave без изменения базовых битов. Это необходимо, потому что
bitxor
работает только на целых числах. Не знаю, почему они никогда не реализовывали числа с плавающей запятой, даже если вы можете явно указать вAssumedType
качестве третьего аргументаbitxor
. Я предполагаю, что единственное использование - рекреационное программирование.источник
exp()
реализации. Но я предполагаю, что у Octave уже есть функции / операторы для copysign и отрицания. И они не заботятся о микрооптимизациях, таких как использование AND (с постоянной маской) и XOR, чтобы условно перевернуть знак одного значения на основе знака другого. В реальном проекте оптимизации в asm (на самом деле C с внутренними AVX) я использовал XOR с плавающей точкой, а затем смотрел на знаковый бит, чтобы избежать cmp против нуля.C # (интерактивный компилятор Visual C #) , 92 байта
Попробуйте онлайн!
источник
Perl 5
-p
,3127 байт-4 байта благодаря Грими
Попробуйте онлайн!
источник
MATL , 10 байт
Попробуйте онлайн!
Расщепление
Z}
было короче, чем два входа,4Z%]
источник
C, 23 байта
Попробуйте онлайн!
Это может быть немного изменчиво; он принимает указатели на
float
s как указатели наint
s.Тем не менее, это работает (это C в конце концов).
Это использует преимущества приемлемого ввода, беря указатель на переменную и модифицируя ее на месте. Нет (полезное) значение не возвращается.
источник
JavaScript (Node.js) ,
105101 байт@Neil предложила более короткую версию узла. С помощью @ShieruAsakoto удалось сохранить еще
4 байта
Принимает вход как
(x)(y)
.Попробуйте онлайн!
JavaScript (ES6), 115 байт
Принимает ввод как массив из 2-х чисел.
Попробуйте онлайн!
источник
Buffer
экономит несколько байт:a=>(v=new Buffer(4),[x,y]=a.map(n=>v.writeFloatLE(n)&&v.readInt32LE()),v.writeInt32LE(x^y),v.readFloatLE())
.map
)new
инnew Buffer(4)
должен также работать IIRCWolfram Mathematica , 50 байтов
Хотя я сильно подозреваю, что это может быть больше в гольфе, два дополнительных аргумента в
RealDigits
функции кажутся необходимыми для получения правильного результата.Попробуйте онлайн!
источник
Луа , 73 байта
Попробуйте онлайн!
Этот код предполагает 4-байтовые целые числа без знака и число с плавающей запятой, на котором выполняется конфигурация
tio.run
. Запустите как полную программу с вводом в качестве аргументов.источник
Рубин ,
7867 байт-11 байт благодаря @grawity.
Попробуйте онлайн!
Ввод представляет собой массив из двух чисел.
источник
x.map{|v|[v].pack(?g).unpack(?N)[0]}
⇒x.pack("gg").unpack("NN")
Java (JDK) ,
10976 байтПопробуйте онлайн!
Прошло какое-то время с тех пор, как я играл в гольф на Java, и я не уверен, что мне нужно объявление о LHS как часть количества байтов? Если бы он использовал DoubleBinaryOperator, LHS был бы короче, но RHS должен был бы использовать Double.doubleToLongBits и Double.longBitsToDouble, так что это на самом деле дольше.
Спасибо Нейлу за значительную экономию на счетчике байтов!
источник
Чисто , 36 байт
Попробуйте онлайн!
К счастью,
Real
иInt
типы одинаковые размеры на 64-битных платформах ...К сожалению , требует полной подпись иначе графа превращается в кренделя и все , что ошибки сегментации.
источник