のハミング重みを計算するプログラムを作成します。文字列。勝者は、ハミング重みが最も低いプログラムです。
ルール:
- 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文字だけです。また、プログラム’のハミング重みは、スペースを除いた長さだけのようです。通常のコードゴルフとそれほど変わらない。~
とo
に注意してください。回答
回答
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
文字列に入力して、z
とQ
を節約します。
回答
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()は、すべての値を合計します。
独自のソースコードのハミング重みの計算:
回答
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