Проблема:
Найти число лидирующих нулей в 64-разрядном целом числе со знаком
Правила:
- Ввод не может рассматриваться как строка; это может быть что угодно, где математические и побитовые операции управляют алгоритмом
- Вывод должен быть проверен на соответствие 64-битному целому числу со знаком, независимо от языка
- Применяются правила игры в гольф по умолчанию
- Самый короткий код в байтах выигрывает
Тестовые случаи:
Эти тесты предполагают два дополненных числа со знаком. Если в вашем языке / решении отсутствует или используется другое представление целых чисел со знаком, сообщите об этом и предоставьте дополнительные тестовые примеры, которые могут иметь отношение к делу. Я включил несколько тестов, которые касаются двойной точности, но, пожалуйста, не стесняйтесь предлагать любые другие, которые должны быть перечислены.
input output 64-bit binary representation of input (2's complement)
-1 0 1111111111111111111111111111111111111111111111111111111111111111
-9223372036854775808 0 1000000000000000000000000000000000000000000000000000000000000000
9223372036854775807 1 0111111111111111111111111111111111111111111111111111111111111111
4611686018427387903 2 0011111111111111111111111111111111111111111111111111111111111111
1224979098644774911 3 0001000011111111111111111111111111111111111111111111111111111111
9007199254740992 10 0000000000100000000000000000000000000000000000000000000000000000
4503599627370496 11 0000000000010000000000000000000000000000000000000000000000000000
4503599627370495 12 0000000000001111111111111111111111111111111111111111111111111111
2147483648 32 0000000000000000000000000000000010000000000000000000000000000000
2147483647 33 0000000000000000000000000000000001111111111111111111111111111111
2 62 0000000000000000000000000000000000000000000000000000000000000010
1 63 0000000000000000000000000000000000000000000000000000000000000001
0 64 0000000000000000000000000000000000000000000000000000000000000000
False
вместо0
?Ответы:
машинный язык x86_64 в Linux, 6 байт
Требуется процессор Haswell или K10 или выше с
lzcnt
инструкцией.Попробуйте онлайн!
источник
Гексагония ,
7870 байтПопробуйте онлайн!
Разве этот вызов не слишком тривиален для практического языка? ;)
длина стороны 6. Я не могу вписать это в длину стороны 5 шестиугольников.
объяснение
источник
Python , 31 байт
Попробуйте онлайн!
Экспрессон является побитовым
&
из двух частей:Это
67-len(bin(-n))
дает правильный ответ для неотрицательных входных данных. Он берет длину в битах и вычитает из 67, что на 3 больше, чем 64, чтобы компенсировать-0b
префикс. Отрицание - это трюк, который нужно приспособить дляn==0
использования того, что отрицание не производит-
знак впереди.& ~n>>64
Делает ответ вместо этого0
для негативаn
. Когдаn<0
,~n>>64
равно 0 (на 64-битных целых числах), то и с ним дает0
. Когдаn>=0
,~n>>64
оценивает-1
, и выполнение не&-1
имеет никакого эффекта.Python 2 , 36 байт
Попробуйте онлайн!
Арифметическая альтернатива.
источник
Ява 8,
3226 байт.Long::numberOfLeadingZeros
Встроенные FTW.
-6 байт благодаря Кевину Круйссену
Попробуйте онлайн!
источник
numberOfLeadingZeros
.. Вы можетеn->n.numberOfLeadingZeros(n)
Long::numberOfLeadingZeros
еще короче (26 байт).C (gcc) , 14 байтов
Отлично работает на тио
C (gcc) ,
3529 байтПопробуйте онлайн!
Чем Деннис за 6 байтов
Флаги компилятора C (gcc) , 29 байт, Дэвид Фёрстер
Попробуйте онлайн!
источник
__builtin_clzl
с которым я могу придумать .long
32- битная версия (включая Windows x64), вам нужна__builtin_clzll
(unsigned long long). godbolt.org/z/MACCKf . (В отличие от встроенных функций Intel, встроенные функции GNU C поддерживаются независимо от того, какую операцию можно выполнить с одной машинной инструкцией. В 32-разрядной версии x86 clzll компилируется в ветвь или cmov, чтобы выполнитьlzcnt(low half)+32
илиlzcnt(high half)
. Или,bsr
еслиlzcnt
не доступно.__builtin_clz(l)(l)
неопределенное поведение для нуля: «Если х равен 0, результат не определен».Perl 6 ,
35 2826 байт-2 байта благодаря nwellnhof
Попробуйте онлайн!
Блок анонимного кода, который принимает число и возвращает число. Это преобразует число в двоичную строку и считает начальные нули. Это работает для отрицательных чисел, потому что первый символ,
-
например-00000101
, так что нет начальных нулей.Объяснение:
источник
JavaScript (Node.js) , 25 байт
Принимает входные данные как литерал BigInt.
Попробуйте онлайн!
источник
n=>n<1?0:n.toString(2)-64
выполнять то же самое?n=>n<1?0:n.toString(2).length-64
, но это не сработало бы в любом случае. Это было бы , я думаю..toString()
Подход действительно работает, но нам все еще нужен литерал BigInt в качестве входных данных. В противном случае у нас есть только 52 бита мантиссы, что приводит к неверным результатам, когда точность теряется .Python 3 , 34 байта
Попробуйте онлайн!
источник
J , 18 байт
Попробуйте онлайн!
J , 19 байт
Попробуйте онлайн!
Объяснение:
источник
1#.[:*/\1-_64{.#:
(17) близко, но не работает для отрицательных чисел :(Perl 6 , 18 байт
-2 байта благодаря Джо Кингу
Попробуйте онлайн!
источник
Рубин , 22 байта
Попробуйте онлайн!
источник
05AB1E ,
109 байтовI / O оба целые
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Haskell , 56 байт
Спасибо xnor за обнаружение ошибки!
Выделите достаточно памяти, попробуйте онлайн!
Может быть, вы хотите проверить это с меньшей константой: попробуйте 8-бит!
объяснение
mapM(pure[0,1])[1..64]
mapM(pure[1,0])[1..64]
sum.fst.span(>0)
источник
Powershell, 51 байт
Тестовый скрипт:
Выход:
источник
Java 8, 38 байт
Ввести как
long
(64-разрядное целое), вывести какint
(32-разрядное целое).Порт ответа @ l4m2 C (gcc) .
Попробуйте онлайн.
Объяснение:
РЕДАКТИРОВАТЬ: может быть 26 байтов с помощью встроенного,
Long::numberOfLeadingZeros
как показано в ответе @lukeg Java 8 .источник
APL + WIN, 34 байта
Объяснение:
источник
C # (интерактивный компилятор Visual C #) , 42 байта
Попробуйте онлайн!
C # (интерактивный компилятор Visual C #) , 31 байт
Еще короче, основываясь на ответе C (gcc) @ l4m2. Никогда не знал, что можно объявить такие функции, спасибо @Dana!
Попробуйте онлайн!
источник
Желе ,
109 байт-1 благодаря изящному трюку Эрика Аутгольфера (теперь он неотрицателен
AƑ
)Монадическая ссылка, принимающая целое число (в пределах диапазона), которое дает целое число.
Попробуйте онлайн! Или посмотрите набор тестов .
10 было
ḤBL65_ɓ>-×
Вот еще одно 10-байтовое решение, которое мне нравится, так как оно говорит, что это «BOSS» ...
Тест-сьют здесь
...
BoṠS63r0¤i
,BoṠS63ŻṚ¤i
илиBoṠS64ḶṚ¤i
будет также работать.Еще 10 байтов (от Дениса) есть
æ»64ḶṚ¤Äċ0
(опятьæ»63r0¤Äċ0
иæ»63ŻṚ¤Äċ0
тоже будет работать)источник
Ƒ
быстрой, очень хорошей работе!AƑ
уже довольно давно . Имейте в виду, что это не векторизация! ;-) Это на самом деле "сгладить, а затем проверить, все ли элементы неотрицательны".Perl 5 , 37 байт
Попробуйте онлайн!
Или это 46 байтов, если «stringification» не допускается: sub z
источник
s/length$&/$+[0]/
(-3 байта);)sub
ключевое слово из ответов, содержащих функции Perl 5.sub
в ответах для других языков, perl6, powershell и других.sub{}
создавать подпункт (аноним?), Который объясняет, почему он опущен в ответах Perl6. Я согласен с @nwellnhof, что вам нельзя разрешать удалятьsub
. (когда я был еще активен, как год назад или около того, это было правилом)$+[0]
.Swift (на 64-битной платформе), 41 байт
Объявляет вызванное замыкание,
f
которое принимает и возвращаетInt
. Это решение работает только правильно 64-разрядные платформы, гдеInt
находитсяtypealias
ЭдаInt64
. (На 32-битной платформеInt64
может использоваться явно для типа параметра замыкания, добавляя 2 байта.)В Swift даже основной целочисленный тип является обычным объектом, объявленным в стандартной библиотеке. Это средство
Int
может иметь методы и свойства, такие какleadingZeroBitCount
(что требуется для всех типов, соответствующихFixedWidthInteger
протоколу стандартной библиотеки ).источник
Haskell , 24 байта
Попробуйте онлайн!
По сути, это то же самое, что и Java-решение Кевина Круйссена, но я нашел его независимо.
Аргумент должен иметь тип
Int
для 64-битной сборки илиInt64
для чего угодно.объяснение
Если аргумент отрицательный, результат сразу равен 0. В противном случае мы сдвигаемся влево, заполняя единицы , пока не достигнем отрицательного числа. Это заполнение позволяет нам избежать специального случая для 0.
Просто для справки, вот очевидный / эффективный способ:
34 байта
источник
Чистый , 103 байта
Использует то же «встроенное», что и потолочный ответ.
Попробуйте онлайн!
Чистый , 58 байт
Попробуйте онлайн!
источник
Stax , 10 байт
Запустите и отладьте его
Это порт решения Кевина 05AB1E.
источник
Perl 5
-p
, 42 байтаПопробуйте онлайн!
Больше, чем решение на основе цепочек, но достойное математическое решение.
источник
int
звонок, который должен решить проблему.APL (NARS), 15 символов, 30 байтов
проверить несколько номеров, чтобы увидеть, как использовать:
источник
Ржавчина, 18 байт
Попробуйте онлайн!
источник
K (нгн / к) , 6 байтов
Попробуйте онлайн!
2\
закодировать аргумент в двоичном#
длина64-
вычесть из 64источник
# = length
... выглядит на основе строки2\
дает список целых чисел и#
находит его длину. здесь не задействованы никакие строки.PHP,
5046 байтЗапустите как трубу
-R
или попробуйте онлайн ,<?=$argn<0?0:0|64-log($argn+1,2);
имеет проблемы с округлением; так что я прошел долгий путь.источник
Wolfram Language (Mathematica) , 41 байт
Формула для положительных чисел просто
63-Floor@Log2@#&
. Правила замены используются для особых случаев нулевого и отрицательного ввода.Входные данные не должны быть 64-разрядным целым числом со знаком. Это эффективно займет слово ввода, чтобы превратить его в целое число. Если вы введете число вне нормальных границ для 64-разрядного целого числа, оно сообщит, что возвращает отрицательное число, указывающее, сколько еще битов потребуется для хранения этого целого числа.
Попробуйте онлайн!
Решение @ LegionMammal978 немного короче - 28 байтов. Ввод должен быть целым числом. Согласно документации: «
BitLength[n]
эффективно эффективная версияFloor[Log[2,n]]+1
». Он автоматически обрабатывает случай, когда0
вместо отчета правильно сообщается ноль-∞
.Wolfram Language (Mathematica) , 28 байт
Попробуйте онлайн!
источник
Boole[#>=0](64-BitLength@#)&
немного короче на 28 байтов. Он использует ту же основную концепцию, что и ваша, но применяетсяBitLength
иBoole
.bitNumber - math.ceil (math.log (number) / math.log (2))
например, 64-битный NUMBER: 9223372036854775807 math.ceil (math.log (9223372036854775807) / math.log (2)) ANS: 63
источник