Tạo một bit chẵn lẻ


18

Một bit chẵn lẻ , là một trong những hình thức đơn giản nhất của tổng kiểm tra. Đầu tiên, bạn phải chọn chẵn lẻ, chẵn hoặc lẻ. Hãy nói rằng chúng tôi chọn thậm chí. Bây giờ, chúng ta cần một thông điệp để truyền tải. Hãy nói rằng thông điệp của chúng tôi là "Foo". Điều này được viết dưới dạng nhị phân như:

01000110 01101111 01101111

Bây giờ, chúng tôi đếm tổng số số 1trong đó là 15. Vì 15 là số lẻ, chúng tôi phải thêm một bit vào cuối tin nhắn và bây giờ chúng tôi sẽ có số bit 'on' chẵn . Bit được thêm vào cuối cùng này được gọi là "bit chẵn lẻ". Nếu chúng tôi đã chọn một mức chẵn lẻ cho tổng kiểm tra của mình, chúng tôi sẽ phải thêm một '0' để số lượng bit trên vẫn còn lẻ.

Các thách thức:

Bạn phải viết một chương trình hoặc hàm xác định bit chẵn lẻ chính xác cho chuỗi là gì. Chương trình của bạn phải có hai đầu vào:

  • Một chuỗi , s. Đây là thông báo mà tổng kiểm tra sẽ được tính trên. Điều này sẽ được giới hạn ở 95 ký tự ASCII có thể in được.

  • Một ký tự hoặc chuỗi ký tự đơn p, sẽ là echẵn lẻ hoặc ochẵn lẻ.

và tạo ra một giá trị trung thực-falsey đại diện cho bit chẵn lẻ chính xác. Sự thật nếu nó là một 1, và falsey nếu nó là một 0.

Không được phép xây dựng các số đếm "bit" trong chuỗi hoặc ký tự. Ví dụ, một chức năng fthực hiện điều này: f('a') == 3hoặc f('foo') == 16bị cấm. Bất cứ điều gì khác, chẳng hạn như chuyển đổi cơ sở, là trò chơi công bằng.

Kiểm tra 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

Đây là codegolf, vì vậy các sơ hở tiêu chuẩn được áp dụng và câu trả lời ngắn nhất tính theo byte sẽ thắng.

Bảng xếp hạng


10
Khá khó chịu, othậm chí có sự tương đương.
Neil

Bạn có thể làm rõ "Nội dung đếm số bit" bật "trong chuỗi hoặc ký tự không được phép không." tốt hơn một chút? Điều gì về chuyển đổi cơ sở tích hợp? V.v ..
orlp

@DrGreenEggsandoutDJ Nhận xét về các trang web Stack rất dễ bay hơi và có thể biến mất mà không có cảnh báo mà không có lý do, tại bất kỳ ý thích nào của người dùng có khả năng. Do đó, rất khuyến khích rằng thông số kỹ thuật không thể thiếu trong thử thách nằm trong chính bài đăng chứ không phải phần bình luận.
mèo

1
@cat Ví dụ: trong trăn : str(int(s, 2)).count('1')? Không, tôi sẽ không xem xét rằng để trở thành một đơn chức năng được xây dựng trong đó vi phạm quy tắc đó. Liệu chỉnh sửa của tôi làm cho nó rõ ràng hơn?
DJMcMayhem

1
@cat Theo như tôi quan tâm char == single_char_string. Tôi cũng chỉnh sửa nó vào bài viết.
DJMcMayhem

Câu trả lời:


9

MATL , 8 7 byte

8\hBz2\

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc .

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

Java, 97 byte

Bởi vì, bạn biết đấy, Java.

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

Đây là một lambda cho a BiFunction<String, Character, Boolean>.

eodường như bị đảo ngược trong câu lệnh return vì rõ ràng logic của tôi bị ngược.


5

Python 2, 51 byte

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

Điều này dựa trên ý tưởng của Sp3000 để đếm 1 trong biểu diễn chuỗi của danh sách mã ký tự ở dạng nhị phân thay vì tính tổng cho mỗi ký tự.

