aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarnesom <arne@bbop.org>2023-04-29 21:44:17 +0200
committerarnesom <arne@bbop.org>2023-04-29 21:44:17 +0200
commit0e9ec6594abf6126cadf60ce058dae38cd1e00a7 (patch)
tree789617ba5e3824178a450992b2356a33b8ce0c07
parent579fa7b88b8b452e6c7b52cb203c72cefab01a1c (diff)
downloadperlweeklychallenge-club-0e9ec6594abf6126cadf60ce058dae38cd1e00a7.tar.gz
perlweeklychallenge-club-0e9ec6594abf6126cadf60ce058dae38cd1e00a7.tar.bz2
perlweeklychallenge-club-0e9ec6594abf6126cadf60ce058dae38cd1e00a7.zip
Arne Sommer
-rw-r--r--challenge-214/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-214/arne-sommer/raku/ch-1.raku23
-rwxr-xr-xchallenge-214/arne-sommer/raku/ch-2.raku41
-rwxr-xr-xchallenge-214/arne-sommer/raku/collect-points25
-rwxr-xr-xchallenge-214/arne-sommer/raku/collect-points-cheat41
-rwxr-xr-xchallenge-214/arne-sommer/raku/collect-points-last30
-rwxr-xr-xchallenge-214/arne-sommer/raku/rank-scores23
7 files changed, 184 insertions, 0 deletions
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(",") ~ ")";
+
+