Положительное целое число можно разбавить , вставив 0
между двумя битами в его двоичное расширение. Это означает, что n
число -бит имеет n-1
разведения, которые не обязательно все различны.
Например, для 12
(или 1100
в двоичном виде) разведения
11000 = 24
^
11000 = 24
^
10100 = 20
^
В этом испытании мы собираемся взять сумму всех разведений, исключая исходное число. Ибо 12
, принимая сумму 24, 24, 20
результатов в 68
, так 68
должен быть вывод для 12
.
Вызов
Учитывая положительное целое число в n > 1
качестве входных данных, выведите / верните разводненную сумму, как описано выше.
Примеры
in out
--- ---
2 4
3 5
7 24
12 68
333 5128
512 9216
правила
- Можно предположить, что ввод и вывод соответствуют целочисленному типу вашего языка.
- Ввод и вывод может быть дан в любом удобном формате .
- Допустимы либо полная программа, либо функция. Если функция, вы можете вернуть вывод, а не распечатать его.
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
code-golf
arithmetic
number-theory
binary
AdmBorkBork
источник
источник
Ответы:
Python 2 ,
4339 байтПопробуйте онлайн!
Как?
Каждый вызов рекурсивной функции вычисляет одно разведение. Положение вставленного
0
этоlog2(i)
. Функция повторяется до тех пор, пока неi
станет больше, чемn
и вставка будет слева от числа. Еслиi>n
,n/i
оценивает0
, что является ложным значением в Python.n*2
сдвигает все двоичные числа на одну цифру влевоn%i
илиn % 2**(position of insertion)
вычисляет значение части, которую не следует сдвигать влево. Это значение вычитается из смещенного числа.Пример (n = 7)
источник
Желе , 11 байт
Попробуйте онлайн!
Как это работает
источник
MATL , 13 байт
Попробуйте это в MATL Online! Или проверьте все тестовые случаи .
объяснение
Рассмотрим ввод
12
в качестве примера.источник
C,
5856 байтСпасибо @Dennis за сохранение двух байтов!
Попробуйте онлайн!
C (gcc) , 50 байтов
Возврат по
k=s;
неопределенному поведению, но работает с gcc, когда оптимизации отключены. Кроме того,n%k+n/k*(k+=k)
имеет неопределенное поведение , но, похоже, хорошо работает с gcc.Попробуйте онлайн!
источник
s,k;f(n){for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;}
(55 байт)n%k
илиn/k*(k*=2)
.for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;
вполне нормально, иn%k
всегда будет оцениваться раньше,n/k*(k*=2)
аn/k
также будет оцениваться раньшеk*=2
. Спасибо за объяснение. (Я удалю некоторые из моих комментариев сейчас, чтобы уменьшить беспорядок.)Желе ,
98 байтПопробуйте онлайн!
И наоборот
B¹ƤṖ+BḄS
: получить префиксы, отбросить последний, добавить их к вводу и суммировать.источник
J ,
20 1514 байтовПопробуйте онлайн.
15 байт
Попробуйте онлайн!
источник
Japt ,
1211 байтПопытайся
объяснение
источник
JavaScript (ES6),
4140 байтСохранено 1 байт благодаря Mr.Xcoder
Контрольные примеры
Показать фрагмент кода
источник
Сетчатка ,
535047 байтПопробуйте онлайн! Ссылка включает в себя тестовые случаи. Редактировать: 3 байта сохранены благодаря @MartinEnder. Объяснение:
Преобразуйте из десятичного в двоичное, но используйте O, чтобы представить 0, поскольку это не цифра, и _, чтобы представить 1, поскольку это символ повторения по умолчанию в Retina 1.
Вставьте O между каждой парой цифр и соберите результаты в виде списка.
Преобразовать из двоичного в унарный. (Это преобразование дает дополнительные
O
s, но нам все равно.)Суммируйте и преобразуйте в десятичную.
источник
%
. Если это сложнее, вам нужно что-то вроде/[O_]+/_
.Pyth , 13 байт
Попробуй это здесь!
объяснение
источник
Желе , 10 байт
Попробуйте онлайн!
Не самый короткий в настоящее время, но это может быть, если есть способ обойти
Bµ µḄ
...объяснение
По сути, это работает путем умножения каждой двоичной цифры на магическое число. Я не могу объяснить это без визуализации, поэтому вот двоичное число, с которым мы будем работать:
Как объясняет задача, он выводит нам сумму этих двоичных чисел:
Однако на самом деле нам не нужно вставлять нули: «небинарный» атом Jelly будет принимать числа, отличные от just
0
и1
. Когда мы позволяем себе использовать2
, этот шаблон становится проще:Когда мы суммируем цифры в каждом столбце, мы получаем
Уловка, которую использует этот ответ, состоит в том, чтобы сгенерировать этот образец и умножить каждую цифру на соответствующую цифру в оригинале, чтобы отменить необходимые столбцы. 12, например, будет представлен как
источник
Java 8, 55 байт
Порт Steadybox 'C ответ , и гольф 3 байта в процессе.
Попробуйте онлайн.
источник
Шелуха ,
1312 байт-1 байт благодаря @Mr. Xcoder!
Попробуйте онлайн!
объяснение
источник
05AB1E , 14 байтов
Попробуйте онлайн!
источник
Пип ,
2118 байтПопробуйте онлайн!
объяснение
Позвоните по нашему номеру
a
. Для каждого двоичного индекса,i
в который мы хотим вставить ноль, мы можем вычислить биты слева от точки вставки какa // 2**i
(где//
целочисленное деление и**
возведение в степень), биты справа от точки вставки какa % 2**i
и, следовательно, разбавленное целое число как2 * (a // 2**i) * 2**i + (a % 2**i)
. Но(a // 2**i) * 2**i
равноa - (a % 2**i)
, и поэтому мы можем перестроиться на более короткую формулу:2 * (a - a % 2**i) + a % 2**i
=2 * a - a % 2**i
.источник
R ,
14148 байтПопробуйте онлайн!
Либо я делаю что-то действительно неправильное, либо R просто ужасен в битовых манипуляциях.Портировать подход Луиса Мендо легко, правильно и гольф.Но если вы действительно хотите обойтись с битовыми операциями, MickyT предлагает следующий 105 байт:
Попробуйте онлайн!
источник
Python 3,
928078 байтПопробуйте онлайн
Благодаря Mr.XCoder и овс для -12 байт и -2 байт соответственно.
источник
Пакет,
9277 байтовИзменить: переключился на ту же формулу, что и все остальные.
источник
Желе , 14 байт
Попробуйте онлайн!
источник
Perl 5 , 36 + 1 (
-p
) = 37 байтПопробуйте онлайн!
источник
Атташе , 57 байт
Попробуйте онлайн!
Я думал, что подойду к проблеме с помощью подхода не-битной манипуляции, так как такой подход непрактичен в Attache. Я должен исследовать некоторые части этого подхода для альтернатив.
объяснение
Вот расширенная версия:
Это просто берет двоичное представление числа, разбивает его в определенных точках, вставляет туда нули, преобразует обратно в десятичную и суммирует их вместе.
источник
J , 33 байта
Скорее всего, есть много места для дальнейшего игры в гольф.
Как?
@#:
преобразовать в двоичный файл и<@}.\.
- найти все, что нужно, сбросить первую цифру от каждого и поле<\
- найти все префиксы и указать их(,0;])"0
- к каждому префиксу добавьте 0, затем добавьте соответствующий обезглавленный суффикс;@
никак (распаковывать)1#.[:}:#.@
- преобразовать в десятичную, сокращенную и суммуПопробуйте онлайн!
источник