低ハミング重量でハミング重量を計算する


19

文字列のハミングの重みを計算するプログラムを作成します。勝者は、最低のハミング重量を持つプログラムです。

ルール:

  • ASCII文字のハミングの重みは、1バイナリ表現で設定されるビットの総数として定義されます。
  • 入力エンコードが7ビットASCIIであり、言語の標準的な入力メカニズム(stdin、argsなど)を通過すると仮定します。
  • 結果を数値として、標準出力または言語が使用するデフォルト/通常の出力メカニズムに出力します。
  • 言うまでもありませんが、実際のプログラムを有効に実行するには、実際にプログラムを実行できる必要があります。
  • 勝者は、コードのハミング重みが最も低いソリューションです。
  • 申し訳ありませんが、これには空白の解決策はありません!OK、ルールを整理したので、空白でコーディングできます:)

文字ごとの例:

char |  binary  | weight
-----+----------+-------
a    | 01100001 | 3
x    | 01111000 | 4
?    | 00111111 | 6
\x00 | 00000000 | 0
\x7F | 01111111 | 7

我々が取る場合0x20の基準として/ ASCII 32、のハミング重みではないhello world10ではなく11?
クリスチャンルパスク

なぜ重量はhello world11ですか?スペースと異なるのは10文字のみです。また、プログラムのハミングの重みは、スペースを除いたちょうどその長さのようです。通常のコードゴルフとそれほど違いはありません。
ウゴレン

申し訳ありませんが、私はこれを完全に台無しにしました。ウィキペディアのハミングウェイト記事はかなり誤解を招くものであり、私はルールを完全に裏切った。書き直します。更新: OK、ASCII文字列で1に設定されたビット数として定義するために書き直されました。
多項式

@ugoren低い値のASCII文字を使用したソリューションでは、ハミングの重みが小さくなります。
多項式

1
今ではすべてが理にかなっています。使用大文字は、に注意してください~o
ウゴレン

回答:



8

J、重量34

+/,#:a.i.

使用法-測定する文字列を最後に引用符で囲みます。

   +/,#:a.i.'+/,#:a.i.'
34

または、キーボードから入力する(ウェイト54):

   +/,#:a.i.1!:1[1
hello
21

これを書く唯一の方法があります:)
一時的な

ありません...私は1つ低いハミング重量を持つソリューションを見つけました。
ɐɔıʇǝɥʇuʎs

バズキルにはならないが、ルールはフラグメントはなくプログラムを要求する。
FUZxxl

5

J、39

+/,#:a.i:]

これは、1つの引数を取る関数です。(または]、文字列に直接置き換えます。Garethが述べているように、コストを34に削減します。)

   + /、#:ai:] 'hello world'
45
   + /、#:ai:] '+ /、#:ai:]'
39

偉大な心は同様に考えます。:
ガレス


5

QBasic、 322 311 286 264

H$=COMMAND$
FOR A=1 TO LEN(H$)
B=ASC(MID$(H$,A,1))
WHILE B>0
D=D+B MOD 2
B=B\2
WEND
NEXT
?D

仕事に適したツールの種類は、もちろんもちろん悪いことです。


1
私のお気に入りの言語の1つを常に使用している+1。これは、PCでコーディングすることを学んだ最初の言語です。
多項式

5

単項0

あなたは皆、それが来ることを知っていました。最初のBrainFuckプログラム:

