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.
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
暂无评论内容