Thủ thuật mới là xử lý eotrong việc này là tốt. Nếu elà số lẻ và số chẵn o, chúng ta chỉ có thể thêm bit chẵn lẻ vào chuỗi trước khi thực hiện đếm (lật chúng vì '1' là Sự thật). Thật không may, họ không. Nhưng, nếu chúng ta loại bỏ tất cả trừ hai bit cuối cùng của chúng, thì giờ đã thành sự thật.

e 0b11001|01
o 0b11011|11 

Điều này được thực hiện bằng cách loại bỏ 9ký tự đầu tiên của biểu diễn chuỗi.

['0b11001|01', 

Wow, đó là một cách xử lý thực sự gọn gàng eo!
Sp3000

4

Thạch, 9 8 byte

OBFSḂ⁼V}

Hãy thử trực tuyến!

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

Cảm ơn Dennis cho một byte!


1
Bản thân tôi đã cố gắng đưa ra một câu trả lời Jelly, nhưng những quy tắc xâu chuỗi đó đã khiến tôi lúng túng :-)
Luis Mendo

2
@LuisMendo Tôi ở cùng thuyền; đây là câu trả lời Jelly đầu tiên của tôi sau khi đã cố gắng học nó trong ... quá lâu: P
Doorknob

Điều đó V}... thật tuyệt vời !!! (Dennis là một tay golf thực sự) +1 Nó đánh bại mọi nỗ lực của tôi.
Erik the Outgolfer

4

C, 62 byte

  • 12 byte được lưu nhờ vào @LevelRiverSt và @TonHosp.

XOR có một đặc tính tốt là nó có thể được sử dụng để giảm các chuỗi xuống một char, trong khi vẫn giữ được tính chẵn lẻ.

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

Ideone.


1
27030>>((p^p>>4)&15)&1 nên tính chẵn lẻ của p và thậm chí ngắn hơn 1 byte
TonMedel

1
Không gian trong char *slà không cần thiết
TonMedel

2
62 byte: f(s,p)char*s;{for(p/=8;*s;)p^=*s>>4^*s++;p^=p/4;return p%4%3;}Các %3sẽ luôn luôn trở về 0 cho một 0, nhưng có thể trở lại 1 hoặc 2 cho một 1. Đây là chấp nhận được theo quy định:truthy if it's a 1
Cấp sông St

1
27030>>((p^p>>4)&15)&1. Vâng, sai, rõ ràng. ;-)
Chấn thương kỹ thuật số

@LevelRiverSt Rực rỡ! cảm ơn!
Chấn thương kỹ thuật số

4

Python, 58 57 byte

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

1
53 (chỉ dành cho Python 2):lambda s,p:`map(bin,map(ord,s))`.count('1')%2^(p>'e')
Sp3000

Bạn có thể lưu một byte với !=p>'e'.
xnor

Đợi đã, byte-save của tôi không thực sự hoạt động vì Python coi nó như một bất đẳng thức bị xiềng xích.
xnor

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

@xnor Chỉ cần đăng câu trả lời của riêng bạn.
orlp

3

Bình thường, 12 byte

q@"oe"sjCz2w

Bộ thử nghiệm.

         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

JavaScript (ES6), 84 72 byte

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

Bit twiddling hóa ra ngắn hơn so với chuyển đổi sang cơ sở 2 và đếm 1s.


2

Perl, 29 byte

Bao gồm +2 cho -p

Chạy với đầu vào trên STDIN dưới dạng chuỗi không gian ký tự chẵn lẻ, vd

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

parity.pl

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

2

J, 27 byte

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

Sử dụng

   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

PowerShell v2 +, 91 byte

/ tôi khóc ở một góc

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

Vâng ... vì vậy, chuyển đổi cơ sở không phải là một sự phù hợp mạnh mẽ cho PowerShell. Việc chuyển đổi từ chuỗi đầu vào sang biểu diễn nhị phân $a|%{[convert]::toString(+$_,2)}là 32 byte và ...

