Эта функция должна принимать четыре целых входа ( a
, b
, c
, d
) и возвращает двоичное слово , на основании которых значения равны максимум четыре.
Возвращаемое значение будет между 1
и 0xF
.
Например:
a = 6, b = 77, c = 1, d = 4
возвращает 2
(двоичный 0010
; устанавливается только 2-й младший значащий бит, соответствующий b
единственному максимальному значению)
a = 4, b = 5, c = 10, d = 10
возвраты 0xC
(двоичные 1100
; биты младших и младших разрядов 3-й и 4-й установлены в соответствии с максимальным значением c
и d
равны ему)
a = 1, b = 1, c = 1, d = 1
возвращает 0xF
(двоичный код 1111
; все четыре бита установлены, поскольку все значения равны максимальному)
Вот простая реализация:
int getWord(int a, int b, int c, int d)
{
int max = a;
int word = 1;
if (b > max)
{
max = b;
word = 2;
}
else if (b == max)
{
word |= 2;
}
if (c > max)
{
max = c;
word = 4;
}
else if (c == max)
{
word |= 4;
}
if (d > max)
{
word = 8;
}
else if (d == max)
{
word |= 8;
}
return word;
}
возвращаемое значение может быть строкой 0 и 1, вектором bool / bit или целым числом
Ответы:
Желе , 2 байта
Принимает вход как
[d,c,b,a]
. Возвращает список логических значений.Попробуйте онлайн!
Ṁ
M aximum=
равно (подразумевает, что другой аргумент является исходным аргументом; векторизация)источник
R , 17 байт
Попробуйте онлайн!
Возвращает вектор логических значений. Поскольку этот вывод был подтвержден, это предпочтительнее, чем числовой, так как он почти вдвое длиннее:
R , 33 байта
Попробуйте онлайн!
источник
APL (Dyalog Unicode) , 4 байта SBCS
Функция анонимного молчаливого префикса. Принимает в
[a,b,c,d]
качестве аргумента. Возвращает битовый логический массив. *Попробуйте онлайн!
⌈/
Максимум аргумента=
равный (векторизация)⌽
обратная сторона аргумента?* Обратите внимание, что APL хранит массивы логических значений, используя один бит на значение, так что это действительно возвращает 4-битное слово, несмотря на то, что форма отображения
0 0 1 0
.источник
Haskell ,
2018 байтов2 байта сохранены благодаря гордому haskeller
Попробуйте онлайн!
источник
map
вместо(<$>)
будет на два байта короче!Perl 6 , 12 байт
Попробуйте онлайн!
Блок анонимного кода, который принимает список целых чисел и возвращает список логических значений. Если нам нужно вернуть как число, это +4 байта, чтобы обернуть внутреннюю часть блока кода
2:[...]
.Объяснение:
источник
Джапт, 5
Попробуй это!
-4 байта благодаря @Oliver!
-2 байта благодаря @Shaggy!
Input представляет собой массив из 4 элементов в следующем формате:
Вывод представляет собой массив битов.
источник
rw
преобразуется вr("w")
сокращение, постоянно получая максимум. То же самое сm¶
превращением вU.m("===", ...)
. В любом случае спасибо за советы!машинный код x86 (MMX / SSE1), 26 байт (4x int16_t)
машинный код x86 (SSE4.1), 28 байт (4x int32_t или uint32_t)
машинный код x86 (SSE2), 24 байта (4x float32) или 27B для cvt int32
(Последняя версия, которая конвертирует int32 в число с плавающей точкой, не совсем точна для больших целых чисел, округляющих до одного и того же числа с плавающей запятой. При вводе с плавающей точкой округление является проблемой вызывающей стороны, и эта функция работает правильно, если нет NaN, идентифицируя числа с плавающей запятой, которые сравнивают == до максимума. Целочисленные версии работают для всех входных данных, рассматривая их как дополнение к знаку 2.)
Все они работают в 16/32/64-битном режиме с одинаковым машинным кодом.
Соглашение о вызове стековых аргументов позволит дважды циклически перебирать аргументы (находить max и затем сравнивать), возможно, давая нам меньшую реализацию, но я не пробовал такой подход.
x86 SIMD имеет вектор-> целочисленное растровое изображение в виде одной инструкции (
pmovmskb
илиmovmskps
или pd), поэтому это было естественно для этого, даже если инструкции MMX / SSE имеют длину не менее 3 байтов. SSSE3 и более поздние инструкции длиннее, чем SSE2, а MMX / SSE1 - самые короткие. Различные версииpmax*
(максимум упакованного целого по вертикали) были представлены в разное время, причем SSE1 (для регистров mmx) и SSE2 (для регистров xmm) имели только знаковое слово (16-битное) и байт без знака.(
pshufw
иpmaxsw
в MMX регистры являются новыми с Katmai Pentium III, поэтому на самом деле они требуют SSE1, а не только бит функции MMX CPU).Это вызывается из C, как
unsigned max4_mmx(__m64)
и для i386 System V ABI, который передает__m64
аргументmm0
. (Не x86-64 System V, которая проходит__m64
вxmm0
!)Если бы был
pmovmskw
, что бы спаслоpacksswb
и иand
(3 + 2 байта). Нам не нужно,and eax, 0x0f
потому чтоpmovmskb
в регистре MMX уже нули старшие байты. Регистры MMX имеют ширину всего 8 байтов, поэтому 8-битный AL охватывает все возможные ненулевые биты.Если бы мы знали, что наши входные данные были неотрицательными, мы могли
packsswb mm1, mm0
бы производить неотрицательные подписанные байты в верхних 4 байтахmm1
, избегая необходимостиand
послеpmovmskb
. Таким образом, 24 байта.Пакет x86 с насыщением со знаком обрабатывает ввод и вывод как подписанный, поэтому он всегда сохраняет знаковый бит. ( https://www.felixcloutier.com/x86/packsswb:packssdw ). Интересный факт: пакет x86 с насыщением без знака все еще обрабатывает ввод как подписанный. Это может быть причиной того, что
PACKUSDW
не было введено до SSE4.1, в то время как другие 3 комбинации размера и подписи существовали со времен MMX / SSE2.Или с 32-разрядными целыми числами в регистре XMM (и
pshufd
вместоpshufw
) каждой инструкции потребуется еще один байт префикса, за исключениемmovmskps
замены пакета / и. Ноpmaxsd
/pmaxud
нужен дополнительный дополнительный байт ...вызывается из C, как
unsigned max4_sse4(__m128i);
и в x86-64 System V, или в MSVC vectorcall (-Gv
), оба из которых передают__m128i
/__m128d
/__m128
args в регистрах XMM, начиная сxmm0
.Или, если мы принимаем ввод как
float
, мы можем использовать инструкции SSE1.float
Формат может представлять собой широкий диапазон целочисленных значений ...Или, если вы думаете, что это слишком сильно
0F 5B C0 cvtdq2ps xmm0, xmm0
нарушает правила, начните с 3-байтового преобразования, создав 27-байтовую функцию, которая работает для всех целых чисел, которые точно представлены в виде двоичного кода IEEE32float
, и многих комбинаций входных данных, где некоторые входные данные получают округляется до кратного 2, 4, 8 или любого другого значения во время преобразования. (Таким образом, он на 1 байт меньше, чем версия SSE4.1, и работает на любом x86-64 только с SSE2.)Если какой-либо из входных данных с плавающей запятой равен NaN, обратите внимание, что он
maxps a,b
точно реализуется(a<b) ? a : b
, сохраняя элемент из второго операнда в неупорядоченном виде . Таким образом, для этого может быть возможно возвращение с ненулевым растровым изображением, даже если вход содержит некоторое NaN, в зависимости от того, где они находятся.unsigned max4_sse2(__m128);
copy-and-shuffle с
pshufd
- все еще наша лучшая ставка:shufps dst,src,imm8
считывает ввод для нижней половиныdst
изdst
. И нам нужно неразрушающее копирование и перемешивание оба раза, так что 3-байтmovhlps
иunpckhps
/ pd оба отсутствуют. Если бы мы сужались до скалярного максимума, мы могли бы использовать их, но для трансляции перед сравнением стоит другая инструкция, если у нас уже нет максимума во всех элементах.Связано: SSE4.1
phminposuw
может найти положение и значение минимумаuint16_t
в регистре XMM. Я не думаю, что было бы выгодно вычесть из 65535, чтобы использовать его для max, но вижу SO-ответ об использовании его для max байтов или целых чисел со знаком.источник
Python 3.8 (предварительная версия) , 67 байт
Лямбда-функция, которая принимает 4 целых числа, немного сдвигает логический результат их сравнения до максимального значения с помощью нового оператора присваивания в Python 3.8 и возвращает побитовое ИЛИ результатов
Попробуйте онлайн!
источник
Java (JDK) , 78 байт
Попробуйте онлайн!
[a,b,c,d]
.источник
05AB1E ,
32 байтаВвод в виде списка
[d,c,b,a]
, вывод в виде списка логических.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
JavaScript (ES6), 30 байт
Принимает вход как
([d,c,b,a])
. Возвращает 4 логических значения.Попробуйте онлайн!
источник
Рубин ,
3422 байтаПринимает ввод как массив
[d, c, b, a]
и возвращает массив 1 и 0.Попробуйте онлайн!
источник
Python 3 ,
59 байт,66 байтПопробуйте онлайн!
Принимает ввод как
[a,b,c,d]
и выводит список логических значений.Отредактированный, чтобы быть надлежащей функцией, затем спас 2 байта, удаляя скобки вокруг условного.
источник
1. Python 3.5, 90 байт
Принимает последовательность чисел в качестве параметров. Возвращает "двоичную" строку
пример:
объяснение
источник
C # (интерактивный компилятор Visual C #) , 26 байт
Попробуйте онлайн!
Принимает ввод в формате
[d,c,b,a]
. Все остальные внизу воспринимают как[a,b,c,d]
C # (интерактивный компилятор Visual C #) , 35 байт
Возвращает
IEnumerable<bool>
.Попробуйте онлайн!
C # (интерактивный компилятор Visual C #) , 39 байт
Возвращает
IEnumerable<int>
, которые представляют биты.Попробуйте онлайн!
C # (интерактивный компилятор Visual C #) , 49 байт
Печатает двоичную строку в STDOUT.
Попробуйте онлайн!
источник
IEnumerable<bool>
является приемлемым.PHP, 54 байта
или
принимать входные данные из аргументов командной строки. Запустите
-nr
или попробуйте их онлайн .источник
Вот версия JS, которая выводит как двоичный файл
обновление: короче с объединением и без поиска:
JavaScript (Node.js) , 42 байта
Попробуйте онлайн!
Предыдущая, с поиском, 49 байтов
Попробуйте онлайн!
Предыдущий, с уменьшением, 52 байта:
Попробуйте онлайн!
источник
[0,1][...]
так как вы используете индекс, который ужеC # (интерактивный компилятор Visual C #) , 51 байт
Попробуйте онлайн!
Выше приведена анонимная функция, которая выводит путем изменения аргумента . Вывод представляет собой массив из 1 и 0.
Ниже приведена рекурсивная функция, которая выводит целое число.
C # (интерактивный компилятор Visual C #) , 60 байт
Попробуйте онлайн!
Обе функции принимают входные данные как массив из 4 элементов.
источник
Python 2 , 35 байт
Попробуйте онлайн!
Принимает данные в формате [d, c, b, a], как с принятым ответом от Адама так что я думаю, что все в порядке.
Альтернатива для 41, если это не ...
Python 2 , 41 байт
Попробуйте онлайн!
источник
Python 3 , 42 байта
Просто возвращает список того, является ли элемент максимальным для каждого элемента на входе. -2 байта, если вы не считаете
f=
назначение.Попробуйте онлайн!
источник
f=
не учитывается, за исключением рекурсивных функцийПакет, 92 байта
Принимает аргументы в качестве параметров командной строки в обратном порядке. Работает, арифметически вычисляя максимум параметров, уменьшая их и добавляя только положительные отличия от рабочего максимума, а затем снова сопоставляя каждый параметр, сравнивая его с максимумом. Удобно
cmd/cset/a
не выводить новую строку, поэтому результаты автоматически объединяются вместе.%f%
Просто сохраняет 5 байт на то , что будет повторена конструкция.источник