aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author冯昶 <fengchang@novel-supertv.com>2023-04-24 16:37:56 +0800
committer冯昶 <fengchang@novel-supertv.com>2023-04-24 16:37:56 +0800
commitbc376918f35a5deb0ce03ca939a4ed88beea399c (patch)
treef63ae9e546b612dfd3e375d662f5d90ff8eeab9a
parent41d1e582715466e4aa27fbb99e1591afa707fa78 (diff)
downloadperlweeklychallenge-club-bc376918f35a5deb0ce03ca939a4ed88beea399c.tar.gz
perlweeklychallenge-club-bc376918f35a5deb0ce03ca939a4ed88beea399c.tar.bz2
perlweeklychallenge-club-bc376918f35a5deb0ce03ca939a4ed88beea399c.zip
challenge 213, raku solutions
-rwxr-xr-xchallenge-213/feng-chang/raku/ch-1.raku5
-rwxr-xr-xchallenge-213/feng-chang/raku/ch-2.raku56
-rw-r--r--challenge-213/feng-chang/raku/in01.txt3
-rw-r--r--challenge-213/feng-chang/raku/in02.txt3
-rw-r--r--challenge-213/feng-chang/raku/in03.txt3
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;