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

ルール:

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

文字ごとの例:

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

コメント

  • div id = ” 6872641b3c “>

/ ASCII 32を参照として、’hello worldのハミング重みは11ではなく10ではありませんか?

  • hello world 11の重みはなぜですか?スペースと異なるのは10文字だけです。また、プログラム’のハミング重みは、スペースを除いた長さだけのようです。通常のコードゴルフとそれほど変わらない。
  • 申し訳ありませんが、私はこれを完全に台無しにしました。ウィキペディア’のハミング重みの記事はかなり誤解を招くものであり、私はルールを完全に否定しました’。今書き直します。 更新:わかりました。ASCII文字列で1に設定されたビット数として定義するように書き直しました。失敗して申し訳ありません。
  • @ugorenより低いソリューション-値ASCII文字のハミング重みは低くなります。
  • これですべてが理にかなっています。大文字を使用し、~oに注意してください。
  • 回答

    J(33)

    34より1つ低い!

    +/,#:3 u: 

    かなり この回答に触発されましたが、ハミング重みは1つ低くなっています。

     +/,#:3 u:"+/,#:3 u:" 33 

    回答

    J、重み34

    +/,#:a.i. 

    使用法-配置最後に引用符で囲まれた文字列:

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

    または、キーボードから入力を取得します(重み54):

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

    コメント

    • これを書く唯一の方法は’です:)
    • ‘ t …ハミング重みが1つ低いソリューションを見つけました。
    • バズキルになろうとはしていませんが、ただし、ルールではフラグメントではなくプログラムが要求されます。

    回答

    J 、39

    +/,#:a.i:] 

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

     +/,#:a.i:] "hello world" 45 +/,#:a.i:] "+/,#:a.i:]" 39 

    コメント

    • 偉大な心は同じように考えます。 🙂

    回答

    Python、189

    print sum(bin(ord(A)).count("1")for A in raw_input()) 

    コメント

    • Python3に相当するprint(sum(bin(ord(A)).count('1')for A in input()))のスコアは180です。
    • @ dan04:176には一重引用符ではなく二重引用符を使用してください。

    回答

    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つを使用してくれました。 ‘は私がPCでコーディングすることを学んだ最初の言語です。

    回答

    Unary 0

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

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

    「読みやすく」するために改行を追加しましたが、ハミング重みは4066です。商/を繰り返し取得することで機能します。入力文字列の余りとすべての余りを合計します。もちろん、それ自体で実行すると、次のようになります:226(4066%256)(技術的には\ xe2)なので、明らかに勝者を決定します。

    ここで、単項に変換して取得します

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

    「0」とブームにNULL文字\ x00を使用し、ハミング重みが0の単項実装を使用します。

    ボーナス質問:どのASCII文字cに対して、Nの繰り返しで、その文字を出力します。 (たとえば、32個のスペースの文字列はスペースを与えます)。Nのどの値が機能しますか(機能する値は無限にあるか、まったく機能しません)。

    コメント

    • ‘この解決策を理解しているかどうかわかりません。 brainfuckプログラムには、大きなハミング重みがあります。 Unaryはnullバイトをプログラムとして受け入れますか、それともUnaryを再実装する必要がありますか? ‘が後者の場合、’は実際には有効な解決策ではありません。誰でも”単一の入力バイトが{result} “を与えるプログラミング言語を定義し、サイト上のすべてのコードゴルフチャレンジに勝ちます。
    • nullキャラクターUnaryは大丈夫でしょう。必要なのは、カウントを停止すると言うEOFだけです。実際、ここでは’そのファイルを読み取るための疑似Cがいくつかあります:main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }ありません’単項文字として何を選択するかはまったく問題ではありません(’ t EOFでない限り)。
    • ここで’ヌル文字で正常に動作するCコンパイラの単項: ideone.com/MIvAg 。もちろん、このプログラムを作成するために必要なファイルはユニバースに収まりませんが、実行する能力はあります。
    • 可能であれば’ t 実際に実行しますが、’実際には解決策ではありません。
    • としてCarlSagan かつて言われたこと:”文字列のハミング重みを計算する場合は、最初に10 ^ 500個のユニバースを発明する必要があります。”(数十億、数十億、さらに)

    回答

    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に初期化されていると仮定します。 (単一パラメーター)。

    ハミング重み固有の最適化ons:
    1. ABDH、それぞれ重み2、名前に使用。
    2. *++H

    コメント

    • ああ、今まであなたの最初の文を完全に理解できませんでした。
    • 結果を unary 番号として出力すると、スコアを230まで下げることができます:main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
    • @schnaader 、@が1進法の数字であることを私は知りませんでした。 0 .. 0のみを使用していると思いました。ただし、これを実行したい場合は、printf("@"+*a%2)の方が短くなります。
    • @ugoren:単項の規則/定義によって異なります。例えば。 en.wikipedia.org/wiki/Unary_numeral_system はタリーマークを使用し、”ゼロを表す明示的な記号はありません他の従来のベースと同じように、1進数で”。
    • @schnaader、わかりましたが、’ ■要件を”数値として拡張する”遠すぎます。

    回答

    ゴルフスクリプト 84 72 58

    {2base~}%{+}* 

    (ハワードとピーターテイラーの助けに感謝します)

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

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

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

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

    ここ。

    コメント

    • Golfscriptでは大文字と小文字が区別されますか?そうでない場合は、baseの代わりにBASEを使用して数ビット節約できます。 更新:チェックしたところ、BASEは’機能しません。良い解決策:)
    • @Polynomial TEST / testのコメントを見た後、試してみました:)しかし、そうではありません’動作しません。
    • 2base~{…}2*を取り除くことができます。そもそも/ div>。スコアが72に下がります。
    • @ハワード、このすばらしいヒントに感謝します。 ‘回答に適用しました。
    • ‘を忘れたため、テストメカニズムが間違っています。 WebGolfScriptページの重要な制限。 stdinの代わりに使用する文字列の前に;を付ける必要があるため、(;は不要です。次に、ハワード’の観測により65になります。

    回答

    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 

    ブーム。

    回答

    Pyth-15

    免責事項:Pythはこのチャレンジよりも若いため、この回答は勝つ資格がありません。

    バイナリ表現に.Bを使用し、"1" “の数をカウントします。

    /.BQ\1 

    文字列に入力して、zQを節約します。

    ここからオンラインでお試しください

    回答

    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の重みがあります。
    • @ugoren:しかし、’は65文字しかありません。プログラムはほぼ2回印刷されます。1回目はハミング重みを計算するコードで、2回目はプログラムの静的入力として計算します。ただし、計算部分には、リテラル入力を受け取るため、前に” readLine()”がありません。答え自体を明確にしようとしました。

    答え

    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());}} 

    コマンドライン引数としての入力が必要です。

    回答

    GNU sed -r、467 + 1

    -rを使用する場合は+ 1-または+4にする必要がありますか?)

    ソース行ごとに単項値として出力します。小数の合計に変換するには、出力を| 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)を使用します。@を使用します。 (スコア1)または!(スコア2)をパターン区切り文字として/(スコア5)に重ねます。

    注-適切な文字セットを取得するために、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 

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

    回答

    Julia 262 268

    変更されたバージョンでは、便利な「count_ones」関数を使用して6(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])))) 

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

    回答

    CJam52または48

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

    q:i2fbs:s:i:+ 

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

    :i2fbs:s:i:+ 

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

    回答

    Julia、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) 

    そして、楽しみのために、最適化されたバージョンを示します(Hamming Weight 231 )のbakergが問題に取り組んでいます:

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

    with

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

    回答

    HPPPL(HP Primeプログラミング言語)、74

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

    HP Primeグラフ電卓にはhamdist()関数が組み込まれています。各文字のハミング重みは、0からのハミング距離と同じです。

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

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

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

    独自のソースコードのハミング重みの計算:

    ハミング重みHPPPL

    回答

    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  

    回答

    Perl 6 、102

    オンラインでお試しください!

    これはコードゴルフではありませんが、最短のソリューションでもハミング重みが最小のようです…

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です