Opis
Biorąc pod uwagę liczbę, wypisz jej liczbę 1
w reprezentacji binarnej.
Wejście
Liczba >= 0
w bazie 10, która nie przekroczy najwyższej liczby, którą Twój język jest w stanie obsłużyć.
Wynik
Ilość 1
s w reprezentacji binarnej.
Warunki wygranej
Najkrótszy kod wygrywa.
Niedozwolone
- Operatory bitowe. Inne operatory, takie jak dodawanie i mnożenie, są dozwolone.
- Wbudowane podstawowe funkcje konwersji.
Przykłady
Input: Ouput:
56432 8
Input: Output:
45781254 11
Input: Output:
0 0
Odpowiedzi:
APL,
912 znakówZakłada się, że interpreter używa 32-bitowych liczb całkowitych i
⎕IO
jest ustawiony na 0 (co oznacza, że monadyczny⍳
zaczyna się od 0, a nie od 1). Użyłem 32-bitowej wersji Dyalog APL .Objaśnienie, od prawej do lewej:
⍳32
generuje wektor pierwszego32
liczb całkowitych (jak wyjaśniono wcześniej, ponieważ⎕IO
wynosi 0, ten wektor zaczyna się od 0).*
jest funkcją mocy. W tym przypadku generuje2
do potęgi każdego elementu wektora podanego jako jego właściwy argument.÷
jest funkcją podzieloną przez. Daje nam⎕
(ocenione dane wejściowe użytkownika) podzielone przez każdy element wektora po jego prawej stronie (każda potęga dwóch).⌊
podłoga każdego elementu argumentu po jego prawej stronie.2|
daje nam resztę każdego elementu po prawej stronie podzieloną przez2
./
zmniejsza (fałduje) swój prawy argument za pomocą funkcji po lewej,+
.Już niecałe 9 znaków. :(
Stara, przełomowa wersja:
źródło
Built-in base conversion functions
?Brainbool , 2
Moim zdaniem najbardziej rozsądną interpretacją (i tego, z czego korzysta większość odpowiedzi) „największej liczby, jaką Twój język jest w stanie obsłużyć”, jest „największa liczba, którą Twój język obsługuje natywnie ”. Brainbool to pochodna od pieprzenia mózgów, która używa bitów zamiast bajtów i pobiera dane wejściowe i wyjściowe w postaci binarnej (
0
i1
znaków), a nie kodów znaków. Dlatego jest to największa obsługiwana liczba natywnie1
, a najmniejszy0
, który ma wagi Hamminga1
i0
odpowiednio.Brainbool został stworzony w 2010 roku, zgodnie z Esolang.
źródło
J, 13 znaków
(+ liczba cyfr w liczbie)
Sposób użycia: zastąp
n
w programie numerem do przetestowania.Przykłady:
Prawdopodobnie istnieje sposób na zmianę tego ustawienia, aby numer mógł być umieszczony na początku lub na końcu, ale to jest mój pierwszy wpis w J i głowa trochę mnie teraz boli.
Wyjaśnienie (głównie po to, aby je zrozumieć w przyszłości)
i.32
- tworzy tablicę liczb od 1 do 322^
- zamienia listę w potęgi dwóch 1 do 4294967296n%
- dzieli numer wejściowy przez każdy element na liście<.
- zaokrągla wszystkie wyniki dywizji w dół do następnej liczby całkowitej2|
- tak samo jak%2
w większości języków - zwraca 0, jeśli parzyste i 1, jeśli nieparzyste+/
- sumuje pozycje na liście (które są teraz tylko 1s lub 0s)źródło
Brainfuck, 53 znaki
Brakowało obowiązkowego rozwiązania Brainfuck, więc zrobiłem to:
Pobiera liczbę z komórki 1 i umieszcza wynik w komórce 6.
Wersja niezarejestrowana i skomentowana:
źródło
Python 2.6, 41 znaków
Uwaga: Moja druga odpowiedź używa lambda i rekurencji, a ta wykorzystuje pętlę while. Myślę, że są na tyle różne, że uzasadniają dwie odpowiedzi.
źródło
Ruby, 38 znaków
Inne rozwiązanie wykorzystujące ruby i to samo rekurencyjne podejście jak Steven.
źródło
GolfScript,
1716 znakówEdycja: nowa wersja zapisuje 1 znak, używając operacji listy zamiast składania (pierwotna wersja to wersja z
~{.2%\2/.}do]{+}*
bezpośrednim zliczaniem:)~0\{.2%@+\2/.}do;
.źródło
C, 45
Nie ma tu nic specjalnego do gry w golfa w C: niejawny typ zwrotu, niejawny typ liczbowy dla parametrów.
źródło
Python 2.6, 45 znaków
źródło
def
zamiast lambda.print b(input())
. Dopuszczalne jest zwrócenie wartości i przyjęcie „danych wejściowych” jako argumentów funkcji.Perl,
454336 znakówDzięki Howard za 45-> 43 i User606723 za 43-> 36.
źródło
$n=int($n/2)
2 znaków krótszych.$n=<>;while($n){$_+=$n%2;$n/=2}print
To będzie się powtarzać, dopóki $ n / 2 w końcu nie zbliży się wystarczająco do 0, ale czy nas to obchodzi? ;)Perl, 30 znaków
Oparty na rozwiązaniu PhiNotPi , z dodatkowym golfem. Uruchom za pomocą,
perl -M5.010
aby włączyć funkcję Perla 5.10say
.źródło
$=
zmienna specjalna robi coś specjalnego w twoim programie, czy jest to tylko zwykła zmienna?$=
przyjmuje tylko wartości całkowite, więc użycie go oszczędza miint
.Common Lisp, 12 znaków
(przyjmując nazwę zmiennej o 1 znaku - tj. 11 + długość liczby)
To nie jest podstawowa funkcja konwersji, więc powinna działać:
Przykłady:
(Korzystanie z GNU CLISP.)
źródło
C,
61 60 5753 znakówTreść funkcji ma tylko 38 znaków. Edytuj : usunięto bitowego operatora Edytuj :
printf
wyjdź z pętli, jak sugerowano w komentarzach Edytuj : przełącz na deklarację K&R; nie jest to już specyficzne dla C99źródło
dc - 26 znaków
Jest to dość długie, głównie z powodu braku konstrukcji pętli w
dc
.Kontynuuje sumowanie modulo 2 liczby i dzielenie liczby przez, aż do osiągnięcia zera. Może obsługiwać dowolnie długie liczby całkowite.
Przykład:
źródło
C, 66 znaków
Uwaga: wymaga kompilatora gcc lub kompatybilnego z gcc (np. ICC, clang).
Dla niektórych procesorów
__builtin_popcount
kompiluje się do pojedynczej instrukcji (np.POPCNT
Na x86).źródło
__builtin_popcount
rzeczywistości po prostu implementuje liczenie1
samego s? Jeśli tak, chociaż nie jest to całkowicie niezgodne z zasadami, szczerze mówiąc, nie sądzę, aby było to uczciwe wejście.printf
bez wcześniejszego włączenia.C++
JavaScript,
78 7271 znakówZamieszczę moje wstępne rozwiązanie, które wymyśliłem przed opublikowaniem pytania. Istnieje jednak znacznie lepsza odpowiedź JavaScript :)
http://jsfiddle.net/Mk8zd/1/
Pomysł pochodzi z pewnych „kart do czytania w myślach”, które pozwalają uzyskać numer, który ma na myśli ktoś inny, pokazując im karty i pozwalając im powiedzieć, na których kartach ich liczba jest widoczna.
Działa, ponieważ każda liczba jest unikalną kombinacją
1
s /0
s binarnie. Moje rozwiązanie sprawdza, które „karty” numer jest widoczny, aby ustalić, ile1
ma. To po prostu mało wydajne, chociaż ...Znalazłem ten dokument, który opisuje technikę czytania w myślach.
źródło
Haskell (60 znaków)
źródło
PHP, 57
Zakłada się, że
$n
zawiera wartość do przetestowania.PHP, 55 (rozwiązanie alternatywne)
Ponownie zakłada się, że
$n
zawiera wartość do przetestowania. Jest to alternatywa, ponieważ używa operatora or-tofloor
danych wejściowych.Oba rozwiązania działają i nie powodują powiadomień.
źródło
Ocaml, 45 znaków
Na podstawie rozwiązania @Leah Xue. Można usunąć trzy spacje i jest on nieco krótszy (~ 3 znaki), aby użyć funkcji zamiast if-then-else.
źródło
Mathematica 26
źródło
Scala, 86 znaków
Stosowanie:
scala O 56432
źródło
D (70 znaków)
źródło
R, 53 znaki
o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0};o(scan())
Przykłady:
Jeśli wpisanie liczby nie jest częścią liczby znaków, to jest 43 znaków:
o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0}
z przypadkami testowymi
źródło
OCaml, 52 znaki
źródło
Schemat
Trochę dopracowałem zasady, aby dodać do wyzwania. Funkcja nie dba o podstawę liczby, ponieważ używa własnej skali binarnej. Zainspirował mnie sposób, w jaki działa konwersja analogowa na numeryczną. Po prostu używam do tego zwykłej rekurencji:
źródło
Czy wczytywanie liczby do pliku binarnego lub drukowanie numeru z pliku binarnego nie jest „wbudowaną funkcją konwersji bazy”, a tym samym unieważnia każdą odpowiedź powyżej
print
liczby całkowitej? Jeśli zezwalasz na odczytywanie i drukowanie liczb całkowitych, tak jak robią to prawie wszystkie powyższe odpowiedzi, wtedy zgłaszam roszczenia za pomocą wbudowanejpopcount
funkcji :Haskell, 50
Nie było
popCount
rutynowe dodana doData.Bits
modułu dla GHC v7.2.1 / v7.4.1 tego lata (patrz bilety dotycząca primop i wiążące ).Niestety nie mogę pobić powyższych wyników w Pythonie i Perlu, używając ich modułów
GMPY
lubGMP::Mpz
GMP, chociaż GMP oferuje również funkcję popcount .źródło
JavaScript,
49474542 bajtówDemo: http://jsfiddle.net/hcYdx/4/
Edycja 1: usuń
q
i użyj~~
do zaokrąglania, zapisz 2 znaki.Edycja 2: użyj
|0
operatora zaokrąglania zamiast~~
zapisywać nawiasy (2 znaki).Edycja 3: uprościć
n>0
don
i połączyć zen=n/2|0
aby całą sytuację; teraz zmarnowałem miejsce na wyciągi :(źródło
|0
operator bitowy?|
jest operatorem bitowym ... jest niedozwolony. Czas na zrobienieMath.round
:-)Java 7, 36 bajtów
Ponieważ, oczywiście, jest to coś, co Java ma wbudowane w ...
źródło
bitCount
działa pod maską.TI-Basic (TI-84 Plus CE), 30 bajtów
TI-Basic jest tokenizowanym językiem, wszystkie tokeny
remainder(
są jednobajtowe , reszta to dwaźródło
PHP, 36 bajtów
Zakłada, że
$n
jest to liczba do przetestowania, pokazuje Powiadomienie PHP$o
i nie działa dokładnie, kiedy$n
is 0 (outputs nothing).PHP, 53 bajty
Akceptuje dane wejściowe z wiersza poleceń, nie wyświetla powiadomienia PHP i wypisuje poprawnie dla 0.
źródło