ビット演算子を使用せずに2進数で1の量を出力します


14

説明

数値を指定して、その数値1をバイナリ表現で出力します。

入力

>= 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に設定されていることを前提としています(1ではなく0で始まることを意味します)。32ビットバージョンのDyalog APLを使用しました。

説明、右から左へ:

  • ⍳32最初の32整数のベクトルを生成します(前述のとおり、⎕IO0であるため、このベクトルは0で始まります)。
  • *は、べき関数です。この場合、2正しい引数として指定されたベクトルの各要素の累乗を生成します。
  • ÷除算関数です。それは私たちが得られる権利(二の各パワー)へのベクトルの各要素で割った(評価ユーザー入力)。
  • 引数の各要素をその右側にフロアリングします。
  • 2|の各要素の残りをで割った値を与え2ます。
  • /左側の関数を使用して、右側の引数を縮小(折りたたみ)します+

もう9文字ではありません。:(

古い、規則違反バージョン:

+/⎕⊤⍨32/2

説明、右から左へ:

  • 32/2:複製232回。
  • 通勤この場合にされ、その左側に進関数(すなわち、X⊤⍨Yと等価ですY⊤X)。
  • エンコード機能です。左側に指定された基数で整数を右側にエンコードします。通勤演算子のため、右と左の引数が入れ替わることに注意してください。基数は必要な桁数だけ繰り返されるため、32/2ます。
  • ユーザー入力を受け入れて評価するニラディック関数です。
  • +/その右側の引数が使用削減(ひだ)+。(0と1を合計します。)

2
これはBuilt-in base conversion functions制約を破りませんか?
ガレス

おっと!それを逃しました。
ディロン・コーワー

ああ!私は自分のJプログラムで格闘のチャンスを与えたと思っていました!:-) 良くやった。
ガレス

@Gareth:今あなたの説明を読むまで気づきませんでしたが、私の答えはあなたのものとほとんど同じです!APLとJから期待できると思います。:)
ディロン・カウアー

11

Brainbool、2

,.

「あなたの言語が処理できる最大数」の最も合理的な解釈は、私の意見では(そしてほとんどの答えが使用するもの)「あなたの言語がネイティブにサポートする最大数」です。Brainboolは、バイトではなくビットを使用し、文字コードではなくバイナリ(0および1文字)で入出力を行うBrainfuck派生物です。したがって1、ネイティブにサポートされる最大数はであり、最小は0であり10それぞれハミングの重みとを持ちます。

Esolangによると、Brainboolは2010年に作成されました。


9
私はそれが存在しているに違いないことを知っていましたが、EsolangのBrainfuck派生物を選別してBrainboolを見つけるのに1時間かかりました。
リトシアスト

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^ -リストを2の1から4294967296のべき乗に変換します

n% -入力番号をリスト内の各要素で除算します

<. -すべての除算結果を次の整数に切り捨てます

2|- %2ほとんどの言語と同じ-偶数の場合は0を返し、奇数の場合は1を返します

+/ -リスト内のアイテムの合計(現在は1または0のみ)


stdin(または同等のJが持っているもの)から読み取った後、これを喜んで支持します。
スティーブンランバルスキー

私ができる最善の方法は(おそらく、どのように考えているかによって)入力をプログラムの最後に移動することです。ただし、質問には標準入力は記載されていませんか?
ガレス

入力方法を指定しないでごめんなさい。今すぐルールを変更するのは不公平なので、これを受け入れます。次回お話しします!
pimvdb

@pimvdb問題ありません、苦情ではありません。Jプログラムでは、与えられた入力に対して動作する動詞を定義するだけでよいと思います。それを行うためにこれをどのように再配置するかはわかりません。たぶん、JBや他のJの専門家の一人は...それで私を助けることができる
ギャレス

...そしてもう少し読んだところ、標準入力について完全に間違っていたことがわかりました。
ガレス

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ループを使用します。私はそれらが2つの答えを正当化するのに十分異なると思います。


6

ルビー、38文字

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

ルビーとスティーブンと同じ再帰的アプローチを使用した別のソリューション。


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

Python 2.6、45文字

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

1
defラムダの代わりに使用することにより、2文字短くすることができます。
コンラッドルドルフ

1
@KonradRudolph:実際、returnステートメントを含めると、利点を失います。
スティーブンランバルスキー

おっと、私はそれを忘れていました。愚か。
コンラッドルドルフ

あなたは必要ありませんprint b(input())。値を返し、関数の引数として「入力」を取ることは許容されます。
共産主義のケアリング

4

Perl、45 43 36文字

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

45-> 43についてはHoward、43-> 36についてはUser606723に感謝します。


$n=int($n/2)短い2文字を使用できます。
ハワード

int()が必要ですか?$n=<>;while($n){$_+=$n%2;$n/=2}printこれは、$ n / 2が最終的に0に近づくまでループを続けますが、気にしますか?;)
user606723

@ user606723私はそれを試してみましたが、少なくとも1000までのすべてのケースで完全に動作するようです。
PhiNotPi11年

3

Perl、30文字

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

PhiNotPiのソリューションに基づいて、いくつかの追加のゴルフがあります。で実行しperl -M5.010て、Perl 5.10 say機能を有効にします。


ない$=特殊変数は、プログラムで何も特別な操作を行う、またはそれはちょうど、別の普通の変数でありますか?
PhiNotPi

2
@PhiNotPi:$=整数値のみを取得するため、それを使用すると節約できますint
イルマリカロネン

コマンドライン引数は文字カウントの一部にすべきではありませんか?
ソハムチョードリー

@SohamChowdhury:このメタスレッドごとではありません。
イルマリカロネン

3

Common Lisp、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固有ではなくなりました


