Учитывая целое число n > 0
, выведите длину самой длинной непрерывной последовательности 0
или 1
в ее двоичном представлении.
Примеры
6
записано110
в двоичном виде; самая длинная последовательность11
, поэтому мы должны вернуть2
16
→10000
→4
893
→1101111101
→5
1337371
→101000110100000011011
→6
1
→1
→1
9965546
→100110000000111111101010
→7
code-golf
sequence
binary
subsequence
Arnaud
источник
источник
Ответы:
Python 2 ,
4645 байтПопробуйте онлайн!
Как это работает
Используя XOR n и n / 2 (деление на 2, по существу, обрезает последний бит), мы получаем новое целое число m, чьи неустановленные биты указывают на совпадение соседних битов в n .
Например, если n = 1337371 , мы имеем следующее.
Это уменьшает задачу, чтобы найти самый длинный пробег нулей. Поскольку двоичное представление положительного целого числа всегда начинается с 1 , мы попытаемся найти самую длинную 10 * строку цифр, которая появляется в двоичном представлении m . Это можно сделать рекурсивно.
Инициализируйте k как 1 . Каждый раз, когда выполняется f , мы сначала проверяем, появляется ли десятичное представление k в двоичном представлении m . Если это так, мы умножаем k на 10 и снова вызываем f . Если это не так, код справа от
and
не выполняется, и мы возвращаем False .Для этого мы сначала вычислим
bin(k)[3:]
. В нашем примереbin(k)
возвращает'0b111100101110000010110'
, и0b1
в начале удаляется с[3:]
.Теперь
-~
рекурсивный вызов before увеличивает значение False / 0 один раз для каждого вызова f рекурсивно. Если 10 {j} ( 1 за которым следуют j повторений по 0 ) не появятся в двоичном представлении k , самый длинный ряд нулей в k будет иметь длину j - 1 . Поскольку j - 1 последовательных нулей в k указывают j, совпадающих с соседними битами в n , желаемый результат равен j , что мы и получаем, увеличивая значение False / 0в общей сложности J раз.источник
Python 2, 46 байт
Попробуйте онлайн
Извлекает двоичные цифры из
n
обратного путем многократного взятияn/2
иn%2
. Отслеживает длину текущего циклаr
равных цифр, сбрасывая ее на 0, если последние две цифры не равны, а затем добавляя 1.Выражение
~-n/2%2
является индикатором того, равны ли последние две цифры, тоn
есть 0 или 3 по модулю 4. Проверка двух последних цифр вместе оказалась более короткой, чем запоминание предыдущей цифры.источник
05AB1E , 6 байтов
Попробуйте онлайн!
объяснение
источник
.¡
, я могу перестать заставлять себя пытаться использовать его.Mathematica, 38 байт
или
источник
Python, 53 байта
Анонимная лямбда-функция.
источник
Желе , 6 байт
Попробуйте онлайн!
Как это работает
источник
Рубин,
4140 байтНайдите самую длинную последовательность «1» в b или ее обратную.
Спасибо manatwork за сохранение 1 байта.
источник
%b
символами.JavaScript (ES6), 54 байта
Рекурсивное решение с большим количеством битовых манипуляций.
n
сохраняет входные данные,r
сохраняет длину текущего цикла,l
сохраняет длину самого длинного цикла иd
сохраняет предыдущую цифру.Тестовый фрагмент
источник
f=(x,b,n,m)=>x?f(x>>1,x&1,n=x&1^b||-~n,m>n?m:n):m
Рубин,
514443 байтаФункциональное решение.
@manatwork сделан из магии
источник
0
?->s{s.to_s(2).scan(/0+|1+/).map(&:size).max}
.Python 2, 57 байт
Рекурсивное решение. Там может быть более короткая форма для немного магии.
источник
Perl, 43 байта
Считая Шебанг как единое, ввод берется из стандартного ввода.
Попробуйте онлайн!
источник
#!perl
считается нулем, а не#!perl -p
.-p
стоит 1, исходя из предположения, что ваша командная строка Perl в любом случае будет иметь аргумент (например,-e
или-M5.010
), поэтому вы можете вставитьp
сразу после одного из дефисов. Это#!perl
бесплатно (хотя и не нужно).Пип , 16 байт
Кажется, должен быть более короткий способ получить пробеги той же самой цифры ...
Принимает ввод в качестве аргумента командной строки. Попробуйте онлайн!
объяснение
источник
Perl 6 , 36 байт
Объяснение:
Попробуйте онлайн .
источник
Хаскель, 79 персонажей
где
Или в разряженной версии:
Объяснение:
intToBin
преобразует int в список двоичных цифр (сначала lsb).group
группирует смежные последовательности, такие, что[1, 1, 0, 0, 0, 1]
становится[[1, 1],[0, 0, 0],[1]]
.maximum . map length
вычисляет для каждого внутреннего списка его длину и возвращает длину самого длинного.Изменить: Спасибо @xnor и @Laikoni за сохранение байтов
источник
group
по умолчанию не включен в Prelude, вам нужно сделать это,import Data.List
чтобы использовать его.let
:i n|(q,r)<-n`quotRem`2=r:i q
. Посмотрите наши советы по игре в гольф на Haskell .quotRem
может бытьdivMod
. Я думаю, что вы можете использоватьi 0=[]
в качестве базового варианта.div
иmod
напрямую еще корочеi n=mod n 2:i(div n 2)
.Pyth, 7 байт
Выполните кодирование длины серии в двоичной строке, затем отсортируйте ее так, чтобы самые длинные серии были последними, а затем возьмите первый элемент (длину) последнего элемента (самый длинный цикл) списка.
В псевдокоде:
источник
J , 21 байт
Попробуйте онлайн!
объяснение
источник
MATLAB 71 байт
Это преобразует целочисленную переменную 'a' в двоичный массив int8, а затем подсчитывает, сколько раз результат должен быть дифференцирован, пока в результате не будет нулевого значения.
Я здесь новичок. Разрешен ли такой ввод и однострочный текст правилами PCG?
источник
a
сa=input('');
. Также несколько советов по гольфу:~a
вместоa==0
. Вы действительно нуждаетесьint8
)?Октава , 31 байт
Попробуйте онлайн!
объяснение
Это перевод моего ответа MATL. Мой первоначальный план был другой подход, а именно
@(n)max(diff(find(diff([0 +dec2bin(n) 0]))))
. Но оказывается, что у Octave естьrunlength
функция (о которой я только что узнал). По умолчанию он выводит только массив длин серий, поэтому желаемым результатом будетmax
этот массив. Выходные данныеdec2bin
, представляющие собой массив символов (строку), содержащий'0'
и'1'
, должны быть преобразованы в числовой массив с использованием+
, посколькуrunlength
ожидается числовой ввод.источник
Утилиты Bash / Unix,
666542 байтаСпасибо @DigitalTrauma за значительные улучшения (23 байта!).
Попробуйте онлайн!
источник
Bash (+ coreutils, + GNU grep),
3332 байтаправок:
Golfed
Разъяснения
Попробуйте онлайн!
источник
Брахилог , 9 байт
Попробуйте онлайн!
объяснение
источник
C #, 106 байт
Отформатированная версия:
И альтернативный подход к доступу к строке по индексу в 118 байтов с удалением пробелов:
источник
Javascript, 66 байт
Спасибо manatwork за код.
объяснение
Преобразовать число в двоичную строку.
Разделить каждый символ (0 или 1) (это регулярное выражение захватывает пустые места, но их можно игнорировать)
Для каждого элемента массива получите его длину и поместите его в возвращаемый массив.
Преобразовать массив в список аргументов ([1,2,3] -> 1,2,3)
Получить наибольшее число из аргументов.
источник
x=>x.toString(2).split(/(0+|1+)/g).map(y=>y.length).sort().pop()
. Или же длина:x=>Math.max(...x.toString(2).split(/(0+|1+)/g).map(y=>y.length))
.sort((a,b)=>b-a)
. По умолчанию функция сортировки находится10
между1
и2
.Чудо , 27 байт
Использование:
Преобразует в двоичный файл, сопоставляет каждую последовательность из 0 и 1, получает длину каждого совпадения и получает максимум.
источник
Пакетная, 102 байта
Порт ответа @ edc65.
%2
..%4
будет пустым при первом вызове, поэтому я должен написать выражения таким образом, чтобы они все еще работали. Наиболее общий случай,%3
который я должен был написать как(%3+0)
.%2
проще, так как это может быть только0
или1
, которые одинаковы в восьмеричном, поэтому0%2
работает здесь.%4
Оказалось даже проще, так как от меня нужно только вычесть.(%4-r>>5)
используются для сравненияl
с ,r
как Batch - йset/a
не имеют оператора сравнения.источник
Дьялог АПЛ , 22 байта
Поезд анонимной функции
⌈/∘(
... Максимум результатов следующей анонимной функции-поезда ...≢¨
подсчет каждого⊢⊂⍨
разделение аргумента, где разделение определяется теми, в1,
один, предшествующий2≠/
попарно неравный⊢
Аргумент)
применительно к2⊥⍣¯1
От-базы-2 применяется отрицательный один раз (то есть от-базы-2, один раз)⊢
АргументПопробуй APL онлайн!
источник
Japt, 15 байт
Проверьте это онлайн! или Проверьте все тестовые случаи одновременно .
Как это работает
источник
R,
4534 байтаИсправлено глупое недоразумение благодаря @rturnbull и @plannapus.
источник
0
или1
, а не только0
, верно?PowerShell ,
787473 байтаПопробуйте онлайн!
Тьфу те методы .Net.
Он просто использует регулярное выражение для поиска (и сопоставления) смежных последовательностей единиц и нулей, а затем принимает
Length
свойство (с новым обнаруженным мной шаблоном, который использует малоизвестный набор параметровForEach-Object
, чтобы сохранить 1 байт) результирующих объектов сопоставления, сортирует их и выводит последний (самый большой).источник
J, 27 байт
Немного другой (и, к сожалению, более длинный) подход к ответу миль .
Использование:
объяснение
источник