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


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.