,[[>++[>>+>+<<<-]>>>
[<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>
[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-]
[-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>
[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<
[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<<
[>>+<[>>+>+<<<-]>>>[<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>
[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]> 
[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<
[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<<]>>>
[>+>+<<-]>>[<<+>>-][-]+<[>[-]<<[<<->>-]<<[>>+<<-]>>>[-]]>[<<<+<[-]>>>>
[-]]<<[->>>>+<<<<]<[-<<+>>]<<],]>>>>>>>.

「読み取り可能」にするために改行を追加しましたが、ハミングの重みは4066です。入力文字列の商/剰余を繰り返し取得し、残りをすべて加算することで機能します。もちろん、それを自分自身で実行する必要があります:226(4066%256)(技術的には\ xe2)なので、明らかに勝者になります。

次に、それを単項に変換して取得します

000 ... 9*google^5.9 0's ... 000

'0'にNULL文字\ x00を使用し、0の重みをハミングする単項実装を使用します。

おまけの質問:どのASCII文字に対して、cこのプログラムをNレプリションで構成される文字列で実行し、その文字を出力させることができます。(たとえば、32個のスペースのストリングはスペースを与えます)。N仕事の価値(無限の数が機能するか、機能しない)。


1
この解決策を理解しているかどうかはわかりません。Brainfuckプログラムには大きなハミングウェイトがあります。Unaryはプログラムとしてnullバイトを受け入れますか、それともUnaryを再実装する必要がありますか?後者の場合、それは実際には有効なソリューションではありません。誰でも「単一の入力バイトが{result}を与えるプログラミング言語を定義する」と言うだけで、サイトですべてのコードゴルフチャレンジに勝つことができます。
多項式

1
ヌル文字の単項は問題ありません。必要なのは、カウントを停止するというEOFだけです。実際、そのファイルを読むための擬似Cがあります:main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }あなたがUnary charに選んだものは何でも構いません(EOFでない限り)。
walpen

1
ideone.com/MIvAgのように、null文字で正常に動作するCコンパイラの単項関数を次に示します。もちろん、このプログラムを作成するために必要なファイルは宇宙に適合しませんが、それを実行する能力があります。
walpen

3
実際に実行できない場合、それは実際には解決策ではありません。
多項式

4
カール・セーガンかつて言った:「あなたは、文字列のハミング重みを計算したい場合は、最初の10 ^ 500ユニバースを発明しなければなりません。」(数十億、偶数)
-walpen

4

C、重量322 263 256

ハミング重量のハミング重量はカウントされますか?

main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))D+=*A%2;printf("%d",D-2);}

主に標準的なゴルフ技術を使用しました。
単一のループが重みを計算し(右にシフトしてゼロになるまで追加)、文字列をスキャンします(ゼロに達するとポインターを進めます)。
想定Dは2(単一パラメーター)に初期化されます。

ハミングの重み固有の最適化:
1. ABDH、名前に使用される重み2をそれぞれ使用。
2.に*++H優先H[1]


ああ、今まであなたの最初の文章を理解できなかった。
パンボックス

結果を単項数として出力することにより、スコアを230まで下げることができますmain(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
。– schnaader

@schnaader、私@は単項システムの数字だとは知らなかった。私はそれだけで使用すると思いました0... 0。しかし、あなたがこれを行きたいなら、方法printf("@"+*a%2)はもっと短いです。
ウゴレン

@ugoren:単項の規約/定義に依存します。たとえば、en.wikipedia.org / wiki / Unary_numeral_systemは集計マークを使用し、「他の従来のベースにあるような単項のゼロを表す明示的なシンボルはありません」と述べています。
シュナダー

@ schnaader、OK、しかし、私はそれが要求を「数として」拡大しすぎていると思います。
ウゴレン

4

Golfscript 84 72 58

{2base~}%{+}*

(協力してくれたハワードとピーター・テイラーに感謝)

入力:入力文字列はスタック上にある必要があります(コマンドライン引数として渡されるか、単にスタック上に配置されます)。

コマンドラインから実行する場合は、必ず使用してくださいecho -n。そうしないと、末尾の改行もカウントされます。

出力:ハミング重量値をコンソールに出力します

ここでプログラムをテストできます


1
Golfscriptでは大文字と小文字が区別されますか?そうでない場合は、のBASE代わりにを使用して数ビットを節約できますbase更新:チェックしただけでBASE機能しません。良い解決策:)
多項式

@Polynomial私はあなたの見た後それを試してみましたTEST/ testコメントを:)しかし、それは仕事をしません。
クリスチャンルパスク

そもそも{...}2*応募2base~すれば取り除けます。スコアを72まで下げます
ハワード

@Howard、この素晴らしいヒントをありがとう!私は答えにそれを適用しました。
クリスチャンルパスク

Web GolfScriptページの重要な制限を忘れたため、テストメカニズムが間違っています。;stdinの代わりに使用する文字列の前にある必要があるため、これ(;は不要です。その後、ハワードの観察は65にそれを取得します
ピーター・テイラー

2

Perl、80(22文字)

完了および完了:

perl -0777nE 'say unpack"%32B*"'

または、重み77(21文字)の代替バージョンがあります。

perl -0777pE '$_=unpack"%32B*"'

ただし、その出力では最後の改行が省略されるため、このバージョンはあまり好きではありません。

重量を計算するために、通常の方法で文字をカウントしていると仮定しています(perl -e/ を除く-Eが、他のオプション文字を含む)。何らかの理由で人々がこれについて文句を言う場合、オプションなしでできる最善の方法は90(26文字)です。

$/=$,,say unpack"%32B*",<>

サンプル使用法:

$ perl -0777nE 'say unpack"%32b*"' rickroll.txt
7071

ブーム。



1

Scala 231

readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum

自己診断コード:

"""readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum""".map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum

セルフテストの変更。


231ではなく495の重量です。126文字で231の重量を得ることができません。これは平均2未満で、すべての印刷可能な文字(@使用しないスペースとスペースを除く)は少なくとも2です。
ウゴレン

1
@ugoren:しかし、たった65文字です。プログラムはほぼ2回印刷されます。ハミング重量を計算するためのコードと、プログラム用に計算する静的入力として2回目です。しかし、計算部分にはリテラル入力を受け取るため、前に「readLine()」がありません。答え自体を明確にしようとしました。
ユーザー不明

1

Javaの、重量931 774 499 454

これは、現時点で約300を超える重みを持つ唯一の答えだと思います。

class H{public static void main(String[]A){System.out.print(new java.math.BigInteger(A[0].getBytes()).bitCount());}}

コマンドライン引数として入力を期待します。


1

GNU sed -r、467 + 1

(+1の使用-r-またはそれは+4ですか?)

ソース行ごとに単項値として出力します。10進数の合計に変換するには、出力をにリダイレクトします| tr -d "\n" | wc -c。すべての印刷可能なASCII文字(32〜126)と改行(10)をカウントします。

s@[a-z]@\U& @g
s@[?{}~]@      @g
s@[][/7;=>OW|^]@     @g
s@[-'+.3569:<GKMNSUVYZ\\]@    @g
s@[#%&)*,CEFIJL1248ORTX]@   @g
s@$|[!"$(ABDH0P`]@  @g
y! @!11!

すべての文字をリストすることを避けるのは困難ですが、小文字のハミングの重みが対応する大文字よりも1つ大きいことを観察して、これを減らすことができます。ステートメントの区切り文字として、セミコロン(スコア5)よりも改行(スコア2)の方が適しています。パターンの区切り文字として(スコア5)よりも@(スコア1)または!(スコア2)を優先し/ます。

注-適切な文字セットを取得するために、の1つからこのテーブルを作成しman ascii、重みでソートしました。スコアを左右に追加するだけで、各キャラクターの全体的な重みを取得できます。

   2 4   3 5 6   7 
   ---  ------   - 
0:   @   0 P `   p |0

1: ! A   1 Q a   q | 
2: " B   2 R b   r |1
4: $ D   4 T d   t | 
8: ( H   8 X h   x | 

3: # C   3 S c   s | 
5: % E   5 U e   u | 
6: & F   6 V f   v |2
9: ) I   9 Y i   y | 
A: * J   : Z j   z | 
C: , L   < \ l   | | 

7: ´ G   7 W g   w | 
B: + K   ; [ k   { |3
D: - M   = ] m   } | 
E: . N   > ^ n   ~ | 

F: / O   ? _ o     |4
   ---  ------   -  
    1      2     3

これは、他の人に役立つかもしれません。


0

ジュリア262268

変更されたバージョンは、6の節約のために便利な「count_ones」関数を使用します(262)

show(mapreduce(x->count_ones(x),+,map(x->int(x),collect(ARGS[1]))))

組み込みのワンカウント機能を使用しない古いバージョン(268)

show(mapreduce(x->int(x)-48,+,mapreduce(x->bits(x),*,collect(ARGS[1]))))

入力にコマンドライン引数を使用します。


0

CJam 52または48

入力がまだスタックにない場合(52)

q:i2fbs:s:i:+

入力がスタック上にある場合(48)

:i2fbs:s:i:+

例えば

"Hello World":i2fbs:s:i:+

0

ジュリア、HW 199

H=mapreduce;H(B->B=='1',+,H(P->bits(P),*,collect(A[:])))

A="H=mapreduce;H(B->B=='1',+,H(P->bits(P),*,collect(A[:])))"

または直接文字列を挿入することにより:

julia> H=mapreduce;H(B->B=='1',+,H(P->bits(P),*,collect("H=mapreduce;H(B->B=='1',+,H(P->bits(P),*,collect(A[:])))")))
199

改変されていないバージョン(HW 411)は次のようになります。

bitstring=mapreduce(x->bits(x),*,collect(teststring[:]))
mapreduce(checkbit->checkbit=='1',+,bitstring)

そして、その楽しみのために、この問題に対するbakergの見解の最適化バージョン(Hamming Weight 231)を以下に示します。

A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))

H="A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))"

0

HPPPL(HP Prime Programming Language)、74

sum(hamdist(ASC(a),0))

HP Primeグラフ電卓には、組み込みのhamdist()関数があります。各キャラクターのハミングウェイトは、0からのハミング距離と同じです。

ASC(string)は、文字列内の各文字のASCII値の配列を作成します。

hamdist(value、0)は、ASCII値ごとに0からハミング距離を計算します

sum()はすべての値を合計します。

独自のソースコードのハミングウェイトの計算:

ハミング重量HPPPL


0

05AB1E、重み17(4 バイト

ÇbSO

オンラインそれを試してみてくださいまたはいくつかのより多くのテストケースを検証します

説明:

Ç       # Convert the characters in the (implicit) input to their ASCII decimal values
        #  i.e. "Test" → [84,101,115,116]
 b      # Convert those values to binary
        #  i.e. [84,101,115,116] → ["1010100","1100101","1110011","1110100"]
  S     # Split it into a list of 0s and 1s (implicitly flattens)
        #  i.e. ["1010100","1100101","1110011","1110100"]
        #   → [1,0,1,0,1,0,0,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0]
   O    # Sum those (and output implicitly)
        #  i.e. [1,0,1,0,1,0,0,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0] → 16

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