Вызов
Если задано целое число в формате дополнения до 32-разрядного двоичного числа , верните индекс второй наименее значимой нулевой цифры в двоичном представлении, где индекс 0
представляет наименее значимый бит, а индекс 31
представляет наиболее значимый бит.
Если второго ноля нет, вы можете вернуть 0, любое отрицательное число, любое ложное значение или сообщить об ошибке способом, который имеет смысл на вашем языке.
Вы можете использовать 1-индексирование, если хотите, но в приведенных ниже тестах будет использоваться 0-индексирование.
Вы можете использовать целые числа без знака, если хотите; если вы делаете, то вы должны обрабатывать целые числа в диапазоне [0, 2^32)
. Если вы используете целые числа со знаком, вы должны обрабатывать целые числа в диапазоне [-2^31, 2^31)
. В тестовых примерах здесь используются целые числа со знаком, но обратите внимание, что -x
(подписано) - 2^32 - x
(без знака).
Тестовые случаи
0 (0b00) -> 1 1 (0b001) -> 2 10 (0b1010) -> 2 11 (0b01011) -> 4 12 (0b1100) -> 1 23 (0b010111) -> 5 -1 (0b11..11) -> Нет -2 (0b11..10) -> Нет -4 (0b11..00) -> 1 -5 (0b11..1011) -> Нет -9 (0b11..10111) -> Нет 2 ^ 31-2 (0b0111..1110) -> 31
счет
Это код-гольф , поэтому выигрывает самый короткий ответ на каждом языке!
[0, 2^32)
.0b...
качестве входных данных?2^32-1
потому что я не должен был возвращаться33
.Ответы:
Python 2 , 45 байт
Попробуйте онлайн!
Использует 0-индексирование, числа без знака и выдает ошибку без второго нуля.
Просто создает список индексов не установленных битов, от младшего к старшему, и возвращает вторую запись.
источник
JavaScript (ES6), 34 байта
Возвращает индекс на основе 0, или
-1
если второй ноль не найден.Контрольные примеры
Показать фрагмент кода
Альтернативное выражение
Рекурсивная версия, 42 байта
Возвращает индекс на основе 0, или
false
если второй ноль не найден.Как?
Контрольные примеры
Показать фрагмент кода
Альтернативная версия, предложенная Нилом, 41 байт
Возвращает индекс на основе 0 или выдает слишком много ошибок рекурсии, если второй ноль не найден.
источник
f=(n,c=1)=>n%2?1+f(~-n/2,c):c&&1+f(n/2,0)
Желе , 7 байт
Попробуйте онлайн!
Он выводит что-то не в диапазоне [1,31], если нет второго нуля. Это включает в себя
32
33
и(-inf+nanj)
. Я думаю, в этом есть какой-то смысл.Он рассчитывает
log(((x|(x+1))+1)&~x)/log(2)
.источник
-inf+nanj
Я не думал, что это вообще может существовать(-inf+nanj)
для входа,2147483647
который имеет двоичное представление 31 1 с, следовательно, нет второго нуля в 32-битной знаковой записи (вот почему он намного короче, чем мой и ответы Эрика).(-inf+nanj)
?Ява, ...
194 191186 байт-159 байт для использования имен переменных меньшего размера и удаления пробелов
-25 байт, после принятия еще более коротких переменных и благодаря подсказкам @KevinCruijssen
-18 байт, больше пробелов, имя функции
-3 байта, благодаря @KevinCruijssen, сокращение при условии
-5 байт Спасибо @Arnold Palmer, @KevinCruijssen, укорочение цикла
Ungolfed
источник
static
можете играть в гольф: могут быть удалены;if(n<0||n>o){return 0;}
можноif(n<0|n>o)return 0;
(|
вместо||
и без скобок);bs
,bsa
и т. д. могут быть одиночными символами (никогда не используйте многобайтовые имена переменных / методов в code-golf); Вы можете комбинироватьint
с, как это:int o=2^32-2,c=0,i=x.length,l=i-1;
. И есть еще кое-что для гольфа. Советы по игре в гольф на Java и советы по игре в гольф на всех языках могут быть интересными для чтения. Снова добро пожаловать, и приятного пребывания! :)if(c[i]=='0'){j++;}
можно по-прежнему использоватьif(c[i]==48)j++;
для -3 байта :) РЕДАКТИРОВАТЬ: Или еще лучше:while(j<2&&i>0){i--;if(c[i]=='0'){j++;}}
может бытьfor(;j<2&i>0;j+=c[i--]==48?1:0);
-8 байт.for(;j<2&i>0;j+=c[--i]==48?1:0);
он должен работать. Ошибка возникает из-i
за длины строки, поэтому изначально вы пытаетесь индексировать за пределами массива. Если вы сделаете предварительный декремент (как показано в обновленном фрагменте), то при первом использовании он получит доступ,c[c.length-1]
как в исходном коде.Java (OpenJDK 8) ,
4438 байтПопробуйте онлайн!
Возвращает 0, если второго нулевого бита не существует.
источник
Машинный код IA-32,
1413 байтовHexDump:
Разборка листинг:
Получает вход в
ecx
; Выход вal
. Возвращает 0 при ошибке.Прежде всего, он инвертирует вход, поэтому он может использовать команды сканирования битов для поиска установленных битов. Он ищет младший значащий установленный бит, сбрасывает его, снова ищет младший значащий установленный бит и возвращает результат.
Если команда битового сканирования не находит какой-либо установленный бит, в документации Intel говорится, что вывод не определен. Однако на практике все процессоры оставляют регистр назначения без изменений в этом случае (как отмечает Коди Грей, документация AMD описывает это поведение как обязательное).
Итак, есть следующие случаи:
not
и остается 0btr
и остается 0 послеbsf
bsf
источник
SALC
+DEC
является очень умными, вы можете сбрить байты, используя только то , что вECX
качестве второйBSF
команды. Единственное, что требуется, - это 1 байт,XCHG
чтобы получить результат,EAX
чтобы его можно было вернуть. Другими словами,not ecx; bsf eax, ecx; btr ecx, eax; bsf ecx, ecx; xchg eax, ecx; ret
ECX
в качестве входного регистра, нам нужно указать GCC использовать соглашение о вызовах fastcall.Dyalog APL, 20 байтов
Использует 1-индексацию, выбрасывает
INDEX ERROR
в случае отсутствия второго нуля.Как?
⍵⊤⍨
- кодировать⍵
как32⍴2
- двоичная строка длиной 32⌽
- обеспечить регресс~
- отрицать (0 → 1, 1 → 0)(⍳32)/⍨
- сжатие с диапазоном 1-32 (оставляя индексы нулей)2⊃
- выбрать второй элементисточник
⍸
)Желе , 13 байт
Попробуйте онлайн!
Использует 1-индексирование, получает в качестве входных данных целое число без знака. Возвращает
0
для не найдено.источник
33
на вход4294967295
(2^32-1
32-битный беззнаковый эквивалент-1
)Желе , 12 байт
Монадическая ссылка, принимающая целое число, использующая опцию unsigned и возвращающая результат с 1 индексом (возвращает 0, если ничего не существует).
Попробуйте онлайн!
или
Попробуй это
Как?
1.
2.
источник
машинный код x86_64,
3432 байтаНе уверен, что это правильный подход, довольно много байтов (оказывается, это не так ):
Попробуйте онлайн!
Спасибо @CodyGray за
-2
байты.источник
BSF
,BSR
,POPCNT
,BT
и т.д. Anatolyg было представлено решение по этим направлениям . Я еще не определил, можно ли его победить. :-por ecx, -1
. Это 3 байта, на 1 байт меньше, чем XOR + NEG. Это не хороший трюк, когда вы не играете в гольф, потому что он вводит ложную зависимость от чтения в регистре назначения, но там вы просто используетеmov ecx, -1
и тратите 5 байтов.8-е , 149 байт
Код комментария
Использование и вывод
источник
R , 66 байт
читает со стандартного ввода; возвращает
0
не второй ноль и место в противном случае.Попробуйте онлайн!
источник