Вдохновлен четвертой проблемой от BMO2 2009 .
Учитывая положительный целое число п в качестве входных данных или параметра, возвращает количество положительных целых чисел, двоичное представление встречается в виде блоков в двоичном разложении п .
Например, 13 -> 6, потому что 13 в двоичном виде - это 1101, и у него есть подстроки 1101, 110, 101, 11, 10, 1
. Мы не считаем двоичные числа, которые начинаются с нуля, и мы не учитываем сам ноль.
Тестовые случаи
13 -> 6
2008 -> 39
63 -> 6
65 -> 7
850 -> 24
459 -> 23
716 -> 22
425 -> 20
327 -> 16
Вы можете взять в п , как и любой из следующих условий :
- целое число
- список истинных / ложных значений для двоичного представления
- строка для двоичного представления
- базовая строка 10 (хотя я не уверен, почему кто-то сделал бы это)
Сделайте ваш код как можно короче.
Ответы:
Python 3,
5450 байтСпасибо Роду и Джонатану Аллану за сохранение четырех байтов.
источник
+1
из диапазона вbin(i)
n
себя и должны всегда исключать0
из нашего счета, мы можем вместо этого всегда исключатьn
и всегда считать0
(bin (n) начинается'0b...'
), поэтому мы можем полностью удалить1,
и+1
оставить и оставитьbin(i)
как есть, чтобы сохранить четыре байта. Попробуйте онлайн!Желе , 4 байта
Попробуйте онлайн!
Принимает данные в виде списка
0
s и1
s.Попробуйте онлайн с номерами!
Объяснение:
Доказательство того, что это работает:
Эта программа получает номер входа, N . Первое, что делает этот продукт, это, конечно, взять подстроки N 2 ( N в базе 2 ). Это включает повторяющиеся подстроки, начинающиеся с 0 или 1 .
После этого мы просто берем уникальные подстроки, сохраняя только первое вхождение каждого значения в списке подстрок.
Затем эта программа суммирует первые элементы списков, затем вторые элементы, затем третий, четвертый и т. Д., И если один из списков не имеет такого элемента
0
, предполагается. Что задача задает эффективно? Сколько уникальных подстрок, начинающихся с 1, имеет это число в двоичной форме? , Поскольку каждый первый элемент, который должен быть подсчитан, есть1
, мы можем просто суммировать вместо фильтрации соответствующие подстроки.Теперь первый элемент результирующего списка суммирования, описанного выше, содержит количество первых битов подстрок, поэтому мы просто извлекаем и, наконец, возвращаем его.
источник
Октава ,
6261 байтПопробуйте онлайн!
объяснение
Для ввода
n
код проверяет все числа от1
до,n
чтобы увидеть, является ли их двоичное представление подстрокой двоичного представления ввода.источник
05AB1E , 5 байтов
Принимает ввод в виде двоичной строки.
Заголовок преобразует целочисленный ввод в двоичный для простоты тестирования.
Попробуйте онлайн!
объяснение
источник
bŒʒć}Ùg
но нет, это лучше.Perl 5 , 36 + 1 (
-p
) = 37 байтПопробуйте онлайн!
Принимает ввод в виде двоичной строки.
источник
PowerShell ,
1039282 байтаПопробуйте онлайн!
Принимает входные данные в виде массива
1
и0
(правда и ложь в PowerShell). Циклы$s
(то есть, сколько элементов во входном массиве). Внутри цикла мы выполняем цикл от текущего номера (сохраненного как$i
) до$s.count
. В каждом внутреннем цикле мы-join
срезаем массив в строку. Затем мыsort
с-u
флагом nique (который короче, чемselect
с-u
флагом nique, и нам все равно, отсортированы они или нет), берем те, которые не начинаются0
, и берем общее.count
. Это осталось на конвейере и вывод неявный.источник
JavaScript (ES6), 55 байт
Принимает ввод в виде двоичной строки.
Вот грустная попытка сделать это с помощью чисел и рекурсивных функций:
Старый подход, 74 байта
Также принимает входные данные в виде двоичной строки.
источник
Python 2 ,
11881 байтСпасибо @Rod за сохранение 37 байт!
Принимает ввод в виде двоичной строки.
Попробуйте онлайн!
Python 2 , 81 байт
Спасибо @Rod!
Принимает ввод в виде двоичной строки.
Попробуйте онлайн!
источник
set(...)
на{...}
иxrange
сrange
+1
из диапазона в срез и переключитьs.startswith
егоint(s,2)
следующим образомЖеле , 5 байт
Попробуйте онлайн!
Вводит в виде списка 1 и 0. Нижний колонтитул в ссылке применяет функцию к каждому из примеров в посте.
Джонатан Аллан указал, что
ẆḄQTL
это 5-байтовая альтернатива, которая используетT
атом, который находит индексы всех истинных элементов.объяснение
В качестве примера возьмем bin (13) = 1101. Ввод
[1,1,0,1]
Взял идею «правда» (подпишите в этом случае) из ответа 05AB1E
источник
T
, сẆḄQTL
R ,
8877 байтПопробуйте онлайн!
Принимает ввод в виде двоичной строки.
используя
mapply
, генерирует массив всех подстрок ввода.strtoi
преобразует их как базовые2
целые числа, и я беру сумму логического преобразования (!!
) записей в результате.источник
Сетчатка ,
3729 байтПопробуйте онлайн! Я просто должен был попробовать Retina 1.0
w
модификатор . Изменить: Сохранено 8 байт благодаря @MartinEnder. Объяснение:Преобразовать из десятичной в одинарную.
Преобразовать из унарной в двоичную, используя
#
для0
и_
для 1.Создайте подстроки, которые начинаются с
1
, я имею в виду_
.w
Модификатор затем сопоставляет все подстроки, а не только самый длинный по одному на каждом запуске_
, в то время какp
модификатора дедуплицирует матчей. Наконец, так как это последний этап, количество совпадений возвращается неявно.источник
q
(илиp
) в дополнение кw
. Вам также не нужно указыватьC
явно, потому что это тип сцены по умолчанию, если остался только один источник.M
быть типом сцены по умолчанию!C
вроде какM
раньше. :)Pyth , 8 байт
Попробуй это здесь!
Принимает ввод в виде двоичной строки.
.:
генерирует все подстроки,vM
оценивает каждую (то есть конвертирует каждую из двоичных),{
дедуплицирует,<space>#
фильтрует по тождественности иl
получает длину.источник
Wolfram Language (Mathematica) , 35 байт
Подсчет уникальных подпоследовательностей двоичного представления, которые начинаются с единицы, хотя я не уверен, что этот код даже нуждается в объяснении.
Попробуйте онлайн!
источник
___
?Perl 6 , 47 байт
Попробуйте онлайн!
источник
Юлия 0,6 , 37 байт
Попробуйте онлайн!
Juliafication ответа Python по J843136028, использующий
.
для поэлементного применения функции с вещанием. ( ссылка )источник
Java, 232 байта
Где n - вход, b - двоичное представление, а l - список всех подстрок. При первом размещении здесь обязательно нужно улучшиться, и не стесняйтесь указывать на любые ошибки! Слегка отредактировано для удобства чтения.
источник
String b=...,t
иint i=...,j,k
сохранить символы для повторных объявлений одного типа. Ваш код также не будет считаться записью, потому что это фрагмент, ни полная программа, ни функциональный фрагмент, вы должны написать либо функцию, либоАтташе , 35 байт
Попробуйте онлайн!
Эквивалентное:
объяснение
Я объясню вторую версию, так как за ней легче следовать (будучи явным):
источник
Рубин
41 3627 байтПринимает двоичную строку в качестве ввода
Ультра неэффективно
Отчасти вдохновлен этим ответом на Python 3
Попробуйте онлайн!
источник
Java 8,
160159158 байтВвод в виде двоичной строки.
Должен быть более короткий путь ..>.>
Объяснение:
Попробуйте онлайн.
источник
C ++, 110 байт
Это рекурсивная функция. Мы используем
std::set
для подсчета значений, игнорируя дубликаты. Два рекурсивных вызова маскируют биты слева (f(n&i)
) и справа (f(n/2)
), в конечном итоге производя все подстроки в виде целых чисел.Обратите внимание, что если вы хотите позвонить снова,
s
необходимо очистить между вызовами.Тестовая программа
Результаты
источник
J , 34 байта
Попробуйте онлайн!
источник
J 15 байт
Ввод представляет собой двоичный список. Попробуйте онлайн!
источник
Perl 6 , 34 байта
Проверь это
Expanded:
источник