낮은 해밍 무게로 해밍 무게 계산


19

문자열 의 해밍 가중치 를 계산하는 프로그램을 작성하십시오 . 우승자는 해밍 무게가 가장 낮은 프로그램입니다.

규칙 :

  • ASCII 문자의 해밍 가중치 1는 이진 표현으로 설정된 총 비트 수로 정의됩니다 .
  • 입력 인코딩이 7 비트 ASCII라고 가정하고 사용자 언어에 맞는 입력 메커니즘 (예 : stdin, args)을 통과합니다.
  • stdout 또는 언어가 사용하는 기본 / 정상 출력 메커니즘에 결과를 숫자로 출력하십시오.
  • 말할 것도없이 실제로 유효한 프로그램 이 되려면 실제로 실제 프로그램을 실행할 수 있어야합니다 .
  • Winner는 코드가 해밍 가중치가 가장 낮은 솔루션입니다.
  • 죄송합니다. 이 공백 에는 해결책이 없습니다 ! 좋아, 이제 공백으로 코딩 할 수 있습니다. 규칙을 정렬했습니다. :)

문자 별 예 :

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

우리가 가지고가는 경우에 0x20참조로 / ASCII (32)의 허밍 무게 아닌 hello world10이 아니라 11?
Cristian Lupascu

hello world11 의 무게 입니까? 공백과 10 자만 다릅니다. 또한-프로그램의 해밍 무게는 공백을 제외하고 길이와 같습니다. 일반 코드 골프와 크게 다르지 않습니다.
ugoren

미안, 나는 이것을 완전히 망쳤다. Wikipedia의 해밍 웨이트 기사는 다소 오해의 소지가 있으며, 규칙을 완전히 이해하지 못했습니다. 지금 다시 작성하십시오. 업데이트 : Ok, ASCII 문자열에서 1로 설정된 비트 수로 정의하기 위해 다시 작성되었습니다.
다항식

@ugoren 값이 낮은 ASCII 문자를 가진 솔루션은 해밍 가중치가 더 낮습니다.
다항식

1
이제 모든 것이 의미가 있습니다. 사용 대문자는 조심 ~AND o.
ugoren

답변:


6

J (33)

하나는 34보다 낮습니다!

+/,#:3 u:

심하게 영감 에 의해 이 대답 하지만, 하나의 해밍 무게가 내립니다.

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

8

J, 체중 34

+/,#:a.i.

사용법-측정 할 문자열을 끝에 따옴표로 묶습니다.

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

또는 키보드에서 입력을 가져옵니다 (무게 54).

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

이것을 작성하는 한 가지 방법이 있습니다 :)
ephemient

해밍 무게가 1보다 낮은 솔루션을 찾았습니다.
ɐɔıʇǝɥʇuʎs

버즈 킬을 시도하지는 않지만 규칙 은 프래그먼트가 아닌 프로그램을 요구합니다 .
FUZxxl 2016 년

5

J , 39

+/,#:a.i:]

이것은 하나의 인수를 취하는 함수입니다. (또는 ]Gareth가 지적했듯이 비용을 34로 낮추는 문자열로 직접 교체하십시오 .)

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

큰 마음은 다 비슷 하네. :-)
Gareth 2016 년

5

파이썬, 189

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

2
Python 3 상당 print(sum(bin(ord(A)).count('1')for A in input()))의 점수는 180 점입니다.
dan04

4
@ dan04 : 176에 대해 작은 따옴표 대신 큰 따옴표를 사용하십시오.
Keith Randall

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 PC에서 코딩하는 법을 배운 첫 번째 언어입니다.
다항식

5

단항 0

당신은 모두 그것이 올 것이라는 것을 알고있었습니다. 먼저 BrainFuck 프로그램 :

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

"읽을 수 있도록"줄 바꿈을 추가했지만 4066의 해밍 가중치를가집니다. 입력 문자열의 몫 / 나머지를 반복적으로 가져오고 나머지를 모두 합하여 작동합니다. 물론 스스로 실행하면 226 (4066 % 256) (기술적으로 \ xe2)이므로 분명히 승자가됩니다.

이제 우리는 그것을 단항으로 변환하고

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

우리는 NULL 문자 \ x00 '0'과 붐에 대한 단항 구현을 사용하며 해밍 가중치는 0입니다.

보너스 질문 : 어떤 ASCII 문자 c에 대해 N회귀 로 구성된 문자열에서이 프로그램을 실행 하고 해당 문자를 출력 할 수 있습니다. (EG 32 개의 문자열은 공백을줍니다). N일의 가치 (무한한 수가 작동하거나 전혀 작동하지 않음).


1
이 솔루션을 이해하고 있는지 잘 모르겠습니다. brainfuck 프로그램에는 엄청난 해밍 가중치가 있습니다. 단항은 프로그램으로 널 바이트를 허용합니까? 단항을 다시 구현해야합니까? 후자라면 실제로 유효한 솔루션은 아닙니다. 누구나 "단일 입력 바이트가 {result}를 제공하는 프로그래밍 언어를 정의합니다"라고 말하고 사이트의 모든 코드 골프 도전을 이길 수 있습니다.
다항식

