비트 연산자를 사용하지 않고 이진수로 1의 양을 인쇄하십시오.


14

기술

숫자가 주어지면 1s 의 양을 이진 표현으로 인쇄하십시오 .

입력

다수의 >= 0가장 높은 숫자를 당신의 언어를 초과하지 않습니다 기본 10은 처리 할 수 있습니다.

산출

1이진 표현에서 s 의 양입니다 .

승리 조건

가장 짧은 코드가 승리합니다.

허용되지 않음

  • 비트 연산자. 더하기 및 곱하기와 같은 다른 연산자도 허용됩니다.
  • 기본 변환 기능 내장.

Input:     Ouput:

56432      8


Input:     Output:

45781254   11


Input:     Output:

0          0

기능이 허용됩니까? Java 솔루션을 만들고 싶지만 전체 코드 작성이 너무 지루합니다 ... : /
HyperNeutrino

1
나는 이 도전에 와이즈 를 사용하지 않을 것 같다 ... :)
MildlyMilquetoast

답변:


16

APL, 9 12 자

+/2|⌊⎕÷2*⍳32

이것은 인터프리터가 32 비트 정수를 사용하고 ⎕IO0으로 설정되어 있다고 가정합니다 (단, monadic 은 1이 아니라 0으로 시작 함을 의미합니다 ). 32 비트 버전의 Dyalog APL을 사용했습니다 .

오른쪽에서 왼쪽으로 설명 :

  • ⍳32첫 번째 32정수로 구성된 벡터를 생성합니다 (앞에서 설명한 것처럼 ⎕IO0이므로이 벡터는 0으로 시작 함).
  • *전원 함수입니다. 이 경우 2올바른 인수로 제공된 벡터의 각 요소의 검정력을 생성 합니다.
  • ÷나누기 기능입니다. 이것은 우리에게 제공 (평가 사용자 입력)의 우측 (각각 두개의 전력)을 벡터의 각 요소로 분할한다.
  • 인수의 각 요소를 오른쪽에 배치합니다.
  • 2|각 요소의 나머지를 오른쪽으로 나눈 값을로 나눕니다 2.
  • /왼쪽에있는 함수를 사용하여 오른쪽 인수를 줄입니다 () +.

더 이상 9 글자가 아닙니다. :(

오래된 규칙을 위반 한 버전 :

+/⎕⊤⍨32/2

오른쪽에서 왼쪽으로 설명 :

  • 32/2: 복제 2, 32배.
  • dyadic 함수를 왼쪽으로 통근합니다.이 경우에는 (즉, X⊤⍨Y에 해당 Y⊤X)
  • 인코딩 기능입니다. 왼쪽에 주어진 기본에서 오른쪽으로 정수를 인코딩합니다. 출퇴근 연산자로 인해 오른쪽 및 왼쪽 인수가 전환됩니다. 따라서 필요한 자릿수만큼 밑이 반복됩니다 32/2.
  • 사용자 입력을 받아 평가하는 나일 함수입니다.
  • +/를 사용하여 올바른 인수를 줄 +입니다. (0과 1을 더합니다.)

2
이것이 Built-in base conversion functions금기 사항을 위반하지 않습니까?
Gareth

으악! 그거보고 싶었어
Dillon Cower

가! 내 J 프로그램과 함께 싸울 기회가 있다고 생각했습니다! :-) 좋은 작업.
Gareth

@Gareth : 나는 지금 당신의 설명을 읽을 때까지 몰랐지만 내 대답은 당신의 것과 거의 동일합니다! 나는 APL과 J.에서 기대할 수 있다고 생각한다. :)
Dillon Cower

11

브레인 볼 , 2

,.

"당신의 언어가 다룰 수있는 가장 높은 수"에 대한 나의 의견 (그리고 대부분의 답변이 사용하는 것)에 대한 가장 합리적인 해석은 "언어가 기본적으로 지원하는 가장 큰 수 "입니다. Brainbool은 바이트가 아닌 비트를 사용 0하고 1문자 코드가 아닌 이진 ( 및 문자)으로 입력 및 출력을 취하는 brainfuck 파생물입니다 . 따라서 기본적으로 지원되는 가장 큰 숫자는 1이고, 가장 작은 숫자는 0해밍 가중치 10각각입니다.

Esolang에 따르면 Brainbool은 2010 년에 만들어졌습니다.


9
나는 그것이 존재해야한다는 것을 알았지 만 Esolang의 Brainfuck 파생 상품을 통해 Brainbool을 찾는 데 한 시간이 걸렸습니다.
lirtosiast

8

J, 13 자

(+ 숫자의 자릿수)

+/2|<.n%2^i.32

사용법 : n프로그램에서를 테스트 할 번호로 바꿉니다.

예 :

