패리티 비트 생성


18

패리티 비트 체크섬의 간단한 형태 중 하나이다. 먼저, 짝수 또는 홀수의 패리티를 선택해야합니다. 우리가 고른다 고 가정 해 봅시다. 이제 전송할 메시지가 필요합니다. 우리의 메시지가 "푸"라고합시다. 이것은 다음과 같이 바이너리로 작성됩니다.

01000110 01101111 01101111

이제 115의 홀수이므로 메시지 끝에 1 비트를 더 추가해야하며 짝수의 '온'비트를 갖게됩니다. . 이 마지막으로 추가 된 비트를 "패리티 비트"라고합니다. 체크섬에 대해 홀수 패리티를 선택했다면 on 비트 수가 홀수로 유지되도록 추가 '0'을 추가해야합니다.

도전 과제 :

문자열의 올바른 패리티 비트가 무엇인지 결정하는 프로그램이나 함수를 작성해야합니다. 프로그램은 두 가지 입력을 받아야합니다.

  • 문자열, s. 이것은 체크섬이 계산 될 메시지입니다. 이것은 인쇄 가능한 95 개의 ASCII 문자로 제한됩니다.

  • 짝수 패리티 또는 홀수 패리티에 p해당 하는 문자 또는 단일 문자열 입니다.eo

올바른 패리티 비트를 나타내는 진실한 거짓 값을 생성합니다 . 이면 Truthy이고이면 1false 0입니다.

문자열 또는 문자에서 "온"비트 수를 계산하는 내장은 허용되지 않습니다. 예를 들어,이를 수행하는 기능 f: f('a') == 3또는 f('foo') == 16금지 된 기능. 기본 전환과 같은 다른 것은 공정한 게임입니다.

IO 테스트 :

(without the quotes)
s: "0"
p: 'e'
output: 0

s: "Foo"
p: 'e'
output: 1

s: "Hello World!"
p: 'o'
output: 0

s: "Alex is right"
p: 'e'
output: 1

s: "Programming Puzzles and Code-Golf" 
p: 'e'
output: 0

s: "Programming Puzzles and Code-Golf" 
p: 'o'
output: 1

이것은 codegolf이므로 표준 허점이 적용되며 바이트 단위의 최단 답변이 이깁니다.

리더 보드


10
오히려 귀찮게, o심지어 패리티가 있습니다.
Neil

당신은 명확하게 할 수 의 "의 수를 계산 내장 명령" "문자열이나 문자의 비트가 허용되지 않습니다." 조금 더 나은? 기본 제공 변환은 어떻습니까? 기타
orlp

@DrGreenEggsandHamDJ 스택 사이트에 대한 의견은 변동성이 있으며 사용자의 사정에 따라 아무런 이유없이 경고없이 사라질 수 있습니다. 결과적으로, 도전과 관련된 사양 은 의견 섹션이 아닌 게시물 자체에 포함되는 것이 좋습니다.
고양이

1
@cat 예를 들어, 파이썬에서 : str(int(s, 2)).count('1')? 아니요, 그 규칙을 위반 하는 단일 내장 함수 라고는 생각하지 않습니다 . 편집 내용이 더 명확합니까?
DJMcMayhem

1
@cat 내가 걱정하는 한 char == single_char_string. 또한 게시물을 편집했습니다.
DJMcMayhem

답변:


9

MATL , 8 7 바이트

8\hBz2\

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 한 번에 확인하십시오 .

8\    % Implicitly take first input ('e' or 'o'), and compute modulo 8. Inputs 'e' and 'o' 
      % give 5 or 7 respectively, which have an even or odd number of `1` bits resp.
h     % Implicitly take second input, and concatenate
B     % Convert to binary. Gives 2D array, with one row for each original entry 
z     % Number of nonzero values in that 2D array
2\    % Modulo 2, i.e. compute parity

9

자바, 97 바이트

왜냐하면, 나중에 알기 때문입니다.

(s,c)->{boolean e=1>0;for(int i:s.getBytes())while(i>0){if(i%2==1)e=!e;i/=2;}return c=='o'?e:!e;}

이것은에 대한 람다입니다 BiFunction<String, Character, Boolean>.

e그리고 o분명히 내 논리를 거꾸로 때문에 return 문에 반대 한 것으로 나타났습니다.


