Napisz kilka instrukcji, które będą liczyć liczbę jedności w szesnastobitowej liczbie całkowitej bez znaku.
Na przykład, jeśli dane wejściowe są 1337
, to wynik jest taki, 6
że 1337
jako szesnastobitowa liczba binarna 0000010100111001
zawiera sześć.
Odpowiedzi:
80386 Kod maszynowy, 4 bajty
który przyjmuje liczbę całkowitą
cx
i wyprowadza licznikax
, i jest równoważny z:I tu jest
1110 rozwiązanie bajt nie używając POPCNT:co jest równoważne z:
źródło
ax
icx
zeax
, aecx
zmienia go do 32-bitowych. Kod bajtowy jest taki sam dla obu.Python 2, 17 bajtów
bin
Wbudowaną Zwraca całkowitą konwertowane na ciąg binarny. Następnie zliczamy1
cyfry:źródło
J (5 znaków)
J nie ma jawnych typów. To robi właściwą rzecz dla wszystkich liczb całkowitych.
+/
Suma@
z#:
podstawowa reprezentacja dwóchźródło
C, 21
powiedziałeś „napisz kilka instrukcji” (a nie „funkcję”), więc założyłem, że liczba jest podana,
x
a liczba 1 jest zwróconan
. Jeśli nie muszę inicjowaćn
, mogę zapisać 3 bajty.Jest to adaptacja słynnego wyrażenia
x&x-1
do testowania, czy coś ma potęgę 2 (fałsz, jeśli tak, prawda, jeśli nie jest).Tutaj działa on pod numerem 1337 z pytania. Zauważ, że odjęcie 1 odwraca najmniej znaczący 1 bit i wszystkie zera w prawo.
EDYCJA: dla kompletności, oto naiwny algorytm, który jest o jeden bajt dłuższy (i nieco wolniejszy).
źródło
{}
. To takie proste zadanie, że nie powinienem się dziwić, że ktoś już to wymyślił.for(n=0;x;x/=2)n+=x&1;
Galaretka , niekonkurująca
Ta odpowiedź nie jest konkurencyjna, ponieważ język został utworzony po opublikowaniu wyzwania.
2 bajty:
Jelly to nowy język napisany przez @Dennis, o składni podobnej do J.
Wypróbuj tutaj .
źródło
Pyth, 4 bajty
Program przyjmuje numer, którego ciężar wbijający można znaleźć na STDIN.
źródło
Julia,
292719 bajtówStwarza anonimową funkcję, która przyjmuje jeden argument,
n
. Aby go użyć, przypisz go do czegoś podobnegof=n->...
i nazwij takf(1337)
.digits()
Funkcje, po wywołaniu z 2 argumentów zwraca tablicę cyfr wejścia w danej podstawy.digits(n, 2)
Zwraca więc cyfry binarne zn
. Weź sumę tablicy, a będziesz miał ich liczbę w reprezentacji binarnejn
.źródło
count_ones
CJam, 6 bajtów
Wypróbuj online tutaj
źródło
Joe , 4 bajty
To anonimowa funkcja.
Ba
podaje binarną reprezentację liczby i/+
sumuje ją.źródło
R, 24 bajty
scan()
odczytuje wejście ze standardowego wejścia.intToBits()
przyjmuje liczbę całkowitą i zwraca wektor typuraw
zawierający zera i jedynki reprezentacji binarnej wejścia.intToBits(scan())>0
zwraca logiczny wektor, w którym znajduje się każdy elementTRUE
jeśli odpowiadający mu element binarny to 1 (ponieważ wszystkie elementy mają wartość 0 lub 1 i 1> 0), w przeciwnym razieFALSE
.W R można zsumować wektor logiczny, aby uzyskać liczbę
TRUE
elementów, więc sumowanie wektora logicznego jak wyżej daje nam to, czego chcemy.Zauważ, że
sum()
nie możnaraw
bezpośrednio obsługiwać danych wejściowych, dlatego obejście za pomocą logiki.źródło
sum(intToBits(scan()))
byłoby tak samo?sum()
nie można pobrać typuraw
, który jest zwracanyintToBits()
.Rubinowy, 18 bajtów
n.to_s(2).count'1'
źródło
n.to_s(2).count ?1
również działa, ale ma tę samą długośćDalej,
4849 bajtówJeśli potrzebna jest rzeczywista funkcja, to pojawia się druga linia
i nazywacie to „1337 c”. Stosunkowo szczegółowe słowa kontrolne Fortha sprawiają, że jest to trudne (w rzeczywistości sprawia, że wiele z nich jest trudnych).
Edycja: Moja poprzednia wersja nie obsługiwała poprawnie liczb ujemnych.
źródło
Mathematica,
2218 bajtówDzięki alephalpha za przypomnienie
DigitCount
.źródło
ES6 (
342221 bajtów):Jest to prosta funkcja rekurencyjna, którą można nieco skrócić. To po prostu zajmuje trochę czasu i uruchamia się ponownie:
Wypróbuj na http://www.es6fiddle.net/imt5ilve/ (potrzebujesz
var
powodu'use strict';
).Nie mogę uwierzyć, że pokonałem Fisha !!!
Ten stary:
ES5 (39 bajtów):
Obie funkcje można łatwo dostosować do ES5:
Stary:
@ user1455003 dał mi naprawdę świetny pomysł, który „uruchomił” najmniejszy:
Dostosowałem go do ES6 i sprawiłem, że rekurencyjne jest znaczne skracanie!
źródło
> <> (Ryba) , 24 bajty + 2 = 26
Program po prostu wykonuje powtarzany mod 2, odejmuje i dzieli, aż liczba wejściowa osiągnie zero, a następnie drukuje sumę mod 2s.
Testuj z
-v
flagą, npźródło
-v
flagowa nadal działa.)PHP (38 bajtów):
Używa tego samego podejścia, co moja odpowiedź ES6
Jest to pełny kod, wystarczy umieścić go w pliku i uzyskać do niego dostęp w przeglądarce za pomocą parametru
n=<number>
.PHP <4.2 (32 bajty):
To jest trochę krótsze:
Działa to niezawodnie tylko w PHP <4.2, ponieważ dyrektywa
register_globals
zostałaOff
domyślnie ustawiona od PHP4.2 do PHP5.4 (do tego czasu została usunięta).Jeśli utworzysz
php.ini
plik za pomocąregister_globals=On
, to zadziała.Aby użyć kodu, uzyskaj dostęp do pliku za pomocą przeglądarki, używając POST lub GET.
@ViniciusMonteiro 's sugestie (38/45 bytes):
Podał 2 naprawdę dobre sugestie, które mają bardzo ciekawe zastosowanie tej funkcji
array_sum
:38 bajtów:
45 bajtów:
To naprawdę świetny pomysł i można go nieco skrócić, aby miał 36 bajtów:
źródło
<?=substr_count(decbin(1337),"1");
(34 bajty)<?=substr_count(decbin(1337),1);
. To w sumie 32 bajty. Biorąc pod uwagę, że jest to wystarczająco inny kod, czy nie chcesz go opublikować jako własnej odpowiedzi? Na pewno będę go głosować!<?=substr_count(decbin($argv[1]),1);
(lub$_GET[n]
; 36 bajtów)C #, 45 bajtów
https://dotnetfiddle.net/kJDgOY
źródło
b-48
jest jeszcze krótszy, AFAIKJapt, 3 bajty (niekonkurencyjny)
Wypróbuj tutaj.
źródło
¢o1 l
by działał. Innym interesującym podejściem jest-¢¬r-0
;¢¬
dzieli się na tablicę cyfr binarnych,r-0
zmniejsza odejmując, zaczynając od 0, i-
neguje wynik, czyniąc go dodatnim.¢¬x
.wosk pszczeli ,
3127 bajtówOdpowiedź niekonkurencyjna. Wosk pszczeli jest nowszy niż to wyzwanie.
W tym rozwiązaniu Brian Kherigan zlicza zestawy bitów ze strony internetowej „Bit Twiddling Hacks”.
po prostu przebiega przez pętlę, zwiększając liczbę bitów, i iterując
number=number&(number-1)
aż donumber = 0
. Rozwiązanie przechodzi przez pętlę tylko tak często, jak jest ustawionych bitów.Mógłbym ogolić 4 bajty, zmieniając kilka instrukcji. Zaktualizowano kod źródłowy i objaśnienie:
Wyjaśnienie:
Sklonuj moje repozytorium GitHub zawierające interpreter wosku pszczelego, specyfikację języka i przykłady.
źródło
Java, 17 bajtów
Działa na
byte
,short
,char
, iint
. Użyj jako lambda.Przetestuj tutaj
Bez użycia wbudowanych:
42 bajty
Przetestuj tutaj
źródło
Klip , 6
2 drogi:
Jest to proste tłumaczenie tego wymogu: liczba jedynek w reprezentacji liczby podstawowej 2.
Inna metoda, która przyjmuje sumę cyfr reprezentacji base-2.
źródło
Oktawa, 18 lat
Przykład:
źródło
GML (Game Maker Language), 21 bajtów
źródło
C # 39 bajtów
źródło
Perl, 21
źródło
PowerShell (51 bajtów)
Objaśnienie:
[convert]::ToString($s,2)
tworzy binarną reprezentację ciągu znaków z$s
.[char[]]
rzuca go jako tablicę znaków i pozwala nam wyliczyć każdy znak.|%{"+$_"}
poprzedza każdy znak znakiem +"$()"
niejawnie wywołuje.ToString()
wynikowe wyrażenie podrzędne|iex
sumuje potokowy ciąg znaków (tj. „+1 +0 +1 +1 +0 +1 +0 +0” = 4)źródło
-join
operatora wbudowanego i niejawnego,.ToString()
aby osiągnąć 45 bajtów z[char[]][convert]::ToString($s,2)-join'+'|iex
... LUB, jako inne podejście użyć-replace
operatora wbudowanego , aby uzyskać 43 bajty z([convert]::ToString($s,2)-replace0).length
Clojure, 42 bajty
Czytanie od prawej do lewej, konwersja na ciąg binarny, konwersja na ciąg znaków, filtrowanie
1
si i liczenie, ile masz.EDYCJA Z pomocą Sieg
źródło
#(count(filter #{\1}(Integer/toString% 2)))
#(count(filter #{\1}(Integer/toString % 2)))
CompilerException java.lang.IllegalArgumentException: No matching method: toString_PERCENT_
Integer/toString
. Ale działało to sekundę temu.Haskell 42 znaki
deklaruje
f :: Integer -> Integer
użycie funkcji z interaktywnego interpretera jako
f <number>
lub dodaje linięmain=print$f <number>
na końcu pliku.źródło
rem n 2
zamiast budując ich listę i używającdiv
zamiastquot
:t 0=0
t n=t(div n 2)+rem n 2
-f
już nie .Matlab, 13 bajtów
de2bi
tworzy wektor zer i jedynek reprezentujących liczbę binarną, isum
po prostu zwraca sumę wszystkich wpisów.źródło
𝔼𝕊𝕄𝕚𝕟, 4 znaki / 11 bajtów (niekonkurencyjne)
Try it here (Firefox only).
Wyjaśnienie
Konwertuje dane wejściowe na binarne, dzieli wzdłuż znaków i otrzymuje sumę wynikowej tablicy.
źródło