Đưa đầu vào $a$b, rõ ràng $alà một mảng char trong quy trình. Sau đó, chúng tôi kiểm tra xem có phải $b-equal hay không o, và -xorđiều đó với nửa kia của chương trình. Về phần đó, chúng tôi lấy chuỗi đầu vào $a, chuyển nó qua một vòng lặp để chuyển đổi từng chữ cái thành nhị phân, -jointất cả những thứ đó cùng nhau tạo thành một chuỗi rắn và -replacetất cả các 0s không có gì. Sau đó chúng tôi đếm .lengthcủa chuỗi đó và mang nó mod-2 để xác định xem đó là chẵn hoặc lẻ, mà thuận tiện sẽ là một trong hai 0hoặc 1, hoàn hảo cho -xor.

Sẽ trở lại Truehoặc Falsetheo đó. Xem các trường hợp thử nghiệm dưới đây:

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

Yếu tố, 85 byte

Vì một số lý do, tôi không thể quấn đầu quanh cái này cho đến vài phút trước, khi tôi đơn giản hóa (và có thể rút ngắn?) Mã.

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

?giống như một toán tử ternary: nó kiểm tra tính trung thực của mục ngăn xếp thứ ba và chọn truegiá trị hoặc falsegiá trị.

Nó gần tương đương với mã pseduocode giống như C sau đây:

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

Phần còn lại của mã khá đơn giản:

[                       ! 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

Mã máy IA-32, 15 byte

Hexdump:

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

Mã hội:

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

Đây là một hàm nhận đối số đầu tiên (chuỗi) trong ecxvà đối số thứ hai (char) trong dl. Nó trả về kết quả eax, vì vậy nó tương thích với fastcallquy ước gọi.

Mã này uốn cong các quy tắc khi nó sử dụng setpohướng dẫn:

Không được phép xây dựng các số đếm "bit" trong chuỗi hoặc ký tự

Hướng dẫn này đặt althành bit chẵn lẻ được tính theo hướng dẫn trước - vì vậy tôi có hai nitpicks này theo quy tắc:

  • Nó không đếm số bit "bật" - nó tính trực tiếp bit chẵn lẻ!
  • Về mặt kỹ thuật, đó là hướng dẫn trước đó ( xor) tính toán bit chẵn lẻ. Các setpohướng dẫn chỉ di chuyển nó để alđăng ký.

Đây là những chi tiết ngữ nghĩa, đây là lời giải thích về những gì mã làm.

Các đại diện của các nhân vật là:

'e' = 01100101
'o' = 01101111

Nếu chúng ta thêm 1 vào chúng, chúng sẽ có đúng chẵn lẻ:

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

Vì vậy, XORtất cả chúng ta tất cả các ký tự của chuỗi, khởi tạo alcho các giá trị này, đưa ra câu trả lời.


Hướng dẫn đầu tiên movzx eax, dlthay vì rõ ràng hơn (và ngắn hơn) mov al, dl, vì tôi muốn có số 0 trong một thanh ghi ( ahtrong trường hợp này) để có thể so sánh nó theo đúng thứ tự ( 0, [ecx]chứ không phải [ecx], 0).


1

Julia, 58 47 45 40 byte

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

Đây là một hàm chấp nhận một chuỗi và một ký tự và trả về một số nguyên.

Để có được số lượng trong biểu diễn nhị phân, trước tiên chúng ta áp dụng binhàm cho từng ký tự trong chuỗi, cung cấp cho chúng ta một chuỗi các chuỗi nhị phân. Sau đó giảm chúng thành một bằng cách sử dụng prod(vì *là nối chuỗi trong Julia) và lấy giao điểm đã đặt của chuỗi đó và mã ký tự cho 1, cung cấp cho chúng ta một chuỗi các chuỗi. Chỉ số cuối cùng của chuỗi đó là số lượng. Chúng tôi XOR điều này với 1 nếu ký tự được cung cấp là o và 0, sau đó nhận được tính chẵn lẻ bằng bitwise AND 1.

Hãy thử trực tuyến! (bao gồm tất cả các trường hợp thử nghiệm)

Đã lưu 18 byte nhờ Dennis!


1

05AB1E , 15 , 13 byte

Mã số:

€ÇbSOÈ„oe²k<^

Ví dụ đầu vào:

Programming Puzzles and Code-Golf
o

Kết quả ví dụ:

1

Giải trình:

€                 # 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 È

Cảm ơn Adnan đã lưu 2 byte.


Wow, rất tuyệt! Bạn có thể tắt hai byte bằng cách sử dụng ²lệnh. Điều này sẽ tự động đẩy đầu vào thứ hai lên trên cùng của ngăn xếp. Ngoài ra, chuỗi hai char có thể được rút ngắn bằng cách sử dụng . Như vậy "oe"là tương đương với . Đối với 13 byte: €ÇbSOÈ„oe²k<^:)
Adnan