5

파이썬 2, 51 바이트

lambda s,p:`map(bin,map(ord,p+s))`[9:].count('1')%2

이것은 Sp3000의 아이디어를 기반으로 각 문자에 대한 합산이 아닌 이진 문자 코드 목록의 문자열 표현에서 1을 계산합니다.

새로운 트릭은 핸들입니다 eo이에뿐만 아니라. 만약이 e이상했다 및 o도, 우리는 ( '1'Truthy 때문에이를 뒤집기) 카운트를 수행하기 전에 문자열로 패리티 비트를 앞에 추가 할 수있다. 불행히도 그렇지 않습니다. 그러나 마지막 두 비트를 제외한 모든 비트를 제거하면 이제 사실입니다.

e 0b11001|01
o 0b11011|11 

9문자열 표현 의 첫 문자를 제거하면 됩니다.

['0b11001|01', 

와우, 그것은 정말 깔끔한 처리 방법입니다 eo!
Sp3000

4

젤리, 9 8 바이트

OBFSḂ⁼V}

온라인으로 사용해보십시오!

O         convert each character in argument 1 (left arg) to its codepoint (ord)
 B        convert to binary (list of 0s and 1s)
  F       flatten
   S      sum the entire list, giving the number of 1s in the entire string
    Ḃ     mod 2 (take the last bit)
       }  now, with the second (right) argument...
      V   eval with no arguments. This returns...
            1 for e because it expands to 0e0 (i.e., does 0 exist in [0])
            0 for o because it expands to 0o0 (0 OR 0, false OR false, false)
     ⁼    test equality between the two results

바이트에 대한 Dennis에게 감사합니다!


1
:-) 나 자신은 젤리 대답을 마련하려고 노력했지만, 그 체인 규칙은 나를 ellude
루이스 Mendo

2
@LuisMendo 나는 같은 보트에 있어요. 이것은 그것을 배우려고 노력한 후의 첫 번째 젤리 대답입니다 ... 너무 길다 : P
Doorknob

저것 V}... 저것은 정말로 시원했다! !! (Dennis는 진정한 골퍼입니다) +1 내 모든 시도를 이겼습니다.
Outgolfer Erik

4

C, 62 바이트

  • @LevelRiverSt 및 @TonHospel 덕분에 12 바이트가 절약되었습니다.

XOR은 패리티를 유지하면서 문자열을 한 문자로 줄이는 데 사용할 수있는 멋진 특성을 가지고 있습니다.

f(s,p)char*s;{for(p/=8;*s;)p^=*s>>4^*s++;p^=p/4;return p%4%3;}

이데온


1
27030>>((p^p>>4)&15)&1 p의 패리티를 계산해야하고 1 바이트 더 짧음
Ton Hospel

1
의 공간 char *suneeded입니다
톤 Hospel

2
62 바이트 : f(s,p)char*s;{for(p/=8;*s;)p^=*s>>4^*s++;p^=p/4;return p%4%3;}(가) %3항상 0 0을 반환하지만이 규칙에 따라 허용되는 1. 1 또는 2를 반환 할 수 있습니다truthy if it's a 1
레벨 강 세인트

1
27030>>((p^p>>4)&15)&1. 글쎄, 분명히. ;-)
Digital Trauma

@LevelRiverSt 브릴리언트! 감사!
Digital Trauma

4

파이썬, 58 57 바이트

lambda s,p:sum(bin(ord(c)).count("1")for c in s)&1!=p>'e'

1
53 (Python 2 만 해당) :lambda s,p:`map(bin,map(ord,s))`.count('1')%2^(p>'e')
Sp3000

로 바이트를 저장할 수 있습니다 !=p>'e'.
xnor

잠깐, 파이썬은 그것을 바이트 단위의 불평등으로 취급하기 때문에 바이트 저장이 실제로 작동하지 않습니다.
xnor

lambda s,p:`map(bin,map(ord,p+s))`[8:].count('1')%2
xnor

@xnor 자신의 답변을 게시하십시오.
orlp

3

Pyth, 12 바이트

q@"oe"sjCz2w

테스트 스위트.

         z    take a line of input
        C     convert to int
       j  2   convert to base 2, array-wise (so, array of 0s and 1s)
      s       sum (count the number of ones)
 @"oe"        modular index into the string to get either "o" or "e"
