Последовательность Баум-Сладкий (A086747 с изюминкой)
Возьмите положительное целое число n
и выведите целые числа от 1 до n, для которых последовательность Baum-Sweet возвращает true. Последовательность Баума-Сладкого должна возвращать ложь, если двоичное представление числа содержит нечетное число последовательных нулей в любом месте числа, и верно в противном случае. Для получения дополнительной информации, нажмите на ссылку. Вот пара примеров:
1 -> 1 -> Truthy
2 -> 10 -> Falsy
3 -> 11 -> Truthy
4 -> 100 -> Truthy (Even run of zeros)
Вот пример n=32
Шаг 1: последовательность Baum-Sweet, визуализированная для n=32
1 1 (1)
1 0 0 (2)
11 1 (3)
1 00 1 (4)
1 0 1 0 (5)
11 0 0 (6)
111 1 (7)
1 000 0 (8)
1 00 1 1 (9)
1 0 1 0 0 (10)
1 0 11 0 (11)
11 00 1 (12)
11 0 1 0 (13)
111 0 0 (14)
1111 1 (15)
1 0000 1 (16)
1 000 1 0 (17)
1 00 1 0 0 (18)
1 00 11 1 (19)
1 0 1 00 0 (20)
1 0 1 0 1 0 (21)
1 0 11 0 0 (22)
1 0 111 0 (23)
11 000 0 (24)
11 00 1 1 (25)
11 0 1 0 0 (26)
11 0 11 0 (27)
111 00 1 (28)
111 0 1 0 (29)
1111 0 0 (30)
11111 1 (31)
1 00000 0 (32)
Итак, после вычисления последовательности Баума-Свита для n, возьмите числа, которые были правдивыми для последовательности, и соберите их для конечного результата. Ибо n=32
мы бы имели:
[1, 3, 4, 7, 9, 12, 15, 16, 19, 25, 28, 31]
В качестве окончательного ответа.
Это код-гольф , выигрывает самый короткий счетчик байтов.
code-golf
sequence
base-conversion
binary
Урна волшебного осьминога
источник
источник
Ответы:
05AB1E ,
109 байтовСохранил байт благодаря Аднану
Попробуйте онлайн!
объяснение
источник
ƒ
вместо>G
?.¡
использованный;).JavaScript (ES6),
706863 байтаЧуть более интересное рекурсивное решение:
67 байт благодаря @Neil.
g
это функция для вызова.источник
f
похож на функцию, которую я иногда использую для подсчета количества 1-бит в числе.f
подводит когдаn=0
? Также, какf
только возвращает 0 или 1, вы можете сбрить два байта с помощьюn&f(n>>1)
.n = 0
это не так;).filter
:n=>[...Array(n+1).keys()].filter(f=n=>n<2?n:n%4?n&f(n>>1):f(n/4))
Python 2, 62 байта
Проверяет наличие нечетных серий единиц в двоичном представлении путем разделения
00
и проверки, остаются ли какие-либо нули в строковом представлении результирующего списка. Досадно, что двоичные числа начинаются с0b
нуля, который нужно удалить, чтобы избежать ложного срабатывания.Перечисление выполняется путем повторения вниз.
источник
Bash,
5846 байтовправок:
Golfed
Тестовое задание
Разъяснения
ракушка
СЭД
Попробуйте онлайн!
источник
Пакет, 143 байта
источник
Perl 6 , 40 байт
Попытайся
(
[]
используются для группирования без захвата, с<[]>
использованием для классов символов)источник
PowerShell ,
7961 байтПопробуйте онлайн!
Сегодня утром у меня появилось вдохновение изменить способ выполнения
-split
операции, а затем увидеть, что это похоже на то , как построен ответ xnor , так что, думаю, великие умы думают одинаково?Мы выполняем цикл от
1
до ввода$args[0]
и используемWhere-Object
оператор для извлечения соответствующих чисел|?{...}
. Предложение является простым логическим значением - мы гарантируем, что0
это-notin
результат(...)
.Внутри скобок мы
[convert]::
текущее число$_
ToString
с основанием2
(то есть, превратить его в двоичную строку). Затем мы получаем-split
строку в регулярном выражении1|00
- это жадное совпадение, и в результате получается массив строк (например,100010
превратится в'','','0','','0'
и т. Д.).Таким образом, если каждый запуск
0
s в двоичной строке является четным (это означает, что регулярное выражение разделило их на пустые строки), то результатом0
будет-notin
результат, поэтомуWhere
предложение истинно и выбрано число. Эти числа остаются на конвейере и вывод неявный.источник
Python 2 ,
6747 байтБлагодаря @xnor от игры в гольф 20 (!) Байтов!
Возвращает неупорядоченный список. Это довольно эффективно: ввод 100 000 занимает около 40 мс на TIO.
Попробуйте онлайн!
источник
[1][n:]or
. Кроме того,x-~x
для2*x+1
.f=lambda n,k=1:n/k*[1]and[k]+f(n,k-~k)+f(n,4*k)
при условии, что выходные данные могут быть в любом порядке.Mathematica, 59 байт
Mathematica ответ № 4 ...
источник
MATL ,
1211 байтПопробуйте онлайн!
объяснение
Чтобы определить, является ли число допустимым, оно преобразуется в двоичное, применяет кодирование по длинам серий, сохраняет только серии с нечетной длиной и проверяет, не сохранилось ли число нулей.
источник
R 75 байт
Читает ввод из stdin и использует
bin
функцию изmiscFuncs
пакета для преобразования из десятичного в двоичный вектор. Следовательно, выполняет кодирование длин серий, чтобы проверить значения== 0
и длины нечетные.источник
С накоплением , 69 байтов
Попробуй это здесь!
Или неконкурентоспособный в 67 байтов:
И, еще более неконкурентоспособный на 49 байтов:
Все принимают вход как TOS и оставляют вывод на TOS.
объяснение
Функция:
Объяснение неконкурентоспособности:
Это то же самое, что и выше, с несколькими ключевыми отличиями:
источник
Befunge,
845149 байтовПосле небольшого количества экспериментов я понял, что могу сделать немного лучше, чем мое оригинальное решение, используя технику, похожую на пакетный ответ, который придумал Нейл .
Попробуйте онлайн!
Как и в моем исходном решении, есть два цикла - внешний цикл, повторяющийся над числами, которые мы хотим проверить, и внутренний цикл, проверяющий последовательность битов для каждого числа. Тест работает, проверяя два бита за раз (по модулю 4 текущего значения). Если это равно 2, мы получили нечетную последовательность нулей и можем прервать внутренний цикл и перейти к следующему числу.
Если модуль 4 не равен 2, нам нужно продолжить тестирование оставшихся битов, поэтому мы сдвигаем биты, которые уже были протестированы. Это делается путем деления значения, давайте назовем его n , на
2+2*!(n%2)
. Это означает, что если первый бит был 1, мы делим на 2 (отбрасывая этот 1 бит), но если это был 0, мы делим на 4, поэтому мы всегда будем отбрасывать пары нулей.Если в итоге мы опустимся до нуля, это означает, что не было никаких нечетных последовательностей нулевых битов, поэтому мы выписываем число.
источник
Visual Basic (.net 4.5) 163 байта
Первый ответ здесь, так что я уверен, что что-то напортачил. Дайте мне знать, и я исправлю. Разрешены ли лямбды Visual Basic?
Спасибо MamaFunRoll за идею удаления последовательных нулей
R (32) выходов
источник
Java,
144130128 байтЭто не так хорошо, как я думаю, но я подумал, что было бы неплохо использовать Regex, несмотря на то, что он никогда не использовался.
Golfed:
static String a(int n){String s="";for(Integer i=0;i++<n;)if(i.toString(i,2).replaceAll("00|1","").isEmpty())s+=i+" ";return s;}
Ungolfed:
Изменить: мне удалось сохранить 14 байтов, сделав регулярное выражение 00 | 1 вместо 00 и удалив ".replace (" 1 "," ")" между replaceAll и isEmpty!
Редактировать 2: я смог сохранить 2 байта, сделав i Integer и ссылаясь на Integer.toString с i.toString.
источник
Clojure, 103 байта
Я не думаю, что это самый короткий путь ...
Использует
re-seq
для поиска последовательных нулей, отображает их длины по модулю 2 в aset
, отбрасывает их, если число1
найдено из набора.источник
Чудо , 38 байт
Использование:
объяснение
Более читабельно:
rng 1 +1 #0
: Диапазон от 1 до ввода.fltr@ ...
: Диапазон фильтра со следующим предикатом.bn #0
: Преобразовать текущий элемент в двоичный файл. (Это будет ведущий0b
).Rstr #["00"]
: Рекурсивно удалять любые вхождения00
в строке.len iO 0
: Подсчитать количество0
s в строке.=1
: Проверьте, равна ли сумма 1. Если0
в строке после обрезки осталась только одна строка0b
, то возвращается значение true; в противном случае возвращается false.источник
Рубин,
786968 байтСтарые версии:
источник
Mathematica, 81 байт
Вычисляет для каждой серии последовательных цифр в номере {общую цифру в этой серии плюс (1, если длина нечетная, 2, если длина четная)}; если какой-либо из ответов является {1}, то число не входит в последовательность.
источник
Mathematica, 75 байт
#~IntegerDigits~2
вычисляет список двоичных цифр ввода#
.Split
этот список разбивает на идентичные элементы, беретCases
то соответствие{0..}
, беретLength
каждый из них, беретEvenQ
длины и затем возвращаетAnd
результаты.источник
!Or@@OddQ/@...
Python 3,
8682 байтаГольф в прогрессе ...
Вычеркнул 4 байта, изменив
bin(x)[2:]
на «просто»bin(x)
- это оставляет0b
в начале строки, но я понял, что это на самом деле не влияет на вычисления :)источник
Python, 142 байта
В основном это просто практика игры в гольф на моем Питоне.
источник
Желе , 10 байт
Ужасно неэффективно. Попробуйте онлайн!
источник
Рубин,
545348 байтовЯ не думал, что регулярное выражение для этого будет настолько простым.
редактировать 1: переключено на отклонение, чтобы избавиться от отрицания на -1.
редактировать 2: включен
match
в=~
течение -5.источник
C #
159157155 байтовСохранено 2 x два байта благодаря TuukkaX.
Примечание: распечатывает входные данные в обратном порядке.
Объяснение:
источник
c%2==0
может бытьc%2<1
.N
.b[i++] == '0'
может бытьb[i++]==48
, но так как другой возможный символ - «1» (ASCII 49), вы можете просто проверить, есть лиb[i++]<49
.Mathematica, 69 байт
Одинаковой длины:
источник
Рубин, 53 байта
источник
Желе,
151310 байтсохранив два байта после просмотра других ответов, еще 3 байта благодаря Деннису
объяснение
источник