вдохновленный отсчет от бесконечности
Если задано неотрицательное целое число N
, выведите число повторений следующих шагов, необходимых для достижения 0:
- Преобразовать
N
в двоичный файл (4812390 -> 10010010110111001100110
) - Отразить каждый бит (
10010010110111001100110 -> 01101101001000110011001
) - Обрезать ведущие нули (
01101101001000110011001 -> 1101101001000110011001
) - Преобразовать обратно в десятичную (
1101101001000110011001 -> 3576217
)
правила
- Ввод и вывод могут быть в любом однозначном, согласованном формате
- Входные данные будут в пределах диапазона представимых целых чисел для вашего языка (если ваш язык поддерживает произвольно большие целые числа, граница не существует)
Тестовые случаи
0 -> 0
1 -> 1
42 -> 6
97 -> 3
170 -> 8
255 -> 1
682 -> 10
8675309 -> 11
4812390 -> 14
178956970 -> 28
2863311530 -> 32
Эта последовательность A005811 в OEIS.
~(~a) == a
Ответы:
Желе ,
64 байтаПопробуйте онлайн! или проверьте все контрольные примеры .
Фон
Пусть n будет неотрицательным целым числом.
Шаги 2 и 3 процесса, описанного в спецификации, в качестве альтернативы могут быть указаны как удаление всех первых 1 и переключение оставшихся битов.
Это означает, что мы будем удалять ровно одну группу смежных и равных двоичных цифр в каждой итерации, поэтому длина двоичного обратного отсчета n - это просто число этих групп в двоичном представлении n . Для целей этой задачи представьте, что 0 не имеет цифр.
Для n = 8675309 процесс выглядит в двоичном виде следующим образом.
Вместо того, чтобы считать эти группы (что не получится для граничного случая 0 ), мы делаем следующее.
n и n: 2 имеют следующие двоичные представления.
Обратите внимание, что двоичное представление n: 2 - это просто n , сдвинутое на один бит влево.
Если мы XOR n и n: 2 , мы получим 1 (MSB) и дополнительно 1 для каждой пары различных соседних цифр. Количество групп, таким образом, равно количеству установленных битов в n ⊻ n: 2 .
Как это устроено
источник
Python 2, 30 байт
Проверьте это на Ideone .
Фон
Пусть n будет неотрицательным целым числом.
Шаги 2 и 3 процесса, описанного в спецификации, в качестве альтернативы могут быть указаны как удаление всех первых 1 и переключение оставшихся битов.
Это означает, что мы будем удалять ровно одну группу смежных и равных двоичных цифр в каждой итерации, поэтому длина двоичного обратного отсчета n - это просто число этих групп в двоичном представлении n . Для целей этой задачи представьте, что 0 не имеет цифр.
Для n = 8675309 процесс выглядит в двоичном виде следующим образом.
Вместо того, чтобы считать эти группы (что не получится для граничного случая 0 ), мы делаем следующее.
n и n: 2 имеют следующие двоичные представления.
Обратите внимание, что двоичное представление n: 2 - это просто n , сдвинутое на один бит влево.
Если мы XOR n и n: 2 , мы получим 1 (MSB) и дополнительно 1 для каждой пары различных соседних цифр. Количество групп, таким образом, равно количеству установленных битов в n ⊻ n: 2 .
источник
Python 2, 29 байт
Подсчитывает количество чередований от 0 до 1 в двоичном расширении, считая начальную 1 как чередование. Делает это, проверяя, отличаются ли последние две двоичные цифры, затем возвращаясь к числу с удаленной последней цифрой. Последние две цифры отличаются точно, если
n%4
это 1 или 2, которые можно проверить как-n%4/2
.источник
JavaScript (ES6), 26 байт
Работает путем подсчета переходов между 0 и 1. Работает только до 31 бита. 29 байтов для поддержки 53 битов:
источник
Haskell, 34 байта
источник
05AB1E ,
75 байтовСохранено 2 байта благодаря Денису .
Без граничного случая 0 это может быть 3 байта
bÔg
.Попробуйте онлайн! или как тестовый набор
объяснение
источник
CJam , 14 байтов
Попробуйте онлайн!
В основном подделка моего ответа на другой вопрос.
источник
Java 7,
112 108 100 9073 байтаОсновная идея
источник
j=j/2
можно сократить доj/=2
. Помимо этого отличный ответ!int c(int i){return i>0?((i^(i>>=1))%2+c(i):0;}
( 47 байт ). Я бы все же оставил ваш текущий ответ, так как он более оригинальный, а порты других пользователей - полная противоположность оригиналу. :)J, 14 байт
Подсчитывает количество прогонов в двоичных цифрах n, а в специальном случае возвращается 0 для n = 0.
использование
объяснение
источник
CJam ,
1110 байтСпасибо @Dennis за сохранение одного байта!
Попробуйте онлайн!
объяснение
источник
e&
(логическое И) сохраняет байт\g*
.Ракетка 349 байт
Ungolfed:
Тестирование:
Выход:
источник
tl
иib
1-байтовые имена.MATL , 7 байт
Попробуйте онлайн!
объяснение
источник
Vim,
6259 байт-3 байта благодаря DJMcMayhem
Вот вывод xxd с непечатными неповрежденными символами:
Попробуйте онлайн!
объяснение
источник
:s/^0*
на один байт короче:s/^0\+
, и пока вы находитесь в регистре «eval», вы можете просто сделатьpr<S-tab>'%b',<C-r>")
автозаполнение. (Сохраняет 4 байта):s/^0*
потому что он соответствует пустой строке, и мне нужно, чтобы он потерпел неудачу из-за пустой пустой строки, чтобы избежать рекурсивного макроса.Рубин, 26 байт
Вдохновленный ответом xnor на Python.
источник
PHP, 64 байта
на основе моего решения обратного отсчета
печатает время
1
символаk
, гдеk
число итераций.+4 байта для целочисленного вывода: (пустой вывод для
0
)источник
JavaScript (ES6), 44
Рекурсивная функция
Ограничено положительным целым числом javascript, 31 бит:
Управление числом двойной точности до 53 значащих бит - 59 байтов:
Другим способом: используя потрясающий алгоритм @Dennis, нерекурсивную функцию, управляющую 53 битами, 43 байтами:
источник
PHP, 51 байт
Использует регулярное выражение для подсчета количества прогонов 1 или 0. К сожалению, для этого требуется особый случай для ввода,
0
который требует 3 дополнительных байта (и выдает уведомление).источник
o
чтобы избежать уведомления. б) Вы можете сохранить 3 байта с-F
флагом и$argn
вместо$argv[1]
. в)/1+|0+/
должно хватить для регулярного выражения.Java 7, 71 байт
int b(Long a){return a==0?0:1+b(~a&-1L>>>64-a.toString(a,2).length());}
Я знаю , что это избита Geobits'
split
решение (которое в конечном итоге будет размещено) , но это было еще интересно писатьисточник
Октава, 47 байт
Согласно записи OEIS, ценность, которую мы ищем как решение этой проблемы, также равно числу
1
s в коде Грея для данного целого числа.Википедия говорит мне, что код Грея можно вычислить как x ^ (x >> 1), поэтому в приведенной выше функции я вычисляю код Грея как таковой, преобразую его в двоичную строку и подсчитываю, сколько цифр этой строки
1
.источник
Java 7, 64 байта
Я знаю, что это могло быть побито портом одного из лучших ответов, но я придумал это в чате, и я не могу не публиковать его после того, как Пок сказал что-то об этом :)
источник
C, 76 байт
Работает для всех тестовых случаев (насколько я не хочу включать слово unsigned или последний тестовый случай) ...
источник
Баш, 57 байт
Пакеты: Основные утилиты, grep, sed, vim (для
xxd
)Предположим, что номер указан в двоичном формате. Любая длина приемлема :)
источник
Perl 5 , 31 + 1 (
p
) = 32 байтаПопробуйте онлайн!
Используя метод @ Денниса.
источник
Tcl , 119 байт
Попробуйте онлайн!
Все еще очень безрассудно на мой вкус
источник