diff options
| author | 冯昶 <fengchang@novel-supertv.com> | 2023-04-24 16:37:56 +0800 |
|---|---|---|
| committer | 冯昶 <fengchang@novel-supertv.com> | 2023-04-24 16:37:56 +0800 |
| commit | bc376918f35a5deb0ce03ca939a4ed88beea399c (patch) | |
| tree | f63ae9e546b612dfd3e375d662f5d90ff8eeab9a | |
| parent | 41d1e582715466e4aa27fbb99e1591afa707fa78 (diff) | |
| download | perlweeklychallenge-club-bc376918f35a5deb0ce03ca939a4ed88beea399c.tar.gz perlweeklychallenge-club-bc376918f35a5deb0ce03ca939a4ed88beea399c.tar.bz2 perlweeklychallenge-club-bc376918f35a5deb0ce03ca939a4ed88beea399c.zip | |
challenge 213, raku solutions
| -rwxr-xr-x | challenge-213/feng-chang/raku/ch-1.raku | 5 | ||||
| -rwxr-xr-x | challenge-213/feng-chang/raku/ch-2.raku | 56 | ||||
| -rw-r--r-- | challenge-213/feng-chang/raku/in01.txt | 3 | ||||
| -rw-r--r-- | challenge-213/feng-chang/raku/in02.txt | 3 | ||||
| -rw-r--r-- | challenge-213/feng-chang/raku/in03.txt | 3 |
5 files changed, 70 insertions, 0 deletions
diff --git a/challenge-213/feng-chang/raku/ch-1.raku b/challenge-213/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..01f4ef2f5c --- /dev/null +++ b/challenge-213/feng-chang/raku/ch-1.raku @@ -0,0 +1,5 @@ +#!/bin/env raku + +unit sub MAIN(*@N); + +put (|@N.grep(* %% 2).sort, |@N.grep(* !%% 2).sort).join(', '); diff --git a/challenge-213/feng-chang/raku/ch-2.raku b/challenge-213/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..23d45b6943 --- /dev/null +++ b/challenge-213/feng-chang/raku/ch-2.raku @@ -0,0 +1,56 @@ +#!/bin/env raku + +unit sub MAIN(Str:D $f where *.IO.f = 'in01.txt'); + +use MONKEY-SEE-NO-EVAL; + +my ($source, $destination); +my @routes; +EVAL $f.IO.slurp; + +my @vertexes = @routes[*;*].unique; +my %edges; + +for @routes -> @route { + for @route.rotor(2 => -1) -> ($v1, $v2) { + %edges{$v1}.push($v2); + %edges{$v2}.push($v1); + } +} + +my %dist = $source => 0; +my %Q is SetHash = @vertexes; +my %prev; +my $found = False; + +# dijkstra +Outer: +while +%Q { + my $min-dist = %Q.keys.map(-> $k { %dist{$k} with %dist{$k} }).min; + last if $min-dist ~~ Inf; + + my $u = %dist.keys.grep(-> $k { %Q{$k}.defined and %dist{$k} == $min-dist }).first.Int; + last unless %edges{$u} (&) %Q; + + %Q.unset($u); + + for %edges{$u}.Array -> $v { + next unless %Q{$v}; + %prev{$v} = $u; + %dist{$v} = %dist{$u} + 1; + { $found = True; last Outer } if $v == $destination; + } +} + +if $found { + my $v = $destination; + my @path = $v; + while $v != $source { + $v = %prev{$v}; + @path.unshift($v); + } + + put @path.join(', '); +} else { + put -1; +} diff --git a/challenge-213/feng-chang/raku/in01.txt b/challenge-213/feng-chang/raku/in01.txt new file mode 100644 index 0000000000..830fa61105 --- /dev/null +++ b/challenge-213/feng-chang/raku/in01.txt @@ -0,0 +1,3 @@ +@routes = [1,2,6], [5,6,7]; +$source = 1; +$destination = 7; diff --git a/challenge-213/feng-chang/raku/in02.txt b/challenge-213/feng-chang/raku/in02.txt new file mode 100644 index 0000000000..7d775c4d08 --- /dev/null +++ b/challenge-213/feng-chang/raku/in02.txt @@ -0,0 +1,3 @@ +@routes = [1,2,3], [4,5,6]; +$source = 2; +$destination = 5; diff --git a/challenge-213/feng-chang/raku/in03.txt b/challenge-213/feng-chang/raku/in03.txt new file mode 100644 index 0000000000..89fa18d76c --- /dev/null +++ b/challenge-213/feng-chang/raku/in03.txt @@ -0,0 +1,3 @@ +@routes = [1,2,3], [4,5,6], [3,8,9], [7,8]; +$source = 1; +$destination = 7; |
