Учитывая целое число в диапазоне 0 <= n < 2**64
, выведите контейнер минимального размера, в который он может поместиться
- бит: 1
- клев: 4
- байт: 8
- коротко: 16
- int: 32
- длинный: 64
Testcases:
0 -> 1
1 -> 1
2 -> 4
15 -> 4
16 -> 8
123 -> 8
260 -> 16
131313 -> 32
34359750709 -> 64
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
2
был выход ...Ответы:
05AB1E , 10 байтов
объяснение
Попробуйте онлайн!
источник
Python, 39 байт
Подсчитывает, сколько раз нужно взять квадратный корень,
n
чтобы оказаться ниже16
, с некоторым специальным регистром, чтобы избежать выводов 2.Если бы 2 были включены, мы могли бы сделать
с True для 1.
41 байт:
Неоднократно удваивает показатель степени
i
до2**i>n
. Переходит отi=1
кi=4
, сдвигая дополнительный бит, когдаi
нечетно.Alt 45 байт:
источник
1
когда квадратный корень из 0 или 1 всегда равен 1 (бесконечная рекурсивность вor 2*f(n**.5)
)?or
оценивается, только если часть до оценивается как нечто ложное (ноль). Для n = 0 и для n = 1n>1
оценивается какFalse
, что рассматривается как ноль в числовом выражении, иn<16
оценивается какTrue
, что рассматривается как единица в числовом выражении. Так4**(n>1)*(n<16)
что 1.J, 19 байт
Монадический глагол, берущий число справа и выплевывающий размер контейнера. Есть несколько эквивалентных способов написания, поэтому я включил оба.
Объяснил взрывом:
Круто, что мы видим два разных способа получения логарифмической базы 2 в J. Первый - очевидный
2^.
, то есть числовой логарифм. Второй#@#:
, который может быть прочитан как «длина представления base-2». Это почти эквивалентно одному-плюс-пол-журнала-базы-2, за исключением того, что#:0
это список из одного элемента0
, который именно то, что мы хотим. Это бьет1+2<.@^.1&>.
на 8 байтов.Используется в REPL:
Старое, слишком умное 20-байтовое решение.
источник
Python,
535049 байтовисточник
lambda n:[w for w in[1,4,8,16,32,64]if n<2**w][0]
на один байт корочеMathematica,
443938 байтСпасибо @orlp за 5 байт и @MartinEnder за 1 байт.
Находит сначала элементы в списке
{1, 4, 8, 16, 32, 64}
, так что число 2 ^ больше, чем вход.источник
Пип , 19 байт
Попробуйте онлайн!
Как это устроено
источник
JavaScript (ES7), 35 байт
источник
f=(n,b=1)=>2**b>n&&b-2?b:f(n,b*2)
должна быть немного короче.Mathematica,
464338 байтСпасибо JungHwan Min и Martin Ender за сохранение 3 байтов! Спасибо ngenisis за большую 5-байтовую экономию!
Безымянная функция, принимающая неотрицательное целое число в качестве входных данных и возвращающая положительное целое число.
BitLength@#
вычисляет количество бит на входе, а затем2^⌈Log2@...⌉
вычисляет наименьшую степень 2, которая, по крайней мере, равна количеству бит. Наконец,/.{2->4,0->1}
заботится о специальном случае, когда между битом и nybble нет «ниблита», а также исправляет ответ для странного ввода0
.источник
BitLength@#
вместо⌊1+Log2@#⌋
. Тогда вместо того , чтобы заменить∞
с1
вами можно заменить0
, экономя еще 2 байта , и вы привязаны к первому.BitLength
. Смотрите мой ответЮлия, 40 байт
Это анонимная функция, которая генерирует массив степеней 2 от 0 до 6, исключая 2, и фильтрует его только по тем элементам x , что 2 x больше, чем вход. Первый такой элемент - это ответ. К сожалению, это требует повышения 2 до a,
BigInt
чтобы избежать переполнения при x = 64.На самом деле это очень похоже на Python-ответ orlp, хотя я не видел его до того, как придумал этот подход.
Попробуйте онлайн!
источник
Perl 6 , 30 байт
+<
является оператором сдвига левого бита в Perl 6, который многие другие языки называют<<
.источник
Haskell, 31 байт
32-байтный alt:
источник
Java, 143 байта.
источник
return a<2?1:a<5?4:a<9?8:a<17?16:a<33?32:64;
Haskell, 43 байта
источник
Рубин,
3936 байтСпасибо ГБ за помощь в гольфе
источник
Java 8,
6555 байтЭто лямбда-выражение, которое принимает
long
и возвращаетint
. Никогда не играл в гольф на Java раньше, так что это легко победить:Попробуйте онлайн!
Для 47 байтов мы могли бы иметь:
Тем не менее,
1L<<i
переполнения для возвращаемых значений больше 32, так что это не удается для окончательного теста.источник
4
когда проверяется с,16
когда предполагается, что он вернется 8. Также вы можете по-прежнему играть в гольф это решение, сняв скобки,i<<=1+i%2;
поскольку без{}
s цикл while будет выполнять только следующую строкуMathematica, 30 байт
Объяснение:
Позвольте
N
быть набор неотрицательных целых чисел. Определите две функцииN
,BitLength
иNextPower
следующим образом:Это решение по существу вычисляет
NextPower(BitLength(n))
данное целое числоn >= 0
. Ибоn > 0
мы можем видеть этоNextPower(n) = 2^BitLength(n-1)
, такNextPower(BitLength(n)) = 2^BitLength(BitLength(n)-1)
.Теперь
BitLength
встроенный Mathematica согласуется с определением, которое я далn >= 0
. Дляn < 0
,BitLength[n] == BitLength[BitNot[n]] == BitLength[-1-n]
такBitLength[-1] == BitLength[0] == 0
. Таким образом, мы получаем желаемый ответ1
дляn==0
.Так как мы сразу перейти от бита к клеву, мы должны заменить ответы
2
с4
.источник
bash,
49 байтов48 байтовили же
Сохраните в скрипте и передайте число, которое будет проверено в качестве аргумента.
Редактировать: Заменено || с |, который работает, потому что аргументы всегда 0 или 1.
Примечание: это работает для целых чисел вплоть до наибольшего положительного целого числа, которое может обработать ваша версия bash. Если у меня будет время, я изменю его так, чтобы он работал до 2 ^ 64-1 в версиях bash, в которых используется 32-разрядная знаковая арифметика.
А пока вот 64-байтовое решение, которое работает для произвольно больших чисел (в любой версии bash):
источник
Stacked,
3430 байтовили же
Первый принимает ввод в TOS и оставляет вывод в TOS; вторая функция. Попробуй это здесь!
объяснение
Вот пример того, как это работает на repl :
Контрольные примеры
Или, как полная программа:
источник
Ракетка 45 байтов
Ungolfed:
Другие версии:
и используя длину строки:
Тестирование:
Выход:
источник
Октава,
40 36 3129 байтПростая анонимная функция. Предполагается, что входное значение является целым числом - см. Предостережение в конце.
Код работает следующим образом:
Сначала создается массив разрешенных битов (1,4,8,16,32,64) и сохраняется в
b
.Далее мы находим количество бит, необходимое для хранения входного числа
a
, сравнивая с максимальным размером каждого контейнера,b
чтобы увидеть, какие из них достаточно велики.Затем мы используем полученный индексный вектор для
b
повторного извлечения размера контейнера .Наконец, мы берем первый элемент в результирующем массиве, который будет наименьшим возможным контейнером.
Вы можете попробовать это онлайн здесь .
Просто запустите следующий код, а затем выполните
ans(x)
.Единственное предостережение в том, что по умолчанию для констант используется двойная точность, а это означает, что он работает только с числами до наивысшего значения, представленного с плавающей запятой двойной точности, которая меньше 2 ^ 64.
Это можно исправить, убедившись, что число, которое передается в функцию, является целым числом, а не двойным. Это может быть достигнуто путем вызова функции, например , с:
ans(uint64(x))
.источник
PHP,
494644 байтаЗапустите так:
объяснение
Tweaks
$r=
назначения-R
сделать$argn
доступнымисточник
CJam , 18 байт
Попробуйте онлайн!
объяснение
источник
C
7152 байтаисточник
(1<<15)+1
нарушит ли ввод или более это из-за подписанного поведенияlong long
? Тип, который вы действительно хотите, это тот,uint64_t
который требует,#include <stdint.h>
который все еще неудачник по сравнению сunsigned long long
! Заголовки - проклятие игры в гольф в c.unsigned long long
илиuint64_t
, но так как он, кажется, работает с,long long
я пошел с ним.QBIC , 27 байт
объяснение
источник
Пайк, 13 байт
Попробуй это здесь!
источник
PHP, 43 байта
Бежать с
echo <number> | php -R '<code>'
.зацикливается
$i
до тех пор, пока не2**(2**$i)
станет больше, чем ввод. (Твик:<<
вместо того,**
чтобы исключать парены)После цикла, $ i слишком велик; поэтому он получает декремент перед вычислением результата
- но не для
$i==2
.источник