해밍 가중치 를 계산하는 프로그램을 만듭니다. 문자열. 우승자는 해밍 가중치가 가장 낮은 프로그램입니다.
규칙 :
- ASCII 문자의 해밍 가중치는
- 입력 인코딩이 7 비트 ASCII라고 가정하고 언어에 대해 정상적인 입력 메커니즘 (예 : stdin, args 등)을 통해 전달됩니다.
- 결과를 표준 출력 또는 언어에서 사용하는 기본 / 정상 출력 메커니즘에 숫자로 출력합니다.
- 말할 필요도 없지만 실제로 실행할 수 있어야합니다. 이 프로그램은 실제 환경에서 유효한 솔루션이 될 수 있습니다.
- 승자는 코드의 해밍 가중치가 가장 낮은 솔루션입니다.
-
죄송합니다. 공백 에 해결책이 없습니다!좋습니다. 이제 공백으로 코딩 할 수 있습니다. 규칙을 정리했습니다. 🙂
문자 별 예 :
char | binary | weight -----+----------+------- a | 01100001 | 3 x | 01111000 | 4 ? | 00111111 | 6 \x00 | 00000000 | 0 \x7F | 01111111 | 7
댓글
답변
답변
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
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 개 미만이며 인쇄 가능한 모든 문자 (
@
및 공백 제외 ‘ 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 ()은 모든 값을 합산합니다.
자체 소스 코드의 해밍 가중치 계산 :
답변
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
0x20
/ ASCII 32를 참조하면 ‘hello world
의 허밍 가중치가 11이 아니라 10이 아닌가요?hello world
11의 가중치는 무엇입니까? 10 자만 공백과 다릅니다. 또한 프로그램 ‘의 해밍 가중치는 공백을 제외한 길이에 불과한 것 같습니다. 일반 코드 골프와 크게 다르지 않습니다.~
및o
에주의하세요.