প্যারিটি বিট তৈরি করুন


18

একটি প্যারিটি বিট , একটি চেকসাম সহজ ফর্ম মধ্যে অন্যতম। প্রথমত, আপনাকে সমতা বা বিজোড় বাছাই করতে হবে। ধরা যাক আমরা এমনকি বাছাই। এখন, আমাদের প্রেরণের জন্য একটি বার্তা প্রয়োজন need ধরা যাক আমাদের বার্তাটি "ফু"। এটি বাইনারি হিসাবে লিখিত হয়:

01000110 01101111 01101111

এখন, আমরা সেখানে মোট সংখ্যা গণনা 1করি, যা 15 হয় Since যেহেতু 15 একটি বিজোড় সংখ্যা, তাই আমাদের বার্তার শেষে আমাদের আরও একটি বিট যোগ করতে হবে, এবং এখন আমাদের 'অন' বিটগুলির একটি আরও সংখ্যা থাকবে । এই শেষ যুক্ত বিট "প্যারিটি বিট" হিসাবে পরিচিত। আমরা যদি আমাদের চেকসামের জন্য একটি বিজোড় সামঞ্জস্য বাছাই করে থাকি তবে আমাদের একটি অতিরিক্ত '0' যুক্ত করতে হবে যাতে বিটের সংখ্যাটি বিজোড় থেকে যায়।

চ্যালেঞ্জ:

আপনার অবশ্যই একটি প্রোগ্রাম বা ফাংশন লিখতে হবে যা একটি স্ট্রিংয়ের জন্য সঠিক প্যারিটি বিট কী তা নির্ধারণ করে। আপনার প্রোগ্রামটি অবশ্যই দুটি ইনপুট গ্রহণ করবে:

  • একটি স্ট্রিং s,। এটি সেই বার্তা যা চেকসামটি গণনা করা হবে। এটি 95 মুদ্রণযোগ্য এএসসিআইআই অক্ষরগুলিতে সীমাবদ্ধ থাকবে।

  • একটি চরিত্র বা একক চরিত্রের স্ট্রিং p, তা হয় eসমতুল্যতার oজন্য বা বিজোড় সমতা জন্য।

এবং সঠিক প্যারিটি বিটের প্রতিনিধিত্ব করে একটি সত্যবাদী-মিথ্যা মান উত্পন্ন করে । সত্য যদি এটি হয় তবে 1, এবং মিথ্যা যদি এটি হয় 0

স্ট্রিং বা চরিত্রের "অন" বিটের সংখ্যা গণনা করে এমন বিল্টিনগুলি অনুমোদিত নয়। উদাহরণস্বরূপ, এমন একটি ফাংশন fযা এটি করে: f('a') == 3বা f('foo') == 16নিষিদ্ধ। বেস রূপান্তর হিসাবে অন্য যে কোনও কিছু হল ন্যায্য খেলা।

পরীক্ষার আইও:

(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

এটি কোডগল্ফ, সুতরাং স্ট্যান্ডার্ড লুফোলগুলি প্রয়োগ হয় এবং বাইটের মধ্যে সংক্ষিপ্ত উত্তর।

লিডারবোর্ড


10
বরং বিরক্তিকর, oএমনকি সমতা আছে।
নীল

আপনি কি "বিল্টিনগুলি পরিষ্কার করতে পারেন যা স্ট্রিং বা চরিত্রের বিট বিটগুলিতে" অন "সংখ্যা গণনা করে তা অনুমোদিত নয়।" একটু ভাল? অন্তর্নির্মিত বেস রূপান্তর সম্পর্কে কি? ইত্যাদি ..
orlp

@ ডিগ্রিগ্রিনইগস্যান্ডহ্যামডিজে স্ট্যাক সাইটগুলি সম্পর্কে মন্তব্যগুলি কোনও সক্ষম ব্যবহারকারীর কথায় বিনা কারণে সতর্কতা ছাড়াই অদৃশ্য এবং অদৃশ্য হয়ে যায়। ফলস্বরূপ, এটি চূড়ান্তভাবে চ্যালেঞ্জের অবিচ্ছেদ্য চশমাটি পোস্টের মধ্যেই নয় , মন্তব্য বিভাগে অত্যন্ত উত্সাহিত হয়েছে ।
বিড়াল

1
উদাহরণস্বরূপ @cat, পাইথন মধ্যে: str(int(s, 2)).count('1')? না, আমি এটিকে কোনও একক অন্তর্নির্মিত ফাংশন হিসাবে বিবেচনা করব না যা এই নিয়ম লঙ্ঘন করে। আমার সম্পাদনা কি এটিকে আরও স্পষ্ট করে তোলে?
ডিজেএমসিএমহেম

1
@ ক্যাট যতদূর আমি উদ্বিগ্ন char == single_char_string। আমি পোস্টে এটি সম্পাদনা করেছি।
DJMcMayhem

উত্তর:


9

এমএটিএল , 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;}

এটি a এর জন্য ল্যাম্বদা BiFunction<String, Character, Boolean>

eএবং oপ্রত্যাবর্তনের বিবৃতিতে বিপরীত বলে মনে হচ্ছে কারণ স্পষ্টতই আমার যুক্তি পিছনের দিকে ছিল।


5

পাইথন 2, 51 বাইট

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

এটি প্রতিটি চরিত্রের জন্য সারসংক্ষেপের চেয়ে বাইনারি বর্ণের কোডগুলির তালিকার স্ট্রিং উপস্থাপনায় স্ট্রিং প্রতিনিধিত্ব করে Sp3000 এর ধারণার ভিত্তিতে তৈরি ।

নতুন কৌশলটি হ্যান্ডেল করা eএবং এটির oমধ্যেও। যদি eবিজোড় এবং oএমনকি ছিল, আমরা গণনা করার আগে স্ট্রিংটিতে প্যারিটি বিটটি কেবল প্রেন্ডিং করতে পারতাম (তাদের উল্টাতে কারণ '1' সত্যবাদী) is দুর্ভাগ্যক্রমে, তারা না। তবে, আমরা যদি তাদের শেষ দুটি বিট ব্যতীত অন্য সবগুলি সরিয়ে ফেলি তবে এটি এখন সত্য।

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

একটি বাইট জন্য ডেনিস ধন্যবাদ!


1
আমি নিজে একটি জেলি উত্তর নিয়ে আসার চেষ্টা করছিলাম, তবে এই শৃঙ্খলাবদ্ধ নিয়মগুলি আমাকে বদনাম করে :-)
লুইস মেন্ডো

2
@ লুইস মেন্ডো আমি একই নৌকায় আছি; খুব দীর্ঘ পথ ধরে এটি শেখার চেষ্টা করার পরে এটি আমার প্রথম জেলি উত্তর: পি
ডোরকনব

যে V}... যে সত্যিই দুর্দান্ত ছিল !!! (ডেনিস একজন বাস্তব গল্ফার) +1 এটি আমার প্রতিটি চেষ্টাকে পরাজিত করে।
এরিক দ্য আউটগল্ফার

4

সি, 62 বাইট

  • 12 লিটস সংরক্ষিত @ লেভেলভিভারস্টেস্ট এবং @ টনহোপসেলকে ধন্যবাদ।

এক্সওআর এর দুর্দান্ত সম্পত্তি রয়েছে যা প্যারিয়িটি সংরক্ষণের সময় স্ট্রিংগুলি একটি চরে কমাতে ব্যবহার করা যেতে পারে।

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 পি এর সমতা গণনা করা উচিত এবং এটি 1 বাইট আরও সংক্ষিপ্ত
টন হসপেল

1
এর স্থানটি char *sশূন্যস্থানযুক্ত
টন হসপেল

2
62 বাইট: সবসময় একটি 0 জন্য 0 ফিরে আসবে, কিন্তু একটি 1. জন্য 1 বা 2 ফেরত দিতে পারেন এই বিধির অধীন গ্রহণযোগ্য:f(s,p)char*s;{for(p/=8;*s;)p^=*s>>4^*s++;p^=p/4;return p%4%3;}%3truthy if it's a 1
শ্রেনী নদী সেন্ট

1
27030>>((p^p>>4)&15)&1। ঠিক আছে, ভুল হয়েছে। ;-)
ডিজিটাল ট্রমা

টুইটারে ধন্যবাদ!
ডিজিটাল ট্রমা

4

পাইথন, 58 57 বাইট

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

1
53 (পাইথন কেবলমাত্র 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

জাভাস্ক্রিপ্ট (ES6), 84 72 বাইট

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

বিট টুইডলিং বেস 2 এবং কাউন্টিং সংখ্যায় রূপান্তর চেয়ে সংক্ষিপ্ত আকারে পরিণত হয়েছিল 1


2

পার্ল, 29 বাইট

জন্য +2 অন্তর্ভুক্ত -p

প্যারিটি অক্ষর স্পেস স্ট্রিং হিসাবে STDIN এ ইনপুট দিয়ে চালান Run

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

parity.pl

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

2

জে, 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

পাওয়ারশেল ভি 2+, 91 বাইট

/ আমি একটি কোণায় কাঁদে

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

হ্যাঁ ... সুতরাং, বেস রূপান্তর পাওয়ারশেলের পক্ষে শক্তিশালী মামলা নয়। ইনপুট স্ট্রিং থেকে বাইনারি উপস্থাপনায় রূপান্তর$a|%{[convert]::toString(+$_,2)} 32 বাইট এবং নিজেই ...

ইনপুট নেয় $aএবং $b, প্রক্রিয়াটিতে সুস্পষ্টভাবে $aচর-অ্যারে হিসাবে কাস্টিং । তারপরে আমরা পরীক্ষা করে $bদেখি যে এটি -eqইউয়াল o, এবং -xorএটি প্রোগ্রামের অন্যান্য অর্ধেকের সাথে রয়েছে। এই অংশের জন্য, আমরা ইনপুট স্ট্রিংটি নিয়ে থাকি $a, প্রতিটি অক্ষরকে বাইনারি রূপান্তর করতে একটি লুপের মাধ্যমে পাইপ করি, -joinসেগুলি একসাথে একটি শক্ত স্ট্রিং গঠন করে এবং -replaceসমস্ত0 কিছুই কিছুই না দিয়ে। তারপরে আমরা .lengthসেই স্ট্রিংটির গণনা করি এবং এটি সমান বা বিজোড়, যা সুবিধাজনকভাবে হয় 0বা 1, এর জন্য নিখুঁত হবে তা নির্ধারণ করার জন্য এটি Mod-2 নেব-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

এটি মোটামুটি নীচের সি-এর মতো পিসডুওকোডের সমান:

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

আইএ -32 মেশিন কোড, 15 বাইট

Hexdump:

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এবং দ্বিতীয় আর্গুমেন্ট (চর) প্রাপ্ত করে dl। এটি ফলাফলটি ফেরত দেয় eax, তাই এটি এর সাথে সামঞ্জস্যপূর্ণfastcall কলিং কনভেনশনটির ।

এই কোডটি যখন setpoনির্দেশ ব্যবহার করে তখন নিয়মগুলি বাঁকুন :

স্ট্রিং বা চরিত্রের "অন" বিটের সংখ্যা গণনা করে এমন বিল্টিনগুলি অনুমোদিত নয়

alপূর্ববর্তী নির্দেশনা অনুসারে এই নির্দেশটি সমতা বিটকে সেট করে - সুতরাং আমার এই দুটি নীটপিকস বিধিগুলিতে রয়েছে:

  • এটি "অন" বিটের সংখ্যা গণনা করে না - এটি সরাসরি সমতা বিট গণনা করে!
  • প্রযুক্তিগতভাবে, এটি পূর্ববর্তী নির্দেশ ( 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, [ecx]বরং এটির চেয়ে [ecx], 0) তুলনা করতে সক্ষম হতে একটি রেজিস্টারে ( এই ক্ষেত্রে) ০ নম্বর পেতে চাই ।


1

জুলিয়া, 58 47 45 40 বাইট

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

এটি এমন একটি ফাংশন যা একটি স্ট্রিং এবং একটি অক্ষর গ্রহণ করে এবং পূর্ণসংখ্যা ফেরত দেয়।

বাইনারি উপস্থাপনায় সংখ্যাটির জন্য, আমরা প্রথমে binস্ট্রিংয়ের প্রতিটি অক্ষরের সাথে ফাংশনটি প্রয়োগ করি যা আমাদের বাইনারি স্ট্রিংগুলির একটি অ্যারে দেয়। তারপরে এগুলিকে ব্যবহার করে একটিতে হ্রাস করুন prod(যেহেতু *জুলিয়ায় স্ট্রিং কনটেনটেশন) এবং সেই স্ট্রিংয়ের সেট ছেদটি এবং অক্ষর কোডটি নিন 1যা আমাদের স্ট্রিং দেয়। সেই স্ট্রিংয়ের সর্বশেষ সূচকটি হ'ল সংখ্যা। আমরা প্রদত্ত অক্ষরটি o এবং 0 অন্যথায় 0 এর সাথে 1 এর সাথে এক্সওআর করি , তারপরে বিটওয়াইড এবং 1 ব্যবহার করে সমতা পান।

এটি অনলাইন চেষ্টা করুন! (সমস্ত পরীক্ষার কেস অন্তর্ভুক্ত)

ডেনিসকে 18 বাইট সংরক্ষণ করে!


1

05 এ বি 1 ই , 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 বাইট সংরক্ষণের জন্য ধন্যবাদ


বাহ, খুব সুন্দর! ²কমান্ডটি ব্যবহার করে আপনি দুটি বাইট বন্ধ করতে পারেন । এটি স্বয়ংক্রিয়ভাবে স্ট্যাকের উপরে দ্বিতীয় ইনপুটটি ঠেলে দেয়। এছাড়াও, দ্বি-চর স্ট্রিংগুলি ব্যবহার করে সংক্ষিপ্ত করা যেতে পারে । সুতরাং "oe"সমতূল্য । 13 বাইটের জন্য: €ÇbSOÈ„oe²k<^:)
আদনান

05 এ বি 1 ই সিপি -1222 এনকোডিংও ব্যবহার করে, তাই এখানে প্রতিটি অক্ষর 1 বাইট :)।
আদনান

@ আদনান: ধন্যবাদ! বাইটকাউন্টের জন্য নোটপ্যাড ++ ব্যবহার করা হয়েছে এবং কেবল ধরে নেওয়া হয়েছে যে এটি অক্ষর গণনা করেছে: পি
এমিগানা

0

রুবি, 57 বাইট

যদি 0রুবির মধ্যে মিথ্যা ছিল, ==সম্ভবত ন্যায়বিচারে স্যুইচ করা -যেতে পারে, বা অন্যান্য অপ্টিমাইজেশান হতে পারে, তবে তা হয় না।

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

0

রেটিনা , ১০২ বাইট

প্রথম লাইনে স্ট্রিং এবং দ্বিতীয় লাইনে বর্ণটি নেয়। আইএসও 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)

The bitunpack function, for ASCII characters, returns them in little-endian order. So by putting the parity flag at the end of our string, unpacking the whole thing, and dropping the last 5 bits, we can then sum up the whole thing mod 2 for our ultimate answer.

Usage:

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

0

 Common Lisp, 87

(lambda(s p)(=(mod(reduce'+(mapcar'logcount(map'list'char-code s)))2)(position p"oe")))
  • Sum the logcount of char-codes of s.
  • The remainder of this, when divided by 2, is compared to the position of the parity argument p in the string "oe" (either 0 or 1). For example, if there are 4 ones, the remainder is zero. If p is o, then no additional bit should be added, and the test return false.

Pretty-printed

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

0

Java, 91 bytes

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

I did the same as @CAT97, but stripped some characters by using the modulo 8 and concatenate of @Luis Mendo and the use of int instead of boolean.

This is a lambda for a BiFunction<String, Character, Boolean>.


0

Matlab, 49 bytes

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

where:

  • x is the input string;
  • p is 'e' for even parity and 'o' for the odd one.

For example:

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

ans =

     0

0

Bash and unix tools (72 bytes)

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

Excepts s as the first and p as the second argument. Fortunately the last 3 bits of o and e has odd and even parity respectively.

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

Supplying the input via <<< adds a line feed character, but the parity of \n is even, so it is not a problem.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.