Solving Perl Weekly Challenge 086

作者:   發佈於:   #raku

Here comes the Perl Weekly Challenge 086.

TASK #1 › Pair Difference

You are given an array of integers @N and an integer $A.

Write a script to find find if there exists a pair of elements in the
array whose difference is $A.

Print 1 if exists otherwise 0.

A naive, brute-force solution is take the pairwise differece of all numbers and check whethery any one of them is equal to $A.

@N.combinations(2).first(-> @combo { $A == abs([-] @combo) });

Which is an algorithm with time complexity of O(n²). If we store the position of each number in a HashMap, we could improve it to be O(n) in both time and space.

my %pos;
@N.kv.map(-> $k, $v { %pos{$v}.push($k) });
@N.first(
    -> $n {
        %pos{$n + $A}:exists or %pos{$n - $A}:exists
    });

The adverb syntax of :exists in Raku looks special to me. It makes sense though, if we design it to be %H{$x}.exists() or exists(%H{$x}), then it would look as if we are asking if the value of %H{$x} exists, rather than asking the container %H.

TASK #2 › Sudoku Puzzle

I just happened to have a spare sudoku solver in my 'bin/' directory: sudoku-solutions.raku.


本文為《解 Perl Weekly Challenge 086》之英文版。