+/2|<.56432%2^i.32
8
+/2|<.45781254%2^i.32
11
+/2|<.0%2^i.32
0

숫자를 처음이나 끝 부분에 놓을 수 있도록 이것을 재정렬하는 방법이있을 것입니다. 그러나 이것은 첫 번째 J 항목이며 머리가 약간 아프습니다.

설명 (주로 나중에 이해하도록)

i.32 -1에서 32까지의 숫자의 배열을 만듭니다.

2^ -목록을 1 대 4294967296의 거듭 제곱으로 바꿉니다.

n% -입력 번호를 목록의 각 요소로 나눕니다.

<. -모든 분할 결과를 다음 정수로 내림합니다.

2|- %2대부분의 언어 와 동일 -짝수이면 0, 홀수이면 1

+/ -목록에있는 항목의 합계 (현재 1 또는 0 임)


stdin (또는 동등한 J이 무엇이든)에서 읽었을 때 이것을 기뻐할 것입니다.
Steven Rumbalski

내가 할 수있는 최선의 방법은 (입력 방법에 따라) 입력을 프로그램 끝으로 옮기는 것입니다. 질문에 표준 입력이 언급되어 있지 않습니까?
Gareth

입력 방법을 지정하지 않아서 죄송합니다. 지금 규칙을 변경하는 것은 불공평하므로이 규칙을 수락하겠습니다. 다음에 언급하겠습니다!
pimvdb

@pimvdb 문제 없습니다. 불만이 아닙니다. J 프로그램으로 할 수는 있지만 주어진 입력에서 작동하는 동사를 정의하는 것입니다. 그래도 어떻게 다시 정렬했는지 잘 모르겠습니다. 아마도 JB 또는 다른 J 전문가 중 한 명이 저를 도울 수 있습니다.
Gareth

... 더 많은 것을 읽으면 표준 입력에 대해 완전히 틀린 것을 알 수 있습니다.
Gareth

8

Brainfuck, 53 자

이것은 필수 Brainfuck 솔루션이 누락되었으므로 이것을 만들었습니다.

[[->+<[->->>>+<<]>[->>>>+<<]<<<]>>>>[-<<<<+>>>>]<<<<]

셀 1에서 숫자를 가져 와서 결과를 셀 6에 넣습니다.

등록 취소 및 댓글 버전 :

[  while n != 0
  [  div 2 loop
    -
    >+<  marker for if/else
    [->->>>+<<]  if n != 0 inc n/2
    >
    [->>>>+<<]  else inc m
    <<<
  ]
  >>>>  move n/2 back to n
  [-<<<<+>>>>]
  <<<<
]

6

Python 2.6, 41 자

t,n=0,input()
while n:t+=n%2;n/=2
print t

참고 : 내 다른 대답은 람다와 재귀를 사용하고 이것은 while 루프를 사용합니다. 나는 그들이 두 가지 대답을 보증 할만 큼 다르다고 생각합니다.


6

루비, 38 자

f=->u{u<1?0:u%2+f[u/2]}
p f[gets.to_i]

루비와 Steven과 같은 재귀 접근법을 사용하는 또 다른 솔루션.


5

GolfScript, 17 16 자

~{.2%\2/.}do]0-,

편집 : 새 버전은 접기 대신 목록 작업을 사용하여 1 문자를 저장합니다 (원본 버전은 ~{.2%\2/.}do]{+}*, 직접 카운트 버전 :) ~0\{.2%@+\2/.}do;.


5

C, 45

f(n,c){for(c=0;n;n/=2)c+=n%2;printf("%d",c);}

C에서 골프를 타는 데있어 특별한 점은 없습니다.


4

파이썬 2.6, 45 자

b=lambda n:n and n%2+b(n/2) 
print b(input())

1
def람다 대신 사용하여 두 문자로 단축 할 수 있습니다 .
Konrad Rudolph

1
@ KonradRudolph : 실제로, 당신은 반환 진술을 포함하면 이점을 잃게됩니다.
Steven Rumbalski

죄송합니다. 바보.
Konrad Rudolph

필요하지 않습니다 print b(input()). 값을 반환하고 "입력"을 함수의 인수로 사용할 수 있습니다.
caird coinheringaahing

4

펄, 45 43 36 자

$n=<>;while($n){$_+=$n%2;$n/=2}print

Howard는 45-> 43이고, User606723은 43-> 36입니다.


$n=int($n/2)2 자 더 짧은 문자를 사용할 수 있습니다 .
Howard

우리는 int ()가 필요하다고 확신합니까? $n=<>;while($n){$_+=$n%2;$n/=2}print$ n / 2가 마침내 0에 가까워 질 때까지 계속 반복됩니다. 그러나 우리는 걱정합니까? ;)
user606723

