Описание
Учитывая число, выведите количество 1
s в двоичном представлении.
вход
Число >= 0
в базе 10, которое не будет превышать наибольшее число, которое может обработать ваш язык.
Выход
Количество 1
s в двоичном представлении.
Выигрышное условие
Самый короткий код выигрывает.
Disallowed
- Битовые операторы. Другие операторы, такие как сложение и умножение, разрешены.
- Встроенные базовые функции преобразования.
Примеры
Input: Ouput:
56432 8
Input: Output:
45781254 11
Input: Output:
0 0
Ответы:
APL,
912 символовЭто предполагает, что интерпретатор использует 32-битные целые числа, и это
⎕IO
установлено в 0 (что означает, что монадический⍳
начинается с 0, а не с 1). Я использовал 32-битную версию Dyalog APL .Пояснение справа налево:
⍳32
генерирует вектор первых32
целых чисел (как объяснено ранее, потому что⎕IO
равен 0, этот вектор начинается с 0).*
является степенной функцией. В этом случае он генерирует2
в степень каждого элемента вектора, представленного в качестве правильного аргумента.÷
это функция делится на Это дает нам⎕
(оцененный пользовательский ввод), разделенный на каждый элемент вектора справа (каждая степень два).⌊
этажи каждого элемента аргумента вправо.2|
дает нам остаток каждого элемента справа от него, деленный на2
./
уменьшает (складывает) свой правый аргумент, используя функцию слева+
,.Не совсем 9 символов больше. :(
Старая, нарушающая правила версия:
источник
Built-in base conversion functions
противоречие?Brainbool , 2
На мой взгляд, наиболее разумное толкование (и то, что используется в большинстве ответов) слова «наибольшее число, на которое способен ваш язык», - это «наибольшее число, которое поддерживает ваш родной язык ». Brainbool - это производная мозга, которая использует биты, а не байты, и принимает ввод и вывод в двоичном (
0
и1
символьном), а не символьном коде. Таким образом, наибольшее число, поддерживаемое изначально1
, и наименьшее0
, которые имеют веса Хэмминга1
и0
соответственно.По словам Эсоланга, Brainbool был создан в 2010 году.
источник
J, 13 символов
(+ количество цифр в номере)
Использование: замените
n
в программе номер для тестирования.Примеры:
Вероятно, есть способ изменить это так, чтобы число можно было поместить в начале или в конце, но это моя первая запись J, и моя голова сейчас немного болит.
Объяснение (в основном, чтобы я понял это в будущем)
i.32
- создает массив чисел от 1 до 322^
- превращает список в полномочия двух от 1 до 4294967296n%
- делит введенный номер на каждый элемент в списке<.
- округляет все результаты деления до следующего целого числа2|
- так же, как и%2
в большинстве языков - возвращает 0 если четное и 1 если нечетное+/
- суммирует элементы в списке (которые теперь просто 1 или 0)источник
Brainfuck, 53 персонажа
В нем отсутствовало обязательное решение Brainfuck, поэтому я сделал это:
Берет число из ячейки 1 и помещает результат в ячейку 6.
Неконтролируемая и комментируемая версия:
источник
Python 2.6, 41 символ
примечание: мой другой ответ использует лямбду и рекурсию, а этот использует цикл while. Я думаю, что они достаточно разные, чтобы оправдать два ответа.
источник
Рубин, 38 знаков
Другое решение, использующее ruby и тот же рекурсивный подход, что и у Steven.
источник
GolfScript,
1716 символовРедактировать: новая версия сохраняет 1 символ, используя операцию списка вместо сгиба (оригинальная версия была
~{.2%\2/.}do]{+}*
, версия с прямым счетом:)~0\{.2%@+\2/.}do;
.источник
С, 45
Здесь нет ничего особенного для игры в гольф на C: неявный возвращаемый тип, неявный целочисленный тип для параметров.
источник
Python 2.6, 45 символов
источник
def
вместо лямбды.print b(input())
. Допустимо возвращать значение и принимать «вход» в качестве аргументов для функций.Perl,
454336 персонажейСпасибо Говарду за 45-> 43 и Пользователю 606723 за 43-> 36.
источник
$n=int($n/2)
какие 2 символа короче.$n=<>;while($n){$_+=$n%2;$n/=2}print
Это будет повторяться до тех пор, пока $ n / 2, наконец, не станет достаточно близко к 0, но нас это волнует? ;)Perl, 30 символов
На основе решения PhiNotPi , с некоторыми дополнительными играми в гольф. Запустите с,
perl -M5.010
чтобы включить функцию Perl 5.10say
.источник
$=
делать специальная переменная ничего особенного в вашей программе, или это просто еще один обычный переменной?$=
принимает только целые значения, поэтому его использование спасает меняint
.Common Lisp, 12 символов
(при условии, что имя переменной в 1 символ - то есть: 11 + длина числа)
Это не базовая функция преобразования, поэтому она должна работать:
Примеры:
(Используя GNU CLISP.)
источник
C
61 60 5753 символовТело функции только 38 символов. Редактировать : убрать побитовый оператор Редактировать : вывести
printf
из цикла, как предложено в комментариях Редактировать : перейти к объявлению K & R; кроме того, это больше не специфично для C99источник
DC - 26 символов
Это довольно долго, в основном из-за отсутствия конструкций цикла в
dc
.Продолжает складывать по модулю 2 числа и делить число на, пока оно не достигнет нуля. Может обрабатывать произвольно длинные целые числа.
Пример:
источник
C, 66 знаков
Примечание: требуется gcc или gcc-совместимый компилятор (например, ICC, clang).
Для некоторых процессоров
__builtin_popcount
компилируется в одну инструкцию (например,POPCNT
на x86).источник
__builtin_popcount
самом деле просто выполняет подсчет1
s? Если это так, хотя это не совсем неправильно в соответствии с правилами, я, честно говоря, не думаю, что это справедливый вход.printf
без предварительного включения.C++
JavaScript,
78 7271 символовЯ опубликую свое первоначальное решение, которое я придумал, прежде чем публиковать вопрос. Ответ на JavaScript уже намного лучше :)
http://jsfiddle.net/Mk8zd/1/
Идея исходит из определенных «карт чтения мыслей», которые позволяют вам получить номер, который имеет в виду кто-то другой, показывая им карты и позволяя им говорить, на каких картах их число очевидно.
Это работает, потому что каждое число является уникальной комбинацией
1
с /0
х в двоичном виде. Мое решение проверяет, на каких «карточках» число очевидно, чтобы определить, сколько у1
него s. Это просто не очень эффективно, хотя ...Я нашел этот документ, который описывает технику чтения мыслей.
источник
Haskell (60 символов)
источник
PHP, 57
Это предполагает, что
$n
содержит значение для тестирования.PHP, 55 (альтернативное решение)
Опять же, это предполагает, что
$n
содержит значение для тестирования. Это альтернатива, потому что она использует операторfloor
ввода или для ввода.Оба решения работают и не вызывают уведомления.
источник
Окамль, 45 знаков
Основано на решении @Leah Xue. Можно удалить три пробела, и это немного короче (~ 3 символа), чтобы использовать функцию вместо if-then-else.
источник
Mathematica 26
источник
Скала, 86 символов
Использование:
scala O 56432
источник
D (70 символов)
источник
R, 53 символа
o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0};o(scan())
Примеры:
Если ввод числа не является частью числа символов, то это 43 символа:
o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0}
с тестами
источник
OCaml, 52 символа
источник
Схема
Я немного отточил правила, чтобы добавить к проблеме. Функция не заботится о базе числа, потому что она использует свою собственную двоичную шкалу. Я был вдохновлен тем, как работает аналог для преобразования чисел. Я просто использую простую рекурсию для этого:
источник
Разве считывание числа в двоичный файл или вывод числа из двоичного кода не является «встроенной базовой функцией преобразования», что делает недействительным каждый ответ выше,
print
являющийся целым числом? Если вы разрешите чтение и печать целого числа, как это делают почти все приведенные выше ответы, тогда я буду выдвигать претензии с помощью встроенногоpopcount
функцию :Хаскелл, 50
Этим летом
popCount
вData.Bits
модуль была добавлена подпрограмма для GHC v7.2.1 / v7.4.1 (см. Тикеты, касающиеся примопа и привязки ).К сожалению, я не могу побить вышеупомянутые оценки Python и Perl, используя их
GMPY
илиGMP::Mpz
модули для GMP, хотя GMP также предлагает функцию popcount .источник
JavaScript,
49474542 байтаДемо: http://jsfiddle.net/hcYdx/4/
Редактировать 1: удалить
q
и использовать~~
для округления, сохранить 2 символа.Правка 2: используйте
|0
оператор округления вместо~~
сохранения скобок (2 символа).Редактирование 3: упростить ,
n>0
чтобыn
и в сочетании с ,n=n/2|0
чтобы все условия; сейчас потратили пустое пространство :(источник
|0
побитовый оператор?|
побитовый оператор ... это запрещено. Время делатьMath.round
:-)Java 7, 36 байт
Потому что, конечно, это то, для чего Java имеет встроенную функцию ...
источник
bitCount
работает под капотом.TI-Basic (TI-84 Plus CE), 30 байтов
TI-Basic является Разбивается на лексемы язык, все маркеры , но
remainder(
являются один байт , остаток дваисточник
PHP, 36 байт
Предполагается, что
$n
это число, которое нужно протестировать, оно показывает уведомление PHP$o
и не работает точно, когда$n
равно 0 (ничего не выводит).PHP, 53 байта
Принимает ввод из командной строки, не отображает уведомление PHP и выводит правильно для 0.
источник