Эта задача проста, учитывая десятичное число, преобразовать в двоичное и вычислить сумму подстрок двоичного числа, длина которых короче исходного числа. Вот пример:
Input:
11
Binary:
11 -> 1011
Substrings:
101 = 5
011 = 3
10 = 2
01 = 1
11 = 3
1 = 1
0 = 0
1 = 1
1 = 1
Sum:
5+3+2+1+3+1+0+1+1=17
Output:
17
Ваша программа должна взять одно десятичное целое число в качестве входных данных и вывести сумму двоичных подстрок, как показано выше. Вы можете предположить, что входные данные всегда будут иметь более двух цифр в двоичном представлении, и что входные данные не вызовут никаких ошибок во время выполнения вашей программы.
Это код-гольф , выигрывает самый короткий код в байтах!
Тестовые случаи:
2 => 1
3 => 2
4 => 3
5 => 5
6 => 7
7 => 9
8 => 7
9 => 10
10 => 14
11 => 17
code-golf
base-conversion
binary
subsequence
GamrCorps
источник
источник
Ответы:
Желе,
107 байтПопробуйте онлайн!
Как это устроено
источник
Пиф, 10
Попробуйте онлайн или запустите Test Suite
Объяснение:
источник
CJam,
2721 байтПривет Денису за помощь в экономии 6 байт!
Работает только с новейшей версией CJam (доступна на TIO). Попробуйте онлайн !
Старая версия:
Попробуйте онлайн .
источник
Python 3, 111 символов
РЕДАКТИРОВАТЬ : Объяснение:
Преобразуйте входную строку в int, затем int в двоичную строку и удалите первые два символа, поскольку
bin
метод возвращает строку в формате0b...
Возьмите все подстроки двоичной строки, преобразуйте их в десятичные, используя
int(n, 2)
и суммируйте их.список всех подстрок Безголовая версия:
Надеюсь это поможет.
источник
CJam (22 байта)
Это на один байт длиннее, чем текущий лучший ответ CJam, но этот подход, вероятно, может быть выгодно адаптирован к некоторым другим языкам.
Онлайн демо
Анализ
Предположим, что вопрос
без долота
Тогда нетрудно показать, что самый старший бит встречается с общим весом,
1*(2^B-1)
гдеB
есть количество бит; второй по значимости бит происходит с общим весом2*(2^(B-1)-1)
; вплоть до Bth-самого значимого бита, который происходит с общим весомB*(2^1-1)
.Принимая во внимание вычитание исходного числа
x
, мы получаем суммурассечение
Преобразование в базу 2 дает первую часть основной суммы плюс
x
; к базе 1 дает вторую часть плюсx
; и для базы 0 дается простоx
, поэтому вычитание базы-1 из базы-2x
отменяется, а вычитание базы-0 дает желаемый результат.источник
JavaScript (ES6), 78 байт
Внешнее
map
строит ведущие подстрокиn
двоичного представления России; внутренняя извлекает конечные подстроки из ведущих подстрок, таким образом покрывая все возможные подстроки, включая исходное двоичное представление.Каждая подстрока преобразуется из двоичной обратно в десятичную и вычитается из исходного ввода, поскольку это немного короче, чем сложение их вместе и вычитание исходного ввода.
источник
Mathematica,
7370 байтФункция. Integer-> Integer
источник
Сетчатка , 64
Попробуйте онлайн!
Высокоуровневое поэтапное описание: преобразование десятичного числа в унарное, унарное в двоичное, получение префиксов, получение суффиксов префиксов, сброс исходного числа, преобразование двоичного числа в унарное, возвращаемое количество. Я напишу более подробное описание, как только я закончу играть в гольф, многие из этих этапов кажутся подозрительными ...
источник
C 71 байт
Мы поддерживаем аккумулятор
a
и маскуm
. Маска начинается с 1 и каждый раз увеличивается на один цикл во внешнем цикле. Во внутреннем цикле копияi
входных данных последовательно смещается вправо до тех пор, пока она не станет короче маски, накапливая маскированное значение каждый раз.Тестовая программа
Тестовый вывод
источник
C #, 148 байт
Или, если я добавлю Import "using static System.Math;" затем 138 с
ООП языки, такие как C #, не выиграют такую гонку, но я все равно хотел попробовать. Вот более качественная версия + тестер.
Вложенное do-while добавляет смещенное вправо значение iTemp (после его присвоения), если shift + 1 меньше, чем pos. Следующая строка вычисляет следующее смещенное значение iPrev
x1 и x2 вычисляют маску, x3 применяет ее, а затем сдвигает влево, поскольку последняя цифра всегда удаляется. Для 11 это выглядит так:
источник
PowerShell v2 +, 138 байт
Ooof. Это преобразование в / из двоичного кода стоит дорого.
Принимает ввод
$a
, затем использует вызов .NET,[convert]::ToString($a,2)
чтобы превратить его в двоичное представление. Оттуда мы проходим две петли - первая отсчитывает назад от конца строки до1
, а вторая отсчитывает вверх от0
. (Первая - это длина вытянутой подстроки, а вторая - индекс места в строке, с которого начинается подстрока.) Мы устанавливаем помощник$l
по пути, чтобы передать его во внутренний цикл.Во внутреннем цикле мы используем другой вызов .NET,
[convert]::ToInt32()
чтобы преобразовать соответствующий.substring()
из базы2
в целое число. Каждый из них затем остается на конвейере. Мы инкапсулируем все это с помощью паренов()
и-join
их вместе с символом a+
, затем отбрасываем это вiex
(сокращенноInvoke-Expression
и аналогичноeval
).Я думаю, что технически это требует v2 или новее, чтобы правильно вызывать вызовы .NET.
источник