ビットごとに見える!!!
ジョアニス

申し訳ありませんが、AND演算子もビットごとの演算子としてカウントされます。
pimvdb

@M。ジョアニス:当たり前、気づいてくれてありがとう。修繕。
サムホセバル

1
K&R Cに切り替えた場合、いくつかの文字を節約できると思います。それで よければ大丈夫です。
JB

printfをループ外に移動することで、これを4文字短くすることができます。
マリヌス

3

dc – 26文字

これはかなり長いですが、主にのループ構造の欠如によるものdcです。

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

数値のモジュロ2を加算し、ゼロに達するまで数値をtoで除算し続けます。任意の長さの整数を処理できます。

例:

$ 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など)が必要です。

一部のCPUでは__builtin_popcount、単一の命令にコンパイルされます(POPCNTx86など)。


s __builtin_popcountのカウント1自体を実際に実装するだけで正しいのですか?もしそうなら、それはルールに従って厳密に間違っているわけではありませんが、正直に言ってこれが公正なエントリーだとは思いません。
pimvdb

特定の言語またはコンパイラの組み込み機能を利用するエントリを許可しない場合は、おそらく質問でこれを規定する必要があります。
ポールR

C ++ではmainの戻り値の型を省略したり、printf事前のインクルードなしで使用したりすることはできないため、これはC ++としては正当ではありません。
celtschk

@celtschk:フェアポイント-編集されたC++
ポールR

2

JavaScript、78 72 71文字

質問を投稿する前に思いついた最初の解決策も投稿します。しかし、すでにはるかに優れたJavaScriptの回答があります:)

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/

アイデアは、カードを見せて、どのカードで番号が明らかかを伝えることで、他の誰かが心に留めている番号を取得できる特定の「マインドリーディングカード」に由来します。

各数字はバイナリ1のs / 0sの一意の組み合わせであるため機能します。私のソリューションは、どの「カード」で番号が明らかであるかを確認し、その数を決定します1。ただし、あまり効率的ではありません...

心の読み方の概要を説明するこの文書を見つけました。



2

PHP、57

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

これは、$nテストする値が保持されていることを前提としています。

PHP、55(代替ソリューション)

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

繰り返しますが、これは$nテストされる値を保持していることを前提としています。これはfloor、入力にor演算子を使用するため、代替です。

どちらのソリューションも機能し、通知を行いません。


2

Ocaml、45文字

@Leah Xueのソリューションに基づきます。3つのスペースを削除できます。if-then-elseの代わりにfunctionを使用すると、わずかに短くなります(最大3文字)。

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


1

Scala、86文字

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

使用法: scala O 56432



1

R、53文字

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

例:

> 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

数字の入力が文字カウントの一部ではない場合、43文字です。

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

テストケース付き

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


1

スキーム

ルールを少し磨いてチャレンジに追加しました。この関数は、独自のバイナリスケールを使用するため、数値の基数を気にしません。アナログから数値への変換の仕組みに触発されました。これには単純な再帰を使用します。

(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

数値をバイナリに読み込んだり、バイナリから数値を「ビルトインベース変換関数」で印刷したり、それ以上のすべての答えを無効にしprintませんか?上記の回答のほとんどすべてが行うように、整数の読み取りと印刷を許可する場合、組み込みpopcount関数を使用して主張します

ハスケル、50

あったpopCountに追加ルーチンData.BitsGHC 7.2.1 / v7.4.1この夏のためのモジュールは、(チケットはに関する参照primopをして結合します)。

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

GMPにはポップカウント機能もありますが、GMPのモジュールGMPYまたはGMP::Mpzモジュールを使用して上記のPythonおよびPerlのスコアを打ち負かすことはできません。


1

JavaScript、49 47 45 42バイト

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

デモ:http : //jsfiddle.net/hcYdx/4/

編集1:削除q~~て丸めに使用し、2文字を保存します。

編集2:括弧(2文字)を保存する|0代わりに丸め演算子を使用します~~

編集3:単純化n>0nて組み合わせてn=n/2|0条件全体を作成します。文スペースが無駄になりました:(


3
|0ビット演算子ではありませんか?
-Vilx-

技術的にはい。しかし、私は純粋に最も近い整数に丸めるためにそれを使用しているので、ビットごとの利益を得ていません:)
mellamokb

私にルールを曲げるような匂いが...しかし、私は裁判官ではありません。
Vilx-

入力1は出力0を提供します
。-アトレー

1
|ビット単位の演算子です...許可されていません。時間Math.round:-)
ジェイミー

1

Java 7、36バイト

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

もちろん、これは、すべてのものの中で、Javaに組み込まれているものです...


これは、禁止されている「組み込みのベース変換関数」に適合しませんか?
FlipTack

@ Flp.Tkc私は実際にベース変換を行っていません。bitCountボンネットの下でどのように動作するのかわかりません。
ポケ

これは...ちょうど仕事をするbulitinを使用してのように思えるが、[OK]を
FlipTack

@ Flp.Tkcそれは...まさにその通りですか?必要なすべてのライブラリも含めています(まったくありません)。これは、言語の強さを示しています!関連するメタ
ポケ

1

TI-Basic(TI-84 Plus CE)、30バイト

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

TI-Basicはトークン化された言語で、すべてのトークンremainder(1バイトですが、残りは2です


サイトへようこそ!
DJMcMayhem

1

PHP、36バイト

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

$nテスト対象の数値であると仮定し、のPHP通知を表示し$o、次の場合に正確に機能しない$n 0(出力は何も)ではありません。

PHP、53バイト

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

コマンドライン入力を受け入れ、PHP通知を表示せず、0に対して正しく出力します。


サイトへようこそ!:)
DJMcMayhem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.