Напишите некоторые операторы, которые будут считать количество единиц в шестнадцатиразрядном целом числе без знака.
Например, если на входе есть 1337
, то результатом является то, 6
что 1337
как шестнадцатиразрядное двоичное число 0000010100111001
содержит шесть.
Ответы:
80386 Машинный код, 4 байта
который принимает целое число
cx
и выводит счетax
, и эквивалентен:А вот
1110- байтовое решение, не использующее POPCNT:что эквивалентно:
источник
ax
иcx
сeax
иecx
изменяет его на 32-битный. Байт-код одинаков для обоих.Python 2, 17 байт
bin
Встроенный возвращает целое число преобразуется в двоичную строку. Затем мы посчитаем1
цифры:источник
J (5 символов)
У J нет явных типов. Это правильно для всех целых чисел.
+/
сумма@
из#:
база два представленияисточник
С 21
Вы сказали «напишите несколько операторов» (а не «функцию»), поэтому я предположил, что число введено,
x
а число 1 возвращеноn
. Если мне не нужно инициализировать,n
я могу сохранить 3 байта.Это адаптация знаменитого выражения
x&x-1
для проверки, если что-то имеет степень 2 (false, если это так, true, если это не так).Вот оно в действии по номеру 1337 из вопроса. Обратите внимание, что вычитание 1 переворачивает младший значащий 1 бит и все нули вправо.
РЕДАКТИРОВАТЬ: для полноты, вот простой алгоритм, который на один байт длиннее (и немного медленнее.)
источник
{}
. Это такая простая задача, я не должен удивляться, что кто-то уже придумал ее.for(n=0;x;x/=2)n+=x&1;
Желе неконкурентоспособное
Этот ответ не является конкурирующим, поскольку язык был создан после публикации заявки.
2 байта:
Jelly - это новый язык, написанный @Dennis, с J-подобным синтаксисом.
Попробуй это здесь .
источник
Pyth, 4 байта
Программа берет число, вес Хэмминга которого можно найти на STDIN.
источник
Юлия,
292719 байтовЭто создает анонимную функцию, которая принимает один аргумент
n
. Чтобы использовать это, назначьте это как-нибудь какf=n->...
и назовите это какf(1337)
.digits()
Функция, при вызове с 2 аргументами, возвращает массив цифр ввода в данной базе. Так чтоdigits(n, 2)
возвращает двоичные цифрыn
. Возьмите сумму массива, и у вас будет число единиц в двоичном представленииn
.источник
count_ones
CJam, 6 байтов
Попробуйте это онлайн здесь
источник
Джо , 4 байта
Это анонимная функция.
Ba
дает двоичное представление числа и/+
суммирует его.источник
R, 24 байта
scan()
читает ввод из стандартного ввода.intToBits()
принимает целое число и возвращает вектор типа,raw
содержащий нули и единицы двоичного представления входных данных.intToBits(scan())>0
возвращает логический вектор, где каждый элемент равен,TRUE
если соответствующий элемент двоичного вектора равен 1 (поскольку все элементы равны 0 или 1 и 1> 0), в противном случаеFALSE
.В R вы можете суммировать логический вектор, чтобы получить количество
TRUE
элементов, поэтому суммирование вектора логики, как указано выше, дает нам то, что мы хотим.Обратите внимание, что
sum()
не может обрабатыватьraw
ввод напрямую, поэтому обходной путь с использованием логики.источник
sum(intToBits(scan()))
бы так же?sum()
не может принимать ввод типаraw
, из которого и возвращаетсяintToBits()
.Рубин, 18 байт
n.to_s(2).count'1'
источник
n.to_s(2).count ?1
тоже работает, но такой же длиныДалее
4849 байтовЕсли нужна фактическая функция, то вторая строка становится
и вы называете это "1337 с". Относительно многословные контрольные слова Форта делают его сложным (на самом деле, они делают много таких сложных).
Изменить: Моя предыдущая версия не правильно обрабатывать отрицательные числа.
источник
Mathematica,
2218 байтСпасибо alephalpha за напоминание о
DigitCount
.источник
ES6 (
342221 байт):Это простая рекурсивная функция, которая может быть сокращена немного больше. Это просто занимает немного и запускается снова:
Попробуйте это на http://www.es6fiddle.net/imt5ilve/ (вам нужно
var
из-за'use strict';
).Я не могу поверить, что я победил Рыбу!
Старый:
ES5 (39 байт):
Обе функции могут быть легко адаптированы к ES5:
Старый:
@ user1455003 дал мне действительно отличную идею, которая «запустила» самую маленькую:
Я адаптировал его к ES6 и сделал его рекурсивным, чтобы значительно сократить его!
источник
> <> (Рыба) , 24 байта + 2 = 26
Программа просто повторяет мод 2, вычитает и делит, пока входное число не станет равным нулю, а затем печатает сумму мод 2.
Тест с
-v
флагом, напримеристочник
-v
PHP (38 байт):
Это использует тот же подход, что и мой ответ ES6
Это полный код, вам нужно всего лишь поместить его в файл и получить к нему доступ через браузер с параметром
n=<number>
.PHP <4.2 (32 байта):
Это немного короче:
Это работает надежно только на PHP <4.2, потому что директива по умолчанию
register_globals
была установленаOff
с PHP4.2 до PHP5.4 (которая к тому времени была удалена).Если вы создадите
php.ini
файл с помощьюregister_globals=On
, это будет работать.Чтобы использовать код, получите доступ к файлу через браузер, используя POST или GET.
@ViniciusMonteiro (38/45 байт):
Он дал 2 действительно хороших предложения, которые имеют очень интересное использование функции
array_sum
:38 байт:
45 байт:
Это действительно отличная идея, и ее можно укоротить еще немного, до 36 байт:
источник
<?=substr_count(decbin(1337),"1");
(34 байта)<?=substr_count(decbin(1337),1);
. Это в сумме 32 байта. Учитывая, что это достаточно другой код, вы не хотите опубликовать его как свой собственный ответ? Я, безусловно, буду голосовать!<?=substr_count(decbin($argv[1]),1);
(или$_GET[n]
; 36 байтов)C #, 45 байт
https://dotnetfiddle.net/kJDgOY
источник
b-48
еще короче,Japt, 3 байта (неконкурентный)
Попробуй это здесь.
источник
¢o1 l
будет работать. Еще один интересный подход-¢¬r-0
;¢¬
разбивается на массив двоичных цифр,r-0
уменьшается на вычитание, начиная с 0, и-
сводит на нет результат, делая его положительным.¢¬x
.пчелиный воск ,
3127 байтНеконкурентный ответ. Пчелиный воск новее, чем этот вызов.
Это решение использует способ Брайана Керигана для подсчета установленных битов с сайта «Bit Twiddling Hacks».
он просто проходит через цикл, увеличивая счетчик битов и повторяя
number=number&(number-1)
доnumber = 0
. Решение проходит через цикл так часто, как установлены биты.Я мог бы сбрить 4 байта, переставив несколько инструкций. Обновлены и исходный код, и пояснения:
Объяснение:
Клонируйте мой репозиторий GitHub, содержащий интерпретатор пчелиного воска, спецификации языка и примеры.
источник
Java, 17 байт
Работает на
byte
,short
,char
иint
. Используйте в качестве лямбды.Тест здесь
Без использования встроенных модулей:
42 байта
Тест здесь
источник
Зажим , 6
2 способа:
Это простой перевод требования: количество единиц в представлении числа в base-2.
Другой метод, который принимает сумму цифр представления base-2.
источник
Октава, 18
Пример:
источник
GML (язык Game Maker), 21 байт
источник
C # 39 байт
источник
Perl, 21
источник
PowerShell (51 байт)
Объяснение:
[convert]::ToString($s,2)
создает двоичное представление строки из$s
.[char[]]
преобразует его в массив символов и позволяет перечислять каждый символ.|%{"+$_"}
каждый символ со знаком «+»"$()"
неявно вызывает.ToString()
результирующее|iex
подвыражение, суммирующее переданную строку (т. е. «+1 +0 +1 +1 +0 +1 +0 +0» = 4)источник
-join
оператор и неявный.ToString()
для получения 45 байтов с[char[]][convert]::ToString($s,2)-join'+'|iex
... ИЛИ, в качестве другого подхода используйте встроенный-replace
оператор для получения 43 байтов с([convert]::ToString($s,2)-replace0).length
Clojure, 42 байта
Чтение справа налево, преобразование в двоичную строку, преобразование в последовательность символов, фильтрация по
1
s и подсчет, сколько у вас есть.Отредактировано с помощью Sieg
источник
#(count(filter #{\1}(Integer/toString% 2)))
#(count(filter #{\1}(Integer/toString % 2)))
CompilerException java.lang.IllegalArgumentException: No matching method: toString_PERCENT_
Integer/toString
. Это сработало секунду назад, хотя.Haskell 42 символа
объявляет использование функции
f :: Integer -> Integer
из интерактивного интерпретатора как
f <number>
или добавляет строкуmain=print$f <number>
в конец файла.источник
rem n 2
s вместо построения списка и используяdiv
вместоquot
:t 0=0
t n=t(div n 2)+rem n 2
- большеf
нет.Matlab, 13 байт
de2bi
создает вектор нулей и единиц, представляющих двоичное число, иsum
просто возвращает сумму всех записей.источник
𝔼𝕊𝕄𝕚𝕟, 4 символа / 11 байт (неконкурентные)
Try it here (Firefox only).
объяснение
Преобразует входные данные в двоичные, разделяет их на символы и получает сумму результирующего массива.
источник