Bir eşlik biti , bir sağlama toplamı en basit biçimlerinden biridir. Öncelikle, eşit veya tek olan paritesi seçmelisiniz. Diyelim ki eşit seçtik. Şimdi iletmek için bir mesaja ihtiyacımız var. Diyelim ki mesajımız "Foo". Bu ikili olarak şu şekilde yazılır:
01000110 01101111 01101111
Şimdi, 1
oradaki toplam ' sayısı 15'i sayıyoruz. 15 tek bir sayı olduğu için mesajımızın sonuna bir bit daha eklemeliyiz ve şimdi çift sayıda' on 'bitimiz olacak . Bu son eklenen bit, "eşlik biti" olarak bilinir. Kontrol toplamımız için garip bir parite seçmiş olsaydık, fazladan bir '0' eklememiz gerekirdi, böylece bitlerin sayısı tuhaf kalır.
Meydan okuma:
Bir dize için doğru eşlik bitinin ne olduğunu belirleyen bir program veya işlev yazmalısınız. Programınız iki giriş almalıdır:
Bir dize
s
,. Bu, sağlama toplamının hesaplanacağı mesajdır. Bu, yazdırılabilir 95 ASCII karakteriyle sınırlandırılacaktır.Eşit parite veya tek parite için
p
olacak bir karakter veya tek karakter dizesi .e
o
ve doğru eşlik bitini temsil eden gerçek-falsey bir değer üretirler . Doğruysa a 1
, eğer falsey ise 0
.
Bir dize veya karakterdeki "on" bit sayısını sayan yapılara izin verilmez. Örneğin, bunu yapan bir işlev f
: f('a') == 3
veya f('foo') == 16
yasaklandı. Temel dönüşüm gibi her şey adil bir oyundur.
Test G / Ç:
(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
Bu kodgolf, bu yüzden standart boşluklar geçerlidir ve bayttaki en kısa cevap kazanır.
Liderler Sıralaması
str(int(s, 2)).count('1')
? Hayır, bu kuralı ihlal eden tek bir yerleşik işlev olduğunu düşünmem . Düzenlemem daha açık hale getiriyor mu?
char == single_char_string
. Bunu yazıya da düzenledim.
o
parite bile var.