1
널 문자 단항은 괜찮을 것입니다. 카운트 중지를 말하는 EOF 만 있으면됩니다. 실제로 여기에 그 파일을 읽는 의사 C main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }가 있습니다. EOF가 아닌 한 단항 문자로 선택한 것이 중요하지 않습니다.
walpen 2016 년

1
다음은 null 문자로 잘 작동하는 C 컴파일러의 단항입니다 : ideone.com/MIvAg . 물론이 프로그램을 만드는 데 필요한 파일은 우주에 적합하지 않지만 실행할 수있는 용량이 있습니다.
walpen 2016 년

3
실제로 실행할 수 없다면 실제로 해결책이 아닙니다.
다항식

4
으로 칼 세이건 한 번 말했다 : "당신은 문자열의 해밍 무게를 계산하려면, 먼저 10 ^ 500 우주를 발명해야합니다." (십억, 심지어 수십억)
월펜

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

주로 표준 골프 기술을 사용했습니다.
단일 루프는 가중치를 계산하고 (오른쪽으로 이동하고 0까지 추가) 문자열을 스캔합니다 (0에 도달하면 포인터를 전진).
가정 D이 2 (단일 매개 변수)로 초기화 되었다고 가정합니다 .

해밍 가중치 별 최적화 :
1. ABDH가중치가 각각 2 인 이름에 사용됩니다.
2. *++H선호 H[1].


하, 지금까지 첫 문장을 완전히 이해하지 못했습니다.
breadbox

결과를 단항 으로 출력하여 점수를 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

@ugoren : 단항의 규칙 / 정의에 따라 다릅니다. 예를 들어 en.wikipedia.org/wiki/Unary_numeral_system 은 탈리 마크를 사용하고 "기타 전통 기반과 같이 단항에는 0을 나타내는 명시적인 기호가 없습니다"라고 말합니다.
schnaader 2016 년

@schnaader, 알았지 만, 요구 사항을 "숫자로"확장하고 있다고 생각합니다.
ugoren 2016 년

4

골프 스크립트 84 72 58

{2base~}%{+}*

(하워드와 피터 테일러에게 도움을 주셔서 감사합니다)

입력 : 입력 문자열은 스택에 있어야합니다 (명령 줄 인수로 전달되거나 단순히 스택에 배치됨).

명령 행에서 실행하는 경우 반드시를 사용하십시오 echo -n. 그렇지 않으면 후행 줄 바꿈도 계산됩니다.

출력 : 해밍 중량 값을 콘솔에 인쇄

이 프로그램은 여기에서 테스트 할 수 있습니다 .


1
Golfscript는 대소 문자를 구분합니까? 그렇지 않은 경우 BASE대신을 사용하여 몇 비트를 저장할 수 있습니다 base. 업데이트 : 방금 확인했지만 BASE작동하지 않습니다. 좋은 해결책 :)
다항식

@ Polynomial 나는 당신의 TEST/ test의견 을 본 후에 그것을 시도했지만 :) 작동하지 않습니다.
Cristian Lupascu

우선 {...}2*신청 하면 제거 할 수 있습니다 2base~. 72까지 점수를 얻습니다.
Howard

@Howard이 위대한 팁에 감사드립니다! 나는 그것을 나의 대답에 적용했다.
Cristian Lupascu

웹 GolfScript 페이지의 중요한 제한 사항을 잊어 버렸기 때문에 테스트 메커니즘이 잘못되었습니다. ;stdin을 대신 하는 앞에 문자열이 있어야 하므로 (;불필요합니다. 하워드의 관찰은 65 점으로 떨어졌다.
Peter Taylor

2

펄 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

스칼라 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 자)의 무게는 231을 초과 할 수 없으며 인쇄 @할 수있는 모든 문자 ( 사용하지 않는 공간 및 공간 제외 )의 무게는 2 이상입니다.
ugoren

1
@ ugoren : 그러나 65 문자입니다. 프로그램은 거의 두 번 인쇄됩니다. 일단 코드를 작성하면 해밍 중량을 계산하고 두 번째는 정적 입력으로 프로그램을 계산합니다. 그러나 계산 부분에는 리터럴 입력이 필요하기 때문에 앞에 "readLine ()"이 없습니다. 나는 대답 자체를 명확히하려고 노력했다.
사용자 알 수 없음

1

자바, 무게 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을 사용하려면 +1 -r이어야합니까?)

소스 라인 당 단항 값으로 출력합니다. 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)을 선호합니다. 패턴 구분 기호로 @(점수 1) 또는 !(점수 2)를 선호합니다 /.

참고-올바른 문자 집합을 얻으려면이 표를의 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

수정 된 버전은 편리한 'count_ones'기능을 사용하여 6을 절약합니다 (262).

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

내장 된 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 주요 프로그래밍 언어), 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.