해밍 가중치 를 계산하는 프로그램을 만듭니다. 문자열. 우승자는 해밍 가중치가 가장 낮은 프로그램입니다.

규칙 :

  • ASCII 문자의 해밍 가중치는
  • 입력 인코딩이 7 비트 ASCII라고 가정하고 언어에 대해 정상적인 입력 메커니즘 (예 : stdin, args 등)을 통해 전달됩니다.
  • 결과를 표준 출력 또는 언어에서 사용하는 기본 / 정상 출력 메커니즘에 숫자로 출력합니다.
  • 말할 필요도 없지만 실제로 실행할 수 있어야합니다. 이 프로그램은 실제 환경에서 유효한 솔루션이 될 수 있습니다.
  • 승자는 코드의 해밍 가중치가 가장 낮은 솔루션입니다.
  • 죄송합니다. 공백 에 해결책이 없습니다! 좋습니다. 이제 공백으로 코딩 할 수 있습니다. 규칙을 정리했습니다. 🙂

문자 별 예 :

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

댓글

  • 0x20 / ASCII 32를 참조하면 ‘ hello world의 허밍 가중치가 11이 아니라 10이 아닌가요?
  • hello world 11의 가중치는 무엇입니까? 10 자만 공백과 다릅니다. 또한 프로그램 ‘의 해밍 가중치는 공백을 제외한 길이에 불과한 것 같습니다. 일반 코드 골프와 크게 다르지 않습니다.
  • 죄송합니다. Wikipedia ‘의 해밍 웨이트 기사는 다소 오해의 소지가 있으며 저는 규칙을 완전히 망설였습니다. ‘ 지금 다시 작성하십시오. 업데이트 : 좋아, ASCII 문자열에서 1로 설정된 비트 수로 정의하도록 다시 작성했습니다. 실수로 죄송합니다.
  • @ugoren -value ASCII 문자는 해밍 가중치가 낮습니다.
  • 이제 모든 것이 이해됩니다. 대문자를 사용하고 ~o에주의하세요.

답변

J (33)

34보다 하나 낮음!

+/,#:3 u: 

많이 m 이 답변 에서> 영감을 얻었지만 해밍 가중치는 하나 더 낮습니다.

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

답변

J, 무게 34

+/,#:a.i. 

사용법- 끝에 따옴표로 묶여 측정 할 문자열 :

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

또는 키보드에서 입력 (웨이트 54) :

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

댓글

  • 이를 작성하는 유일한 방법은 ‘입니다. 🙂
  • ‘ t … 해밍 가중치가 하나 더 낮은 솔루션을 찾았습니다.
  • 버즈 킬을 시도하지 않고, 그러나 규칙은 단편이 아닌 프로그램 을 요구합니다.

답변

J , 39

+/,#:a.i:] 

이것은 하나를 취하는 함수입니다. 논의. (또는 ]를 문자열로 직접 바꾸십시오. 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()) 

댓글

  • Python 3에 해당하는 print(sum(bin(ord(A)).count('1')for A in input()))의 점수는 180 점입니다.
  • @ dan04 : 176에는 작은 따옴표 대신 큰 따옴표를 사용합니다.

Answer

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

답변

단항 0

여러분 모두 그것이 올 것이라는 것을 알고 있습니다. 먼저 BrainFuck 프로그램 :

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

“읽을 수 있도록”줄 바꿈을 추가했지만 해밍 가중치가 4066입니다. 반복적으로 몫 / 입력 문자열의 나머지와 나머지를 모두 더합니다. 물론 스스로 실행하면 다음과 같은 결과를 얻을 수 있습니다. 226 (4066 % 256) (기술적으로 \ xe2) 따라서 분명히 승자가됩니다.

이제 Unary로 변환하여

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

“0”및 붐에 대해 NULL 문자 \ x00, 해밍 가중치 0으로 단항 구현을 사용합니다.

보너스 질문 : c 어떤 ASCII 문자에 대해 N 반복하여 해당 문자를 출력하도록합니다. (예 : 32 개의 공백 문자열은 공백을 제공합니다).N의 어떤 값이 작동하는지 (무한한 수가 작동하거나 작동하지 않음)