q          w  test equality to second line of input

3

자바 스크립트 (ES6), 84 72 바이트

(s,p)=>(t=p>'e',[...s].map(c=>t^=c.charCodeAt()),t^=t/16,t^=t/4,t^t/2)&1

비트 twiddling은 base 2로 변환하고 1s를 계산하는 것보다 짧습니다 .


2

펄, 29 바이트

에 +2 포함 -p

STDIN의 입력을 패리티 문자 공간 문자열로 실행하십시오. 예 :

parity.pl <<< "p Programming Puzzles and Code-Golf"

parity.pl

#!/usr/bin/perl -p
$_=unpack"B*",$_|b;$_=1&y;1;

2

J, 27 바이트

'oe'&i.@[=[:~:/^:2@#:3&u:@]

용법

   f =: 'oe'&i.@[=[:~:/^:2@#:3&u:@]
   'e' f '0'
0
   'e' f 'Foo'
1
   'o' f 'Hello World!'
0
   'e' f 'Alex is right'
1
   'e' f 'Programming Puzzles and Code-Golf'
0
   'o' f 'Programming Puzzles and Code-Golf'
1

1

자바 스크립트 (ES6), 69 바이트

(s,p)=>[...s].map(c=>{for(n=c.charCodeAt();n;n>>=1)r^=n&1},r=p>"e")|r

1

PowerShell v2 +, 91 바이트

/ me 코너에서 울다

param([char[]]$a,$b)$b-eq'o'-xor(-join($a|%{[convert]::toString(+$_,2)})-replace0).length%2

예 ... 따라서 기본 변환은 PowerShell에 적합하지 않습니다. 입력 문자열에서 이진 표현으로의 변환 $a|%{[convert]::toString(+$_,2)}은 32 바이트 자체입니다 ...

프로세스에서 입력 $a$b을 명시 적으로 $a문자 배열로 캐스팅 합니다. 우리는 다음 여부를 확인 $b하다 -eq으로 연간를 o하고, -xor프로그램의 나머지 절반과 그. 그 부분을 위해, 우리는 입력 문자열을 $a, 이진 각 문자를 변환하는 루프를 통해, 파이프를 -join하나의 고체 문자열을 형성하기 위해 모든 함께, 그리고 -replace모든 0아무것도의. 우리는 다음을 계산 .length하는 문자열과는 MOD-2가 짝수 또는 홀수인지를 결정하기 위해 수행,하는 것입니다 편리 할 하나 0또는1 에 대해 완벽 -xor.

반환 True이나 False따라. 아래 테스트 사례를 참조하십시오.

PS C:\Tools\Scripts\golfing> .\generate-parity-bit.ps1 "0" e
False

PS C:\Tools\Scripts\golfing> .\generate-parity-bit.ps1 "Foo" e
True

PS C:\Tools\Scripts\golfing> .\generate-parity-bit.ps1 "Hello World!" o
False

PS C:\Tools\Scripts\golfing> .\generate-parity-bit.ps1 "Alex is right" e
True

PS C:\Tools\Scripts\golfing> .\generate-parity-bit.ps1 "Programming Puzzles and Code-Golf" e
False

PS C:\Tools\Scripts\golfing> .\generate-parity-bit.ps1 "Programming Puzzles and Code-Golf" o
True

1

인자, 85 바이트

어떤 이유로 나는 코드를 단순화하고 단축했을 때 몇 분 전까지이 머리를 감쌀 수 없었습니다.

[ "e" = [ even? ] [ odd? ] ? [ [ >bin ] { } map-as concat [ 49 = ] count ] dip call ]

?삼항 연산자와 같습니다. 세 번째 스택 항목의 진실성을 테스트하고 true값 또는 값을 선택합니다 false.

다음과 같은 C 유사 pseduocode와 거의 같습니다.

void* parity_tester_function = strcmp(p, "e") ? (void *) even?  // it's a function pointer (I think)
                                              : (void *) odd? ;

나머지 코드는 매우 간단합니다.

[                       ! to count a string's set bits:
    [ >bin ] { } map-as ! get the binary of each character, and map as an array, because you can't have stringy data nested in another string (that's called a type error)
    concat              ! { "a" "B" } concat -> "aB"
    [ 49 = ] count      ! count items in the resulting string which match this condition (in this case, the condition we're testing is whether the character has the same code point as "1")
] dip                   ! take the above function pointer off the stack, apply this anonymous function to the now-top of the stack, then restore the value after the quotation finishes.
                        ! in other words, apply this quotation to the second-to-top item on the stack
call                    ! remember that conditionally chosen function pointer? it's on the top of the stack, and the number of sets bits is second.
                        ! we're gonna call either odd? or even? on the number of set bits, and return the same thing it does.

1

IA-32 기계 코드, 15 바이트

16 진 덤프 :

0f b6 c2 40 32 01 0f 9b c0 3a 21 41 72 f6 c3

조립 코드 :

    movzx eax, dl;
    inc eax;
repeat:
    xor al, [ecx];
    setpo al;
    cmp ah, [ecx];
    inc ecx;
    jb repeat;
    ret;

이것은에서 첫 번째 인수 (문자열) ecx및 두 번째 인수 (char) 를받는 함수입니다 dl. 결과를로 반환 eax하므로 fastcall호출 규칙 과 호환됩니다 .

이 코드는 setpo명령을 사용할 때 규칙을 구부립니다 .

문자열 또는 문자에서 "온"비트 수를 계산하는 내장은 허용되지 않습니다.

이 명령어는 al이전 명령어로 계산 된 패리티 비트로 설정 되므로 규칙에 다음 두 가지 nitpicks가 있습니다.

  • "온"비트 수를 계산하지 않습니다-패리티 비트를 직접 계산합니다!
  • 기술적으로 xor는 패리티 비트를 계산하는 이전 명령어 ( )입니다. setpo지시 만에 이동 al레지스터.

이러한 의미 론적 세부 사항은 코드의 기능에 대한 설명입니다.

문자의 표현은 다음과 같습니다.

'e' = 01100101
'o' = 01101111

1을 더하면 올바른 패리티를 갖습니다.

'e' + 1 = 01100110 (odd parity)
'o' + 1 = 01110000 (even parity)

따라서 XOR문자열의 모든 문자 al가 이러한 값으로 초기화 되어 답이됩니다.


첫 번째 명령은 movzx eax, dl더 분명한 (그리고 더 짧은) 대신 에, 올바른 순서 ()가 아닌 올바른 순서로 비교하기 위해 mov al, dl레지스터 ( ah이 경우)에 숫자 0을 갖기를 원하기 때문 입니다.0, [ecx][ecx], 0


1

줄리아, 58 47 45 40 바이트

f(s,p)=(p>'e')$endof(prod(bin,s)∩49)&1

문자열과 문자를 받아서 정수를 반환하는 함수입니다.

이진 표현에서 1의 수를 얻으려면 먼저 bin문자열의 각 문자에 함수를 적용하여 이진 문자열 배열을 제공합니다. 그런 다음 prod( *줄리아의 문자열 연결 이므로 )를 사용하여 하나로 줄 이십시오. 그 문자열과에 대한 문자 코드의 교차점을 가져 와서 문자열 1을 제공하십시오. 해당 문자열의 마지막 색인은 1의 수입니다. 제공된 문자가 o 이면 0으로, 그렇지 않으면 비트 AND 1을 사용하여 패리티를 얻습니다.

온라인으로 사용해보십시오!(모든 테스트 케이스 포함)

Dennis 덕분에 18 바이트가 절약되었습니다!


1

05AB1E , 15 , 13 바이트

암호:

€ÇbSOÈ„oe²k<^

입력 예 :

Programming Puzzles and Code-Golf
o

출력 예 :

1

설명:

€                 # for each char in string
 Ç                # get ascii value
  b               # convert to binary
   S              # split to single chars (ex: '1101' to '1','1','0','1')
    O             # sum
     È            # check if even
      „oe         # push string "oe"
         ²        # push 2nd input (p)
          k       # get 1-based index of p in "oe"
           <      # decrease (to get either 0-based index)
            ^     # xor with result of È

2 바이트를 절약 한 Adnan에게 감사합니다.


와우, 아주 좋아요! ²명령 을 사용하여 2 바이트를 골프 오프 할 수 있습니다 . 스택의 두 번째 입력을 자동으로 푸시합니다. 또한 두 문자 문자열은을 사용하여 단축 될 수 있습니다 . 따라서 "oe"와 같습니다 . 13 바이트의 경우 : €ÇbSOÈ„oe²k<^:)
Adnan

05AB1E는 CP-1252 인코딩 도 사용 하므로 여기의 각 문자는 1 바이트입니다. :)
Adnan

@Adnan : 감사합니다!
바이트 수에

0

루비, 57 바이트

0루비에서 거짓 이라면 ==아마도로 변경 -되거나 다른 최적화가있을 수 있지만 그렇지 않습니다.

->s,b{s.gsub(/./){$&.ord.to_s 2}.count(?1)%2==(b>?i?0:1)}

0

레티 나 , 102 바이트

첫 번째 줄의 문자열과 두 번째 줄의 문자를 취합니다. ISO 8859-1 인코딩을 사용합니다.

[12478abdghkmnpsuvyzCEFIJLOQRTWX#%&)*,/;=>@[\]^| ](?=.*¶)
1
[^1](?=.*¶)
0
^(0|10*1)*¶o|^0*1(0|10*1)*¶e

온라인으로 사용해보십시오

첫 번째 행의 문자 클래스는 이진 표현에서 홀수의 문자를 가진 문자를 찾습니다.

정규식을 사용한 짝수 / 홀수 감지 방법에 대한 설명은 여기를 참조하십시오 .


0

옥타브, 56 바이트

f=@(s,p) mod(sum((i=bitunpack([s p]))(1:length(i)-5)),2)

bitunpack기능은 ASCII 문자를 들면, 리틀 엔디안 순서로 반환합니다. 따라서 문자열 끝에 패리티 플래그를 넣고 전체를 언 패킹하고 마지막 5 비트를 삭제하면 mod 2 전체를 요약하여 최종 답변을 얻을 수 있습니다.

용법:

octave:137> f('Hello World!', 'o')
ans = 0
octave:138> f('Hello World!', 'e')
ans =  1

0

 커먼 리스프, 87

(lambda(s p)(=(mod(reduce'+(mapcar'logcount(map'list'char-code s)))2)(position p"oe")))
  • 의 문자 코드 로그 수를 합산하십시오 s.
  • 이것의 나머지는 2로 나눌 때 p문자열에서 패리티 인수의 위치 "oe"(0 또는 1)와 비교됩니다. 예를 들어, 4 개가 있으면 나머지는 0입니다. p가 o인 경우 추가 비트를 추가하지 않아야하며 테스트는 false를 반환합니다.

예쁜 인쇄

(lambda (s p)
  (= (mod (reduce '+ (mapcar 'logcount (map 'list 'char-code s))) 2)
     (position p "oe")))

0

자바, 91 바이트

(s,c)->{s+=c%8;int e=1;for(int i:s.getBytes())while(i>0){if(i%2==1)e^=1;i/=2;}return e==0;}

@ CAT97과 같은 작업을 수행했지만 모듈로 8을 사용하고 @Luis Mendo를 연결하고 부울 대신 int를 사용하여 일부 문자를 제거했습니다.

이것은에 대한 람다입니다 BiFunction<String, Character, Boolean>.


0

Matlab, 49 바이트

f=@(x,p)mod(sum(sum(dec2bin(x)-'0'))+(p-'e'>0),2)

어디:

  • x는 입력 문자열입니다.
  • p는 짝수이면 'e'이고 홀수이면 'o'입니다.

예를 들면 다음과 같습니다.

>> f('Programming Puzzles and Code-Golf','e')

ans =

     0

0

배쉬 및 유닉스 도구 (72 바이트)

f(){ bc<<<"$(xxd -b<<<"$2$1"|cut -b9-64|tail -c +7|tr -dc 1|wc -c)%2" }

Excepts s최초로 및 p제 인수. 다행히도의 마지막 3 비트 oe각각 홀수 및 짝수 패리티를 갖는다.

xxd -b        print the concatenation of `p` and `s` in binary
cut -b9-64    parse xxd output
tail -c +7    keep only the last 3 bits of `p`
tr -dc 1      keep only the `1`s
wc -c         count them
bc ...%2      modulo two

를 통해 입력을 제공하면 <<<줄 바꿈 문자가 추가되지만 패리티 \n는 짝수이므로 문제가되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.