05AB1E cũng sử dụng mã hóa CP-1252 , vì vậy mỗi ký tự ở đây là 1 byte :).
Ad Nam

@Ad Nam: Cảm ơn! Đã sử dụng notepad ++ cho bytecount và chỉ cho rằng nó đã đếm các ký tự: P
Emigna

0

Ruby, 57 byte

Nếu 0là falsey trong Ruby, ==có lẽ có thể được chuyển sang chỉ -hoặc có thể có các tối ưu hóa khác, nhưng không phải vậy.

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

0

Võng mạc , 102 byte

Lấy chuỗi trên dòng đầu tiên và chữ cái trên dòng thứ hai. Sử dụng mã hóa ISO 8859-1.

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

Dùng thử trực tuyến

Lớp ký tự trên dòng đầu tiên khớp với bất kỳ ký tự nào có số lượng ký tự lẻ trong biểu diễn nhị phân.

Mô tả cách phát hiện chẵn / lẻ với regex hoạt động ở đây .


0

Octave, 56 byte

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

Các bitunpackchức năng, cho các ký tự ASCII, trả chúng theo thứ tự về cuối nhỏ. Vì vậy, bằng cách đặt cờ chẵn lẻ ở cuối chuỗi của chúng tôi, giải nén toàn bộ và bỏ 5 bit cuối cùng, sau đó chúng tôi có thể tổng hợp toàn bộ điều mod 2 cho câu trả lời cuối cùng của chúng tôi.

Sử dụng:

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

0

 Lisp thường gặp, 87

(lambda(s p)(=(mod(reduce'+(mapcar'logcount(map'list'char-code s)))2)(position p"oe")))
  • Tính tổng số log của mã char của s.
  • Phần còn lại của điều này, khi chia cho 2, được so sánh với vị trí của đối số chẵn lẻ ptrong chuỗi "oe"(0 hoặc 1). Ví dụ: nếu có 4 cái, phần còn lại bằng không. Nếu p là o, thì không cần thêm bit nào và kiểm tra trả về false.

In đẹp

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

0

Java, 91 byte

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

Tôi đã làm tương tự như @ CAT97, nhưng đã loại bỏ một số ký tự bằng cách sử dụng modulo 8 và ghép của @Luis Mendo và sử dụng int thay vì boolean.

Đây là một lambda cho a BiFunction<String, Character, Boolean>.


0

Matlab, 49 byte

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

Ở đâu:

  • x là chuỗi đầu vào;
  • p là 'e' cho chẵn lẻ và 'o' cho số lẻ.

Ví dụ:

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

ans =

     0

0

Công cụ Bash và unix (72 byte)

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

Chấp nhận spđối số thứ nhất và là đối số thứ hai. May mắn thay, 3 bit cuối cùng oecó chẵn lẻ tương ứng.

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

Cung cấp đầu vào thông qua <<<thêm một ký tự nguồn cấp dữ liệu, nhưng tính chẵn lẻ \nlà chẵn, vì vậy nó không phải là vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.