댓글

  • ‘이 솔루션을 이해하고 있는지 잘 모르겠습니다. brainfuck 프로그램에는 엄청난 해밍 가중치가 있습니다. Unary는 널 바이트를 프로그램으로 허용합니까, 아니면 Unary를 다시 구현해야합니까? 후자의 경우 ‘ ‘ 정말 유효한 솔루션이 아닙니다. 누구나 ” 단일 입력 바이트가 {result} “를 제공하고 사이트의 모든 코드 골프 챌린지에서 승리하는 프로그래밍 언어를 정의합니다.
  • A null 캐릭터 Unary는 괜찮을 것입니다. 필요한 것은 계산 중지를 말하는 EOF뿐입니다. 사실 여기에 ‘ 파일을 읽을 수있는 의사 C가 있습니다. main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; } 않습니다 ‘ 단항 문자로 선택하는 것이 무엇이든 중요합니다 (‘ t EOF가 아닌 경우).
  • 여기 ‘ null 문자 ( ideone.com/MIvAg )와 잘 작동하는 단항 to C 컴파일러입니다. 물론이 프로그램을 만드는 데 필요한 파일은 우주에 맞지 않지만 실행할 수있는 용량이 있습니다.
  • 가능하다면 ‘ t 실제로 실행하면 ‘ 실제로 해결책이 아닙니다.
  • Carl Sagan으로서 : ” 문자열의 해밍 가중치를 계산하려면 먼저 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);} 

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

해밍 가중치 특정 최적화 ons :
1. ABDH, 가중치가 각각 2이고 이름에 사용됩니다.
2. *++H

.

댓글

  • 아, 방금까지 당신의 첫 문장을 완전히 이해하지 못했습니다.
  • 결과를 단항 숫자로 출력하여 점수를 230 점으로 낮출 수 있습니다. main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
  • @schnaader , 저는 @가 단항 시스템의 숫자라는 것을 몰랐습니다. 0 .. 0 만 사용한다고 생각했습니다. 하지만 이렇게하려면 printf("@"+*a%2)가 더 짧습니다.
  • @ugoren : 단항의 규칙 / 정의에 따라 다릅니다. 예 : en.wikipedia.org/wiki/Unary_numeral_system 은 집계 표시를 사용하며 ” 0을 나타내는 명시적인 기호가 없습니다. 다른 전통적인 기지와 마찬가지로 단항으로 표시됩니다 “.
  • @schnaader, 좋습니다.하지만 저는 그렇게 생각합니다 ‘ 요구 사항이 ” 숫자로 ” 너무 많이 확장되었습니다.

답변

골프 스크립트 84 72 58

{2base~}%{+}* 

(Howard와 Peter Taylor의 도움에 감사드립니다)

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

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

출력 : 해밍 가중치 값을 콘솔에 인쇄합니다.

프로그램을 테스트 할 수 있습니다.

여기 .

댓글

  • Golfscript는 대소 문자를 구분하나요? 그렇지 않은 경우 base 대신 BASE를 사용하여 몇 비트를 절약 할 수 있습니다. 업데이트 : 방금 확인했지만 BASE가 작동하지 ‘ 있습니다. 좋은 해결책 🙂
  • @Polynomial TEST / test 댓글을보고 시도했지만 🙂 ‘ 작동하지 않습니다.
  • 2base~{…}2*를 제거 할 수 있습니다. / div> 처음에. 점수를 72 점으로 낮 춥니 다.
  • @Howard 감사합니다. ‘ 내 답변에 적용했습니다.
  • 테스트 메커니즘이 잘못되었습니다. ‘ 웹 GolfScript 페이지의 중요한 제한 사항입니다. stdin을 대체 할 문자열 앞에 ;가 있어야하므로 (;가 필요하지 않습니다. 그런 다음 Howard ‘의 관찰 결과는 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 개 미만이며 인쇄 가능한 모든 문자 (@ 및 공백 제외 ‘ t 사용) 최소 2 개의 가중치를 갖습니다.
  • @ugoren :하지만 ‘ 65 자에 불과합니다. 프로그램은 거의 두 번 인쇄됩니다. 한 번 코드는 해밍 가중치를 계산하고 두 번째는 정적 입력으로 프로그램에 대해 계산합니다. 그러나 계산 부분은 리터럴 입력을 받기 때문에 앞에 ” readLine () “이 없습니다. 답 자체를 명확히하려고 노력했습니다.

답변

Java, weight 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! 

모든 문자를 나열하는 것을 피하는 것은 어렵지만 줄일 수 있습니다. 이는 소문자가 해당 대문자보다 해밍 가중치가 하나 더 많다는 것을 관찰합니다. 구문 구분 기호로 세미콜론 (점수 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

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

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])))) 

입력에 명령 줄 인수를 사용합니다.

답변

CJam 52 또는 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[:]))) 

p>

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 ) 제빵사의 문제 해결 :

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 Programming Language), 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

온라인으로 사용해보세요!

이것은 “코드 골프는 아니지만, 가장 짧은 솔루션은 해밍 무게가 가장 작은 것 같습니다 …

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다