@ user606723 방금 시도해 보았으며 적어도 1000까지 모든 경우에 완벽하게 작동하는 것 같습니다.
PhiNotPi

3

펄, 30 자

$==<>;1while$_+=$=%2,$=/=2;say

추가 골프와 함께 PhiNotPi의 솔루션을 기반으로 합니다. perl -M5.010Perl 5.10 say기능 을 사용하려면 다음을 실행하십시오 .


$=특수 변수가 프로그램에서 특별한 작업을 수행 합니까 , 아니면 또 다른 일반 변수입니까?
PhiNotPi

2
@PhiNotPi : $=정수 값만 사용하므로이를 사용하면 저장 int됩니다.
Ilmari Karonen

커맨드 라인 인수가 문자 수의 일부가 아니어야합니까?
Soham Chowdhury

@SohamChowdhury : 이 메타 스레드에 따라 다릅니다 .
Ilmari Karonen

3

커먼 리스프, 12 자

(1 문자 변수 이름을 가정하면-예 : 11 + 숫자 길이)

기본 변환 기능이 아니므로 작동해야합니다.

(logcount x)

예 :

[1]> (logcount 0)
0
[2]> (logcount 1)
1
[3]> (logcount 1024)
1
[4]> (logcount 1023)
10
[5]> (logcount 1234567890123456789012345678901234567890)
68

(GNU CLISP 사용)


흠, 내가 대답으로 보려고 생각했던 것과 정확히 일치하지는 않습니다 :) 나는 이것을 받아 들일 수 없다고 생각합니다. 기본적으로 이것의 또 다른 경우입니다 .
pimvdb

3

C, 61 60 57 53 자

void f(x){int i=0;for(;x;x/=2)i+=x%2;printf("%u",i);}

함수 본문은 38 자입니다. 편집 : 비트 연산자 제거 편집 : printf주석에서 제안한대로 루프를 벗어남 편집 : K & R 선언으로 전환; 또한 이것은 더 이상 C99에 한정되지 않습니다


나는 비트로 본다 !!!
Joanis

죄송하지만 AND 연산자도 비트 연산자로 계산됩니다.
pimvdb

@ M.Joanis : 감사합니다. 결정된.
sam hocevar

1
난 당신이 K & R C로 전환 한 경우가 몇 가지 문자를 아끼지 수 있다고 생각 하는 경우 가 나왔습니다 확인 당신이.
JB

printf를 루프 밖으로 이동하여이 문자를 4 자로 줄일 수 있습니다.
marinus

3

dc – 26 자

의 루프 구조가 부족하기 때문에 다소 길다 dc.

0?[d2%rsi+li2/d0<x]dsxx+p

숫자의 모듈로 2를 계속 더하고 0에 도달 할 때까지 숫자를 나눕니다. 임의로 긴 정수를 처리 할 수 ​​있습니다.

예:

$ dc -e '0?[d2%rsi+li2/d0<x]dsxx+p' <<< 127
7
$ dc countones.dc <<< 1273434547453452352342346734573465732856238472384263456458235374653784538469120235
138

3

C, 66 자

main(int n,char **a){printf("%u",__builtin_popcount(atoi(a[1])))};

참고 : gcc 또는 gcc 호환 컴파일러 (예 : ICC, clang)가 필요합니다.

For some CPUs __builtin_popcount compiles to a single instruction (e.g. POPCNT on x86).


Is it correct that __builtin_popcount actually just implements the counting of 1s itself? If so, although it's not strictly wrong according to the rules I honestly don't think this is a fair entry.
pimvdb

You should probably stipulate this in the question if you want to disallow entries that take advantage of built-in capabilities of a given language or compiler.
Paul R

This is not legal C++ because in C++ you cannot omit the return type on main, nor use printf without prior include.
celtschk

@celtschk: fair point - edited out the C++
Paul R

2

JavaScript, 78 72 71 characters

I'll post my initial solution which I came up with before posting the question as well. There is already a much better JavaScript answer though :)

for(n=prompt(a=0),j=1;j<=n;j*=2)for(i=j;i<=n;i+=2*j)n<i+j&&a++;alert(a)

http://jsfiddle.net/Mk8zd/1/

The idea comes from certain "mind reading cards" which enable you to obtain the number someone else has in mind, by showing them cards and let them say on which cards their number is apparent.

It works because each number is a unique combination of 1s / 0s in binary. My solution checks on which "cards" the number is apparent so as to determine how many 1s it has. It's just not very efficient, though...

I found this document which outlines the mind reading technique.


2

Haskell (60 chars)

f n=sum[1|x<-[0..n],odd$n`div`2^x]
main=interact$show.f.read

2

PHP, 57

$i=$s=0;for(;$i<log($n,2);){$s+=$n/pow(2,$i++)%2;}echo$s;

This assumes that $n holds the value to be tested.

PHP, 55 (alternative solution)

function b($i){return$i|0?($i%2)+b($i/2):0;}echo b($n);

Again, this assumes that $n holds the value to be tested. This is an alternative because it uses the or-operator to floor the input.

Both solutions work and do not cause notices.


2

Ocaml, 45 characters

Based on @Leah Xue's solution. Three spaces could be removed and it's sligthly shorter (~3 characters) to use function instead of if-then-else.

let rec o=function 0->0|x->(x mod 2)+(o(x/2))  


1

Scala, 86 characters

object O extends App{def f(i:Int):Int=if(i>0)i%2+f(i/2)else 0
print(f(args(0).toInt))}

Usage: scala O 56432


1

D (70 chars)

int f(string i){int k=to!int(i),r;while(k){if(k%2)r++;k/=2;}return r;}

1

R, 53 characters

o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0};o(scan())

Examples:

> o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0};o(scan())
1: 56432
2: 
Read 1 item
[1] 8
> o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0};o(scan())
1: 45781254
2: 
Read 1 item
[1] 11
> o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0};o(scan())
1: 0
2: 
Read 1 item
[1] 0

If inputting the number is not part of the character count, then it is 43 characters:

o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0}

with test cases

> o(56432)
[1] 8
> o(45781254)
[1] 11
> o(0)
[1] 0

1

OCaml, 52 characters

let rec o x=if x=0 then 0 else (x mod 2) + (o (x/2))

1

Scheme

I polished the rules a bit to add to the challenge. The function doesn't care about the base of the number because it uses its own binary scale. I was inspired by the way analog to numeric conversion works. I just use plain recursion for this:

(define (find-ones n)
  (define (nbits n)
    (let nbits ([i 2])
      (if (< i n) (nbits (* i 2)) i)))
  (let f ([half (/ (nbits n) 2)] [i 0] [n n])
    (cond [(< half 2) i]
      [(< n i) (f (/ half 2) i (/ n 2))]
      [else (f (/ half 2) (+ i 1) (/ n 2))])))

1

Isn't reading a number into binary or printing the number from binary a "builtin base conversion function", thus invalidating every answer above that prints an integer? If you permit reading and printing an integer, like almost all the above answers do, then I'll make claims using a builtin popcount function :

Haskell, 50

There was a popCount routine added to the Data.Bits module for GHC v7.2.1/v7.4.1 this summer (see tickets concerning the primop and binding).

import Data.Bits
main=interact$show.popCount.read

I cannot beat the above Python and Perl scores using their GMPY or GMP::Mpz modules for GMP sadly, although GMP does offer a popcount function too.


1

JavaScript, 49 47 45 42 bytes

for(n=prompt(o=0);n=n/2|0;o+=n%2);alert(o)

Demo: http://jsfiddle.net/hcYdx/4/

Edit 1: remove q and use ~~ for rounding, save 2 chars.

Edit 2: use |0 rounding operator instead of ~~ to save parentheses (2 chars).

Edit 3: simplify n>0 to n and combine with n=n/2|0 to make entire condition; now have wasted statement space :(


3
Isn't the |0 a bitwise operator?
Vilx-

Technically yes. But i'm using it purely to round to the nearest int, so I'm not getting any bit-wise benefit :)
mellamokb

Smells like bending the rules to me... but I'm not the judge.
Vilx-

Input 1 gives output 0.
Atreys

1
| is bitwise operator... it is disallowed. Time to do Math.round :-)
Jamie

1

Java 7, 36 bytes

int b(Long a){return a.bitCount(a);}

Because of course this, of all things, is something that Java has a builtin for...


Doesn't this fit under "built-in base-conversion functions", which are banned?
FlipTack

@Flp.Tkc I'm not actually doing base-conversion. I have no idea how bitCount operates under the hood.
Poke

this seems like just using a bulitin to do the job, but ok...
FlipTack

@Flp.Tkc That's... exactly what it is? I'm even including all required libraries (there aren't any). This is demonstrating the strength of the language! related meta
Poke

1

TI-Basic (TI-84 Plus CE), 30 bytes

Prompt X
0→S
While X
S+remainder(2,X→S
int(X/2→X
End
S

TI-Basic is a tokenized language, all tokens but remainder( are one-byte, remainder is two


Welcome to the site!
James

1

PHP, 36 bytes

while($n){$o+=$n%2;$n/=2*1;}echo $o;

Assumes $n is the number to be tested, shows a PHP Notice for $o, and doesn't exactly work when $n is 0 (outputs nothing).

PHP, 53 bytes

$n=$argv[1];$o=0;while($n){$o+=$n%2;$n/=2*1;}echo $o;

Accepts command-line input, doesn't show a PHP Notice, and outputs correctly for 0.


Welcome to the site! :)
James
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.