Weekly Challenge: Counting the XOR

Weekly Challenge 308

Each week Mohammad S. Anwar sends out The Weekly Challenge, a chance for all of us to come up with solutions to two weekly tasks. My solutions are written in Python first, and then converted to Perl. It’s a great way for us all to practice some coding.

Challenge, My solutions

Task 1: Count Common

Task

You are given two array of strings, @str1 and @str2.

Write a script to return the count of common strings in both arrays.

My solution

The tasks and examples don’t mention what to do if a string appears more than once in both arrays. I’ve made the assumption that we only need to return it once.

For the command line input, I take two strings that are space separated as shown in the example.

In Python this is a one liner. I turn the lists into sets (which only has unique values) and take the length of the intersection of these two sets.

<span>def</span> <span>count_common</span><span>(</span><span>str1</span><span>:</span> <span>list</span><span>,</span> <span>str2</span><span>:</span> <span>list</span><span>)</span> <span>-></span> <span>int</span><span>:</span>
<span>return</span> <span>len</span><span>(</span><span>set</span><span>(</span><span>str1</span><span>)</span> <span>&</span> <span>set</span><span>(</span><span>str2</span><span>))</span>
<span>def</span> <span>count_common</span><span>(</span><span>str1</span><span>:</span> <span>list</span><span>,</span> <span>str2</span><span>:</span> <span>list</span><span>)</span> <span>-></span> <span>int</span><span>:</span>
    <span>return</span> <span>len</span><span>(</span><span>set</span><span>(</span><span>str1</span><span>)</span> <span>&</span> <span>set</span><span>(</span><span>str2</span><span>))</span>
def count_common(str1: list, str2: list) -> int: return len(set(str1) & set(str2))

Enter fullscreen mode Exit fullscreen mode

Perl does not have sets or intersections built in. For the Perl solution, I turn both strings into a hash with the key being the strings. I then iterate through the keys of the first hash to see if they appear in the second hash. If they do, I increment the count variable.

<span>sub </span><span>main</span> <span>(@inputs) {</span>
<span>my</span> <span>%str1</span> <span>=</span> <span>map</span> <span>{</span> <span>$_</span><span>,</span> <span>1</span> <span>}</span> <span>split</span><span>(</span> <span>/\s+/</span><span>,</span> <span>$inputs</span><span>[</span><span>0</span><span>]</span> <span>);</span>
<span>my</span> <span>%str2</span> <span>=</span> <span>map</span> <span>{</span> <span>$_</span><span>,</span> <span>1</span> <span>}</span> <span>split</span><span>(</span> <span>/\s+/</span><span>,</span> <span>$inputs</span><span>[</span><span>1</span><span>]</span> <span>);</span>
<span>my</span> <span>$count</span> <span>=</span> <span>0</span><span>;</span>
<span>foreach</span> <span>my</span> <span>$str</span> <span>(</span> <span>keys</span> <span>%str1</span> <span>)</span> <span>{</span>
<span>$count</span><span>++</span> <span>if</span> <span>exists</span> <span>$str2</span><span>{</span><span>$str</span><span>};</span>
<span>}</span>
<span>say</span> <span>$count</span><span>;</span>
<span>}</span>
<span>sub </span><span>main</span> <span>(@inputs) {</span>
    <span>my</span> <span>%str1</span> <span>=</span> <span>map</span> <span>{</span> <span>$_</span><span>,</span> <span>1</span> <span>}</span> <span>split</span><span>(</span> <span>/\s+/</span><span>,</span> <span>$inputs</span><span>[</span><span>0</span><span>]</span> <span>);</span>
    <span>my</span> <span>%str2</span> <span>=</span> <span>map</span> <span>{</span> <span>$_</span><span>,</span> <span>1</span> <span>}</span> <span>split</span><span>(</span> <span>/\s+/</span><span>,</span> <span>$inputs</span><span>[</span><span>1</span><span>]</span> <span>);</span>

    <span>my</span> <span>$count</span> <span>=</span> <span>0</span><span>;</span>
    <span>foreach</span> <span>my</span> <span>$str</span> <span>(</span> <span>keys</span> <span>%str1</span> <span>)</span> <span>{</span>
        <span>$count</span><span>++</span> <span>if</span> <span>exists</span> <span>$str2</span><span>{</span><span>$str</span><span>};</span>
    <span>}</span>

    <span>say</span> <span>$count</span><span>;</span>
<span>}</span>
sub main (@inputs) { my %str1 = map { $_, 1 } split( /\s+/, $inputs[0] ); my %str2 = map { $_, 1 } split( /\s+/, $inputs[1] ); my $count = 0; foreach my $str ( keys %str1 ) { $count++ if exists $str2{$str}; } say $count; }

Enter fullscreen mode Exit fullscreen mode

Examples

<span>$ </span>./ch-1.py <span>"perl weekly challenge"</span> <span>"raku weekly challenge"</span>
2
<span>$ </span>./ch-1.py <span>"perl raku java"</span> <span>"python java"</span>
1
<span>$ </span>./ch-1.py <span>"guest contribution"</span> <span>"fun weekly challenge"</span>
0
<span>$ </span>./ch-1.py <span>"perl weekly challenge"</span> <span>"raku weekly challenge"</span>
2

<span>$ </span>./ch-1.py <span>"perl raku java"</span> <span>"python java"</span>
1

<span>$ </span>./ch-1.py <span>"guest contribution"</span> <span>"fun weekly challenge"</span>
0
$ ./ch-1.py "perl weekly challenge" "raku weekly challenge" 2 $ ./ch-1.py "perl raku java" "python java" 1 $ ./ch-1.py "guest contribution" "fun weekly challenge" 0

Enter fullscreen mode Exit fullscreen mode

Task 2: Decode XOR

Task

You are given an encoded array and an initial integer.

Write a script to find the original array that produced the given encoded array. It was encoded such that encoded[i] = orig[i] XOR orig[i + 1].

My solution

This is relatively straight forward. For the command line input, I take the last value as the initial integer, and the rest as the encoded integers.

For this task, I create the orig list (array in Perl) with the initial value. I then iterate over each item in the encoded list and takes the exclusive-or of it and the last value in the orig list.

<span>def</span> <span>decode_xor</span><span>(</span><span>encoded</span><span>:</span> <span>list</span><span>,</span> <span>initial</span><span>:</span> <span>int</span><span>)</span> <span>-></span> <span>list</span><span>:</span>
<span>orig</span> <span>=</span> <span>[</span><span>initial</span><span>]</span>
<span>for</span> <span>i</span> <span>in</span> <span>encoded</span><span>:</span>
<span>orig</span><span>.</span><span>append</span><span>(</span><span>i</span> <span>^</span> <span>orig</span><span>[</span><span>-</span><span>1</span><span>])</span>
<span>return</span> <span>orig</span>
<span>def</span> <span>decode_xor</span><span>(</span><span>encoded</span><span>:</span> <span>list</span><span>,</span> <span>initial</span><span>:</span> <span>int</span><span>)</span> <span>-></span> <span>list</span><span>:</span>
    <span>orig</span> <span>=</span> <span>[</span><span>initial</span><span>]</span>

    <span>for</span> <span>i</span> <span>in</span> <span>encoded</span><span>:</span>
        <span>orig</span><span>.</span><span>append</span><span>(</span><span>i</span> <span>^</span> <span>orig</span><span>[</span><span>-</span><span>1</span><span>])</span>

    <span>return</span> <span>orig</span>
def decode_xor(encoded: list, initial: int) -> list: orig = [initial] for i in encoded: orig.append(i ^ orig[-1]) return orig

Enter fullscreen mode Exit fullscreen mode

Examples

<span>$ </span>./ch-2.py 1 2 3 1
<span>[</span>1, 0, 2, 1]
<span>$ </span>./ch-2.py 6 2 7 3 4
<span>[</span>4, 2, 0, 7, 4]
<span>$ </span>./ch-2.py 1 2 3 1
<span>[</span>1, 0, 2, 1]

<span>$ </span>./ch-2.py 6 2 7 3 4
<span>[</span>4, 2, 0, 7, 4]
$ ./ch-2.py 1 2 3 1 [1, 0, 2, 1] $ ./ch-2.py 6 2 7 3 4 [4, 2, 0, 7, 4]

Enter fullscreen mode Exit fullscreen mode

原文链接:Weekly Challenge: Counting the XOR

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
It is during our darkest moments that we must focus to see the light.
越是在艰难困苦的时候,我们越是要看到希望
评论 抢沙发

请登录后发表评论

    暂无评论内容