Цель
Учитывая неотрицательное целое число, создайте функцию, которая возвращает начальную позицию числа самых больших последовательных 1 в двоичном значении этого целого числа.
Когда дан вход 0
, вернитесь 0
.
Если число имеет несколько полос одинаковой длины, вы должны вернуть позицию последней полосы.
вход
Целое число больше или равно 0.
Выход
Целое число, рассчитанное, как описано ниже.
правила
- Это код-гольф, поэтому выигрывает самый короткий код в байтах на каждом языке.
- Стандартные лазейки запрещены.
Примеры и тестовые случаи
Пример 1
- Вашей функции передано целое число 142
- 142 равно 10001110 в двоичном
- Самая длинная полоса - "111" (полоса из трех)
- Полоса начинается с позиции 2 ^ 1
- Ваша функция возвращает 1 как результат
Пример 2
- Вашей функции передано целое число 48
- 48 равно 110000 в двоичном
- Самая длинная полоса - "11" (полоса из двух)
- Полоса начинается с позиции 2 ^ 4
- Ваша функция возвращает 4 в результате
Пример 3
- Вашей функции передано целое число 750
- 750 равно 1011101110 в двоичном
- Самая длинная полоса - "111" (полоса из трех)
- Поскольку есть две полосы одинаковой длины, мы возвращаем более позднюю полосу.
- Поздняя полоса начинается с позиции 2 ^ 5
- Ваша функция возвращает 5 как результат
0
. Это важный контрольный пример.Ответы:
Желе ,
108 байтПопробуйте онлайн!
Как это работает
источник
JavaScript (ES6),
41403634 байтаСохранено 4 байта благодаря @ThePirateBay
Контрольные примеры
Показать фрагмент кода
Как?
Общий случай x> 0
Мы рекурсивно И вход х с х / 2 который постепенно уменьшает последовательности последовательных установленных битов, пока не останется только самый правый бит последовательности. Мы сохраняем копию последнего ненулевого значения и определяем позицию его старшего значащего бита, округляя логарифм по основанию 2.
Ниже приведены шаги, которые мы проходим для x = 750 ( 1011101110 в двоичном виде).
Крайний случай x = 0
Особый случай
x = 0
сразу приводит кMath.log2(0) | 0
. Логарифм0
вычислений до-Infinity
и двоичного побитового ИЛИ приводит к приведению к 32-разрядному целому числу. В соответствии со спецификацией абстрактной операции ToInt32 это дает ожидаемое0
:источник
0
, который является частью диапазона ввода.Math.log2(k)|0
вместо31-Math.clz32(k)
? Или я что-то упустил?Math.log2(k)|0
на самом деле и короче, и проще для особого случаяx=0
. Спасибо. :)машинный код x86, 14 байт
С помощью @ алгоритма Arnauld в части
x &= x>>1
и берущих самую высокую битовую позицию , установленную в предыдущем шагеx
становится0
.Вызывается из C / C ++ с подписью
unsigned longest_set(unsigned edi);
в x86-64 System V ABI. Те же байты машинного кода будут декодироваться одинаково в 32-битном режиме, но стандартные соглашения о 32-битных вызовах не помещают первый аргументedi
. (Изменение регистра ввода наecx
илиedx
для Windows_fastcall
/_vectorcall
илиgcc -mregparm
может быть сделано, не нарушая ничего.)Инструкция x86
BSR
(Bit Scan Reverse) идеально подходит для этого, предоставляя нам бит-индекс напрямую, а не считая начальные нули. (bsr
напрямую не32-lzcnt(x)
выдает 0 для input = 0, как хотелось бы, но нам нужно bsr = 31-lzcnt для ненулевых входов, поэтомуlzcnt
даже не буду сохранять инструкции, не говоря уже о количестве байтов. Обнуление eax до работы цикла из-заbsr
' s полуофициальное поведение оставления пункта назначения неизменным, когда ввод равен нулю.)Это было бы еще короче, если бы мы могли вернуть позицию MSB самого длинного пробега. В этом случае
lea ecx, [rdi+rdi]
(3 байта) будет копировать + left -shift вместоmov
+shr
(4 байта).Видеть эту ссылку TIO для вызывающего абонента asm, который делает
exit(longest_set(argc-1));
Тестирование с помощью цикла оболочки:
источник
Желе ,
191711 байтПопробуйте онлайн!
-6 (!) Байтов благодаря острым наблюдениям @ Денниса
Как это работает
источник
0
, который находится в диапазоне ввода.ȯ-µ...
B
всегда возвращает массив, который начинается с 1 ,BUṪMṪ’×Ṡ
может статьṪBL’
. Кроме того, вам не нужноḞ
, иḟ0
сохраняет один байт¹Ðf
.Python 2 , 45 байт
Попробуйте онлайн!
Благодаря Деннису сэкономлено много байтов! (Главы
len(bin(...))-3
вместоmath.frexp
)Спасибо @xnor за обнаружение ошибки, которая, к счастью, была легко исправима!
источник
x=3
, я думаю, потому чтоand/or
короткое замыкание неправильно, когда функция возвращает 0.Perl 6 ,
4535 байтЭта сильно улучшенная версия любезно предоставлена @nwellnhof.
Попробуйте онлайн!
источник
:g
чтобы получить все совпадения. С оператором smart-match я мог бы{sort(.base(2).flip~~m:g/1+/).tail.from}
{.msb+1-(.base(2)~~m:g/1+/).max.to}
:g
и не понял, как я могу использовать наречие с оператором smartmatch. Также этот.msb
метод очень полезен, и я не знал об этом раньше.Python 2 ,
8978 байтПопробуйте онлайн!
РЕДАКТИРОВАТЬ: Сохранено 11 байтов благодаря Mr. Xcoder.
источник
05AB1E ,
141211 байтПопробуйте онлайн! или запустить тестовые случаи .
объяснение
источник
J ,
1817 байтПопробуйте онлайн!
объяснение
источник
x
диаде, равны 0 и 1, что это значит? Номер базы 2 имеет цифры0
и1
, следовательно, номер базы1
имеет цифры ...0
? тогда что1
значит в этом контексте? И0
всегда0
ли базовый номер ?x #. y
сначала вычисляет,w =: */\. }. x , 1
затем возвращает+/ w * y
#.
, поскольку вы полагаетесь на внутренние детали реализации, а не на публичный API?C # (.NET Core) ,
6460 байтПопробуйте онлайн!
AC # версия ответа @ Арнаулда
Подтверждения
4 байта сэкономлено благодаря Кевину Круйссену.
C # (.NET Core) ,
131123 + 18 = 141 байтПопробуйте онлайн!
+18 байт для
using System.Linq;
Подтверждения
8 байтов сэкономлено благодаря Гжегож Пулавски.
Degolfed
C # (.NET Core) ,
164161 байтПопробуйте онлайн!
Нерешенное
Linq
решение, которое, я уверен, могло бы быть улучшено, хотя ничего не видно сразу.Degolfed
источник
r
от первого ответа: tio.run/##dY9RS8MwFIWfza/…T=a=>{int x=(int)Math.Log(a,2);return(a&=a/2)>0?T(a):x<0?0:x;}
T=a=>(a&a/2)>0?T(a&a/2):Math.Log(a,2)<0?0:(int)Math.Log(a,2)
Шелуха , 12 байт
Попробуйте онлайн!
объяснение
источник
Желе ,
14 13 1211 байтМонадическая ссылка, принимающая и возвращающая неотрицательные целые числа.
Попробуйте онлайн! или посмотрите набор тестов .
Как?
источник
ŒrṪP
вместо этого я использовал префиксы.Желе , 19 байт
Попробуйте онлайн!
Спасибо Джонатану Аллану за спасение
46 байтов!Я слишком много работал, чтобы просто отказаться от этого, хотя это довольно долго. Я действительно хотел добавить решение, которое буквально ищет самую длинную подстроку
1
s в двоичном представлении ...объяснение
источник
BŒgḄṀB
Вместо этого может быть ваша вспомогательная ссылкаBwÇɓÇL+ɓBL_‘
Котлин , 77 байт
украшенный
Тест
источник
Haskell ,
101989675 байтПопробуйте онлайн! Использование:
snd.maximum.(`zip`[0..]).c $ 142
урожайность1
.Объяснение:
c
преобразует входные данные в двоичный файл, одновременно считая длину одной полосы, собирая результаты в виде списка.r<-c$div n 2
рекурсивно вычисляет остальнуюr
часть этого списка, в то время какsum[r!!0+1|mod n 2>0]:r
добавляет текущую длину полосы кr
. Понимание списка проверяетmod n 2>0
, является ли текущая двоичная цифра единицей, и если да, берет длину предыдущей строки (первый элементr
) и добавляет единицу. В противном случае список понимания пуст, иsum[]
дает0
. Для примера вводаc 142
выдает список[0,3,2,1,0,0,0,1,0]
.(`zip`[0..])
добавляет позицию к каждому элементу предыдущего списка в качестве второго компонента кортежа. Для примера это дает[(0,0),(3,1),(2,2),(1,3),(0,4),(0,5),(0,6),(1,7),(0,8)]
.maximum
находит в этом списке лексикографически максимальный кортеж, то есть длины полос считаются первыми, поскольку они являются первым компонентом, а в случае связывания решает второй компонент, а именно больший индекс. Это дает(3,1)
в примере иsnd
возвращает второй компонент кортежа.источник
Python 2 или 3 , 58 байт
Попробуйте онлайн!
источник
C (gcc) ,
8180 байтПопробуйте онлайн!
C (gcc) , 43 байта
AC версия ответа @ Arnauld
Попробуйте онлайн!
источник
n<1?0:log2(n)
вместо(k=log2(n))<0?0:k
MS SQL Server,
437426407398 байтSQL Fiddle
Я уверен, что смогу удалить разрывы строк и т. Д., Но это настолько компактно, насколько я был готов сделать это:
Вот более читаемая версия:
Реальная хитрость в том, что, насколько я мог найти, нет встроенной функции SQL для преобразования числа из десятичного в двоичное. В результате мне пришлось вручную закодировать преобразование в двоичное, а затем сравнить его как строку, по одному символу за раз, пока я не нашел нужное число.
Я уверен, что есть лучший способ сделать это, но я не увидел (n) ответа SQL, поэтому я решил, что я его выброшу.
источник
APL (Dyalog Unicode) , 22 символа = 53 байта
Требуется
⎕IO←0
по умолчанию во многих системах.Попробуйте онлайн!
⎕
запрос на ввод⊢
дать это (отделяется¯1
от⎕
)2⊥⍣¯1
преобразовать в базу-2, используя столько позиций, сколько необходимоb←
хранить какb
(для б )⌽
обратный(
...)
отметить начальные позиции следующего в этом:⊆⍨b
самостоятельное разбиениеb
(т.е. 1-полоскиb
)↑
mix (сделать список списков в матрицу, заполнение нулями)∨⌿
вертикальное уменьшение ИЛИ (дает самую длинную полосу)⍸
of индикаторы стартовых позиций⌽
обратный⊃
выберите первый (дает ноль, если ничего не доступно)источник
MATL , 15 байт
Попробуйте онлайн!
Использует половину и идею. Он
k
необходим только для его завершения1
- по какой-то причине 1 И 0.5 возвращает 1, вызывая бесконечный цикл.(альтернативное решение:
BtnwY'tYswb*&X>)-
путем преобразования в двоичное кодирование и кодирование по длине прогона)источник
Google Sheets, 94 байта
Нет, это не очень красиво. Было бы очень приятно иметь возможность хранить
Dec2Bin(A1)
в качестве переменной для справки.Ключевой момент: как и в Excel,
Dec2Bin
функция имеет максимальное значение ввода511
. Все, что больше этого, возвращает ошибку, как показано ниже.источник
R, 117 байт
источник
rev
используйтеReduce(...,T,T)
для накопления справа (переключениеx,y
в определении функции). Тогда используйте,1+max(z)-which.max(z)
так как результат несколько отличается. Используйте"if"
вместо того, чтобы"ifelse"
нам не нужна векторизация; aa, и если вы используетеany(z)
вместо!sum(z)
вас сбросить байт.Excel VBA,
5444 байта-10 байт благодаря @EngineerToast
Функция анонимного непосредственного окна VBE, которая берет входные данные из диапазона
[A1]
и выводит в непосредственное окно VBEисточник
C1
все еще присутствует вместоA1
, я думаю, вы можете вывестиInstr
результаты напрямую, слегка повернув для коррекции нулевого ввода:?Instr(1,StrReverse([Dec2Bin(A1)]),1)+([A1]>0)
(46 байт). True = -1, потому что ... VBA.>0
в[A1]
нотациюAPL (Dyalog Classic) ,
2421 байтПопробуйте онлайн!
источник
Pyth , 17 байт
Это рекурсивная функция. Ссылка включает
y
для того, чтобы вызвать функцию на заданном входе.Проверьте все контрольные примеры.
Pyth , 20 байтов
Проверьте все контрольные примеры.
источник
R, 66 байт
Объяснение:
источник
a$l
вместоa[[1]]
иa$v
вместо того,a[[2]]
чтобы сохранять некоторые байты :), а также>0
вместо==1
.Python 2 , 41 байт
Попробуйте онлайн!
На основании этого решения мистер Xcoder .
источник
Javascript, 54 символа
i.toString(2)
получает двоичную строку для целого числа..split(0)
Получает каждый последовательный одни части в качестве элемента массива..sort().reverse()
получает первую наивысшую ценность.[0].length
дает нам длину этого первого значения.источник
the starting position of number of largest consecutive 1's
Perl 5, 45 + 1 (-p)
Если вы напишите это в командной строке большинства оболочек, вам, возможно, придется ввести это как:
Танец кавычек в конце состоит в том, чтобы увидеть perl
'
, который иначе был бы использован оболочкой.источник
Retina ,
5243 байтаПреобразовать в двоичный файл, а затем заменить его длиной, следующей за самой большой строкой из них.
Попробуйте онлайн - все тестовые случаи
Сохранено 9 байтов благодаря Мартину.
источник
$+
для${1}
. Но вы можете сэкономить еще больше, заменив последний этап следующим набором${1}
был скопирован из вашего урока на Github.