From 0e9ec6594abf6126cadf60ce058dae38cd1e00a7 Mon Sep 17 00:00:00 2001 From: arnesom Date: Sat, 29 Apr 2023 21:44:17 +0200 Subject: Arne Sommer --- challenge-214/arne-sommer/blog.txt | 1 + challenge-214/arne-sommer/raku/ch-1.raku | 23 ++++++++++++ challenge-214/arne-sommer/raku/ch-2.raku | 41 ++++++++++++++++++++++ challenge-214/arne-sommer/raku/collect-points | 25 +++++++++++++ .../arne-sommer/raku/collect-points-cheat | 41 ++++++++++++++++++++++ challenge-214/arne-sommer/raku/collect-points-last | 30 ++++++++++++++++ challenge-214/arne-sommer/raku/rank-scores | 23 ++++++++++++ 7 files changed, 184 insertions(+) create mode 100644 challenge-214/arne-sommer/blog.txt create mode 100755 challenge-214/arne-sommer/raku/ch-1.raku create mode 100755 challenge-214/arne-sommer/raku/ch-2.raku create mode 100755 challenge-214/arne-sommer/raku/collect-points create mode 100755 challenge-214/arne-sommer/raku/collect-points-cheat create mode 100755 challenge-214/arne-sommer/raku/collect-points-last create mode 100755 challenge-214/arne-sommer/raku/rank-scores diff --git a/challenge-214/arne-sommer/blog.txt b/challenge-214/arne-sommer/blog.txt new file mode 100644 index 0000000000..cdf6b72676 --- /dev/null +++ b/challenge-214/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/bagging-scorepoints.html diff --git a/challenge-214/arne-sommer/raku/ch-1.raku b/challenge-214/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..13dd968aad --- /dev/null +++ b/challenge-214/arne-sommer/raku/ch-1.raku @@ -0,0 +1,23 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@scores where @scores.elems > 0 && all(@scores) ~~ UInt, :v(:$verbose)); + +my %freq = @scores>>.Int.Bag; +my @sort = @scores.sort.squish.reverse; + +say ": Frequency: { %freq.raku }" if $verbose; + +my %gold = (1 => 'G', 2 => 'S', 3 => 'B'); +my %rank; + +for @sort -> $score +{ + state $rank = 1; + %rank{$score} = %gold{$rank} // $rank; + say ": Score $score with rank: %rank{$score} and frequency: %freq{$score}" if $verbose; + $rank += %freq{$score}; +} + +say "(" ~ @scores.map({ %rank{$_} }).join(",") ~ ")"; + + diff --git a/challenge-214/arne-sommer/raku/ch-2.raku b/challenge-214/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..5479fa301e --- /dev/null +++ b/challenge-214/arne-sommer/raku/ch-2.raku @@ -0,0 +1,41 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@numbers where @numbers.elems > 0 && all(@numbers) ~~ Numeric, :v(:$verbose)); + +my $score = 0; +my %freq; +my $cheat = False; + +while (@numbers.elems) +{ + $cheat + ?? ( $cheat = False ) + !! ( %freq = @numbers.Bag ); + + my $size = @numbers.elems; + + for %freq.keys.sort -> $value + { + my $freq = %freq{$value}; + my $index = @numbers.first($value, :k); + + if all(@numbers[$index .. $index + $freq -1]) eq $value + { + sink @numbers.splice($index, $freq); + $score += $freq * $freq; + say ": Removed the value $value ($freq items, at index: $index .. { $index + $freq -1}). New score: $score" if $verbose; + } + } + + if @numbers.elems == $size + { + my $val = %freq.keys.sort({ %freq{$_} }).first; + %freq{$val}--; + $cheat = True; + say ": Enable cheat mode on value $val" if $verbose; + } +} + +say "ERROR: Unable to reduce @numbers[]" if @numbers.elems; + +say $score; diff --git a/challenge-214/arne-sommer/raku/collect-points b/challenge-214/arne-sommer/raku/collect-points new file mode 100755 index 0000000000..219cc9421f --- /dev/null +++ b/challenge-214/arne-sommer/raku/collect-points @@ -0,0 +1,25 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@numbers where @numbers.elems > 0 && all(@numbers) ~~ Numeric, :v(:$verbose)); + +my $score = 0; + +while (@numbers.elems) +{ + my %freq = @numbers.Bag; + + for %freq.keys.sort -> $value + { + my $freq = %freq{$value}; + my $index = @numbers.first($value, :k); + + if all(@numbers[$index .. $index + $freq -1]) eq $value + { + sink @numbers.splice($index, $freq); + $score += $freq * $freq; + say ": Removed the value $value ($freq items, at index: $index .. { $index + $freq -1}). New score: $score" if $verbose; + } + } +} + +say $score; diff --git a/challenge-214/arne-sommer/raku/collect-points-cheat b/challenge-214/arne-sommer/raku/collect-points-cheat new file mode 100755 index 0000000000..5479fa301e --- /dev/null +++ b/challenge-214/arne-sommer/raku/collect-points-cheat @@ -0,0 +1,41 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@numbers where @numbers.elems > 0 && all(@numbers) ~~ Numeric, :v(:$verbose)); + +my $score = 0; +my %freq; +my $cheat = False; + +while (@numbers.elems) +{ + $cheat + ?? ( $cheat = False ) + !! ( %freq = @numbers.Bag ); + + my $size = @numbers.elems; + + for %freq.keys.sort -> $value + { + my $freq = %freq{$value}; + my $index = @numbers.first($value, :k); + + if all(@numbers[$index .. $index + $freq -1]) eq $value + { + sink @numbers.splice($index, $freq); + $score += $freq * $freq; + say ": Removed the value $value ($freq items, at index: $index .. { $index + $freq -1}). New score: $score" if $verbose; + } + } + + if @numbers.elems == $size + { + my $val = %freq.keys.sort({ %freq{$_} }).first; + %freq{$val}--; + $cheat = True; + say ": Enable cheat mode on value $val" if $verbose; + } +} + +say "ERROR: Unable to reduce @numbers[]" if @numbers.elems; + +say $score; diff --git a/challenge-214/arne-sommer/raku/collect-points-last b/challenge-214/arne-sommer/raku/collect-points-last new file mode 100755 index 0000000000..c11c023438 --- /dev/null +++ b/challenge-214/arne-sommer/raku/collect-points-last @@ -0,0 +1,30 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@numbers where @numbers.elems > 0 && all(@numbers) ~~ Numeric, :v(:$verbose)); + +my $score = 0; + +while (@numbers.elems) +{ + my %freq = @numbers.Bag; + my $size = @numbers.elems; + + for %freq.keys.sort -> $value + { + my $freq = %freq{$value}; + my $index = @numbers.first($value, :k); + + if all(@numbers[$index .. $index + $freq -1]) eq $value + { + sink @numbers.splice($index, $freq); + $score += $freq * $freq; + say ": Removed the value $value ($freq items, at index: $index .. { $index + $freq -1}). New score: $score" if $verbose; + } + } + + last if @numbers.elems == $size; +} + +say "ERROR: Unable to reduce @numbers[]" if @numbers.elems; + +say $score; diff --git a/challenge-214/arne-sommer/raku/rank-scores b/challenge-214/arne-sommer/raku/rank-scores new file mode 100755 index 0000000000..13dd968aad --- /dev/null +++ b/challenge-214/arne-sommer/raku/rank-scores @@ -0,0 +1,23 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@scores where @scores.elems > 0 && all(@scores) ~~ UInt, :v(:$verbose)); + +my %freq = @scores>>.Int.Bag; +my @sort = @scores.sort.squish.reverse; + +say ": Frequency: { %freq.raku }" if $verbose; + +my %gold = (1 => 'G', 2 => 'S', 3 => 'B'); +my %rank; + +for @sort -> $score +{ + state $rank = 1; + %rank{$score} = %gold{$rank} // $rank; + say ": Score $score with rank: %rank{$score} and frequency: %freq{$score}" if $verbose; + $rank += %freq{$score}; +} + +say "(" ~ @scores.map({ %rank{$_} }).join(",") ~ ")"; + + -- cgit