From 097f5605b6efda4944c11bd40babebaa8327d61f Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Mon, 9 Nov 2020 03:14:35 -0700 Subject: initial... --- challenge-086/mark-anderson/raku/ch-1.p6 | 20 +++++++++ challenge-086/mark-anderson/raku/ch-2.p6 | 74 ++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 challenge-086/mark-anderson/raku/ch-1.p6 create mode 100644 challenge-086/mark-anderson/raku/ch-2.p6 diff --git a/challenge-086/mark-anderson/raku/ch-1.p6 b/challenge-086/mark-anderson/raku/ch-1.p6 new file mode 100644 index 0000000000..2102da740a --- /dev/null +++ b/challenge-086/mark-anderson/raku/ch-1.p6 @@ -0,0 +1,20 @@ +multi MAIN ($A where * ~~ Int, *@N where .all ~~ Int) { + say pair-diff($A, @N); +} + +multi MAIN { + use Test; + plan 3; + + ok pair-diff(7, [10, 8, 12, 15, 5]), "example 1"; + ok pair-diff(6, [1, 5, 2, 9, 7]), "example 2"; + nok pair-diff(15, [10, 30, 20, 50, 40]), "example 3"; +} + +sub pair-diff($A, @N) { + @N.sort + .combinations(2) + .first({ $_[1] - $_[0] == $A }) + .Bool + .UInt +} diff --git a/challenge-086/mark-anderson/raku/ch-2.p6 b/challenge-086/mark-anderson/raku/ch-2.p6 new file mode 100644 index 0000000000..c521db8b23 --- /dev/null +++ b/challenge-086/mark-anderson/raku/ch-2.p6 @@ -0,0 +1,74 @@ +my @sudoku := < _ _ _ 2 6 _ 7 _ 1 >, + < 6 8 _ _ 7 _ _ 9 _ >, + < 1 9 _ _ _ 4 5 _ _ >, + < 8 2 _ 1 _ _ _ 4 _ >, + < _ _ 4 6 _ 2 9 _ _ >, + < _ 5 _ _ _ 3 _ 2 8 >, + < _ _ 9 3 _ _ _ 7 4 >, + < _ 4 _ _ 5 _ _ 3 6 >, + < 7 _ 3 _ 1 8 _ _ _ >; + +my @s; +my @nums = @sudoku.map((1..9) (-) (*.comb(/\d/).map(+*))) + .map(*.keys.sort.Array); +my @indices = @sudoku.map(*.grep("_", :k).Array); +my @permutations; + +for ^9 { + @s = @sudoku.map(*.Array); + @permutations[$_] = get-permutations($_); +} + +for [X] @permutations -> @p { + (^9).map: { @s[$_][|@indices[$_]] = @p[$_].Array }; + + if column-check(@s) { + if sub-box-check(0, @s) { + if sub-box-check(3, @s) { + if sub-box-check(6, @s) { + .say for @s; + last; + } + } + } + } +} + +sub get-permutations($i) { + my @a = gather { + for @nums[$i].permutations -> @n { + @s[$i][|@indices[$i]] = @n; + take @n if column-check(@s) and sub-box-check($i, @s); + } + } + + return @a; +} + +sub column-check(@s) { + for ^9 { + if @s.map(*[$_]).join ~~ /(\d) .* $0/ { + return 0; + } + } + + return 1; +} + +sub sub-box-check($i, @s) { + my $r = do given $i { + when 0|1|2 { 0 } + when 3|4|5 { 3 } + when 6|7|8 { 6 } + } + + for ([0..2], [3..5], [6..8]) -> @c { + if (@s[$r ][@c], + @s[$r+1][@c], + @s[$r+2][@c]).flat.join ~~ /(\d) .* $0/ { + return 0; + } + } + + return 1; +} -- cgit From 63d9efac9eba5567e2b814ba849f74e4614b700d Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Mon, 9 Nov 2020 15:10:27 -0700 Subject: ch-1 now with the hash method --- challenge-086/mark-anderson/raku/ch-1.p6 | 30 ++++++++----- challenge-086/mark-anderson/raku/ch-2.p6 | 74 -------------------------------- 2 files changed, 20 insertions(+), 84 deletions(-) delete mode 100644 challenge-086/mark-anderson/raku/ch-2.p6 diff --git a/challenge-086/mark-anderson/raku/ch-1.p6 b/challenge-086/mark-anderson/raku/ch-1.p6 index 2102da740a..b9113eeb69 100644 --- a/challenge-086/mark-anderson/raku/ch-1.p6 +++ b/challenge-086/mark-anderson/raku/ch-1.p6 @@ -1,20 +1,30 @@ -multi MAIN ($A where * ~~ Int, *@N where .all ~~ Int) { - say pair-diff($A, @N); +# +# from a hint at https://www.geeksforgeeks.org/find-a-pair-with-the-given-difference/ +# + +multi MAIN($A where * ~~ Int, *@N where .all ~~ Int) { + say pair-diff(+$A, @N.map(+*)); } multi MAIN { use Test; plan 3; - ok pair-diff(7, [10, 8, 12, 15, 5]), "example 1"; - ok pair-diff(6, [1, 5, 2, 9, 7]), "example 2"; - nok pair-diff(15, [10, 30, 20, 50, 40]), "example 3"; + ok pair-diff(7, [10, 8, 12, 15, 5]), "Example 1"; + ok pair-diff(6, [1, 5, 2, 9, 7]), "Example 2"; + nok pair-diff(15, [10, 30, 20, 50, 40]), "Example 3"; } sub pair-diff($A, @N) { - @N.sort - .combinations(2) - .first({ $_[1] - $_[0] == $A }) - .Bool - .UInt + my $b = bag @N; + + if $A == 0 { + return $b.values.first(* > 1); + } + + for $b.keys -> $k { + return 1 if $b{$A+$k}; + } + + return 0; } diff --git a/challenge-086/mark-anderson/raku/ch-2.p6 b/challenge-086/mark-anderson/raku/ch-2.p6 deleted file mode 100644 index c521db8b23..0000000000 --- a/challenge-086/mark-anderson/raku/ch-2.p6 +++ /dev/null @@ -1,74 +0,0 @@ -my @sudoku := < _ _ _ 2 6 _ 7 _ 1 >, - < 6 8 _ _ 7 _ _ 9 _ >, - < 1 9 _ _ _ 4 5 _ _ >, - < 8 2 _ 1 _ _ _ 4 _ >, - < _ _ 4 6 _ 2 9 _ _ >, - < _ 5 _ _ _ 3 _ 2 8 >, - < _ _ 9 3 _ _ _ 7 4 >, - < _ 4 _ _ 5 _ _ 3 6 >, - < 7 _ 3 _ 1 8 _ _ _ >; - -my @s; -my @nums = @sudoku.map((1..9) (-) (*.comb(/\d/).map(+*))) - .map(*.keys.sort.Array); -my @indices = @sudoku.map(*.grep("_", :k).Array); -my @permutations; - -for ^9 { - @s = @sudoku.map(*.Array); - @permutations[$_] = get-permutations($_); -} - -for [X] @permutations -> @p { - (^9).map: { @s[$_][|@indices[$_]] = @p[$_].Array }; - - if column-check(@s) { - if sub-box-check(0, @s) { - if sub-box-check(3, @s) { - if sub-box-check(6, @s) { - .say for @s; - last; - } - } - } - } -} - -sub get-permutations($i) { - my @a = gather { - for @nums[$i].permutations -> @n { - @s[$i][|@indices[$i]] = @n; - take @n if column-check(@s) and sub-box-check($i, @s); - } - } - - return @a; -} - -sub column-check(@s) { - for ^9 { - if @s.map(*[$_]).join ~~ /(\d) .* $0/ { - return 0; - } - } - - return 1; -} - -sub sub-box-check($i, @s) { - my $r = do given $i { - when 0|1|2 { 0 } - when 3|4|5 { 3 } - when 6|7|8 { 6 } - } - - for ([0..2], [3..5], [6..8]) -> @c { - if (@s[$r ][@c], - @s[$r+1][@c], - @s[$r+2][@c]).flat.join ~~ /(\d) .* $0/ { - return 0; - } - } - - return 1; -} -- cgit From fe62f9a6b99b11660fd2159e96cc4d48ac169af4 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Mon, 9 Nov 2020 15:17:28 -0700 Subject: ch-1 now with the hash method --- challenge-086/mark-anderson/raku/ch-1.p6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/challenge-086/mark-anderson/raku/ch-1.p6 b/challenge-086/mark-anderson/raku/ch-1.p6 index b9113eeb69..a67b3ce555 100644 --- a/challenge-086/mark-anderson/raku/ch-1.p6 +++ b/challenge-086/mark-anderson/raku/ch-1.p6 @@ -19,7 +19,7 @@ sub pair-diff($A, @N) { my $b = bag @N; if $A == 0 { - return $b.values.first(* > 1); + return +$b.values.first(* > 1).so; } for $b.keys -> $k { -- cgit