aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarnesom <arne@bbop.org>2024-05-26 23:32:44 +0200
committerarnesom <arne@bbop.org>2024-05-26 23:32:44 +0200
commit52e71cb65dd7c8cfec513a844eafca6fc0011f08 (patch)
tree80792d181aa64333944a02a519fd012e235daae0
parent5ae5dae1606d672f5123901550717cdb5ec72921 (diff)
downloadperlweeklychallenge-club-52e71cb65dd7c8cfec513a844eafca6fc0011f08.tar.gz
perlweeklychallenge-club-52e71cb65dd7c8cfec513a844eafca6fc0011f08.tar.bz2
perlweeklychallenge-club-52e71cb65dd7c8cfec513a844eafca6fc0011f08.zip
Arne Sommer
-rw-r--r--challenge-270/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-270/arne-sommer/raku/ch-1.raku38
-rwxr-xr-xchallenge-270/arne-sommer/raku/ch-2.raku52
-rwxr-xr-xchallenge-270/arne-sommer/raku/distribute-elements62
-rwxr-xr-xchallenge-270/arne-sommer/raku/distribute-elements-index52
-rwxr-xr-xchallenge-270/arne-sommer/raku/distribute-elements-same27
-rwxr-xr-xchallenge-270/arne-sommer/raku/special-positions38
7 files changed, 270 insertions, 0 deletions
diff --git a/challenge-270/arne-sommer/blog.txt b/challenge-270/arne-sommer/blog.txt
new file mode 100644
index 0000000000..db787844a8
--- /dev/null
+++ b/challenge-270/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/distribute-positions.html
diff --git a/challenge-270/arne-sommer/raku/ch-1.raku b/challenge-270/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..003dceab02
--- /dev/null
+++ b/challenge-270/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,38 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($string = "1 0 0 | 0 0 1 | 1 0 0",
+ :v(:$verbose));
+
+my $matrix = $string.split("|")>>.words>>.Int>>.Array;
+
+die "The rows must have the same size" unless [==] $matrix>>.elems;
+
+die "Must contain 0s and 1s only" unless all($matrix[*;*]) ~~ one(0,1);
+
+my $rows = $matrix.elems;
+my $cols = $matrix[0].elems;
+my $count = 0;
+
+say ": matrix: $matrix" if $verbose;
+
+for ^$rows -> $row
+{
+ for ^$cols -> $col
+ {
+ my $val = $matrix[$row][$col];
+ my $row_sum = $matrix[$row;*].sum;
+ my $col_sum = $matrix[*;$col].sum;
+
+ say ": r: $row c: $col v: $val row: $matrix[$row;*] -> $row_sum col: $matrix[*;$col] -> $col_sum" if $verbose;
+
+ next unless $val == 1;
+ next unless $row_sum == 1;
+ next unless $col_sum == 1;
+
+ $count++;
+
+ say ": - is Special #$count" if $verbose;
+ }
+}
+
+say $count;
diff --git a/challenge-270/arne-sommer/raku/ch-2.raku b/challenge-270/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..ab2ff9ac69
--- /dev/null
+++ b/challenge-270/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,52 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (UInt :$x where $x > 0 = 2,
+ UInt :$y where $y > 0 = 3,
+ *@ints is copy,
+ :v(:$verbose));
+
+die "Non-negative integers only" unless all(@ints) ~~ UInt;
+
+my $target = @ints.max;
+my $cost = 0;
+
+say ": Target: $target" if $verbose;
+
+if $x + $x > $y
+{
+ loop
+ {
+ last if all(@ints) == $target;
+
+ last if @ints.grep( * eq $target ).elems == @ints.elems -1;
+
+ say ": Ints: @ints[]" if $verbose;
+
+ my @pairs = @ints.pairs.sort({ $^a.value <=> $^b.value });
+
+ my $first_idx = @pairs[0].key;
+ my $second_idx = @pairs[1].key;
+
+ say ": Level 2: Add cost: $y for bringing \@ints[$first_idx] from { @ints[$first_idx] } to { @ints[$first_idx] +1 } and \@ints[$second_idx] from { @ints[$second_idx] } to { @ints[$second_idx] +1 }" if $verbose;
+
+ $cost += $y;
+
+ @ints[$first_idx]++;
+ @ints[$second_idx]++;
+ }
+}
+
+say ": Ints after level 2: @ints[]" if $verbose;
+
+for ^@ints.elems -> $index
+{
+ my $delta = $target - @ints[$index];
+
+ next unless $delta;
+
+ $cost += $delta * $x;
+
+ say ": Level 1: Add cost: { $delta * $x } ($delta times $x) for bringing \@ints[$index] from { $target - $delta } to $target" if $verbose;
+}
+
+say $cost; \ No newline at end of file
diff --git a/challenge-270/arne-sommer/raku/distribute-elements b/challenge-270/arne-sommer/raku/distribute-elements
new file mode 100755
index 0000000000..65b8b9e593
--- /dev/null
+++ b/challenge-270/arne-sommer/raku/distribute-elements
@@ -0,0 +1,62 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (UInt :$x where $x > 0 = 2,
+ UInt :$y where $y > 0 = 3,
+ *@ints,
+ :v(:$verbose));
+
+die "Non-negative integers only" unless all(@ints) ~~ UInt;
+
+my @todo = @ints.sort;
+
+say ": Sorted: @todo[]" if $verbose;
+
+my $target = @todo.pop;
+my $cost = 0;
+
+say ": Target: $target" if $verbose;
+
+
+if $x + $x > $y
+{
+ loop
+ {
+ last unless @todo.elems >= 2;
+
+ my $first = @todo.shift;
+
+ next if $first == $target;
+
+ my $second = @todo.shift;
+
+ if $second == $target
+ {
+ @todo.push: $first;
+ last;
+ }
+
+ $cost += $y;
+
+ $first++;
+ $second++;
+
+ @todo.push: $first unless $first == $target;
+ @todo.push: $second unless $second == $target;
+ @todo .= sort;
+
+ say ": Level 2: Add cost: $y for bringing { $first - 1 } to $first and { $second - 1 } to $second -> todo: @todo[]" if $verbose;
+ }
+}
+
+say ": Todo after level 2: @todo[]" if $verbose;
+
+for @todo -> $candidate
+{
+ my $delta = $target - $candidate;
+
+ $cost += $delta * $x;
+
+ say ": Level 1: Add cost: { $delta * $x } ($delta * $x) for bringing $candidate to $target" if $verbose;
+}
+
+say $cost; \ No newline at end of file
diff --git a/challenge-270/arne-sommer/raku/distribute-elements-index b/challenge-270/arne-sommer/raku/distribute-elements-index
new file mode 100755
index 0000000000..ab2ff9ac69
--- /dev/null
+++ b/challenge-270/arne-sommer/raku/distribute-elements-index
@@ -0,0 +1,52 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (UInt :$x where $x > 0 = 2,
+ UInt :$y where $y > 0 = 3,
+ *@ints is copy,
+ :v(:$verbose));
+
+die "Non-negative integers only" unless all(@ints) ~~ UInt;
+
+my $target = @ints.max;
+my $cost = 0;
+
+say ": Target: $target" if $verbose;
+
+if $x + $x > $y
+{
+ loop
+ {
+ last if all(@ints) == $target;
+
+ last if @ints.grep( * eq $target ).elems == @ints.elems -1;
+
+ say ": Ints: @ints[]" if $verbose;
+
+ my @pairs = @ints.pairs.sort({ $^a.value <=> $^b.value });
+
+ my $first_idx = @pairs[0].key;
+ my $second_idx = @pairs[1].key;
+
+ say ": Level 2: Add cost: $y for bringing \@ints[$first_idx] from { @ints[$first_idx] } to { @ints[$first_idx] +1 } and \@ints[$second_idx] from { @ints[$second_idx] } to { @ints[$second_idx] +1 }" if $verbose;
+
+ $cost += $y;
+
+ @ints[$first_idx]++;
+ @ints[$second_idx]++;
+ }
+}
+
+say ": Ints after level 2: @ints[]" if $verbose;
+
+for ^@ints.elems -> $index
+{
+ my $delta = $target - @ints[$index];
+
+ next unless $delta;
+
+ $cost += $delta * $x;
+
+ say ": Level 1: Add cost: { $delta * $x } ($delta times $x) for bringing \@ints[$index] from { $target - $delta } to $target" if $verbose;
+}
+
+say $cost; \ No newline at end of file
diff --git a/challenge-270/arne-sommer/raku/distribute-elements-same b/challenge-270/arne-sommer/raku/distribute-elements-same
new file mode 100755
index 0000000000..3853fc337c
--- /dev/null
+++ b/challenge-270/arne-sommer/raku/distribute-elements-same
@@ -0,0 +1,27 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (UInt :$x where $x > 0 = 2,
+ UInt :$y where $y > 0 = 3,
+ *@ints,
+ :v(:$verbose));
+
+die "Non-negative integers only" unless all(@ints) ~~ UInt;
+
+my $target = @ints.max;
+my $cost = 0;
+my $delta = @ints.map( $target - * ).sum;
+
+say ": Delta: $delta" if $verbose;
+
+if $x + $x > $y
+{
+ my $operations = $delta div 2;
+
+ $cost = $operations * $y;
+
+ $delta -= $operations * 2;
+}
+
+$cost += $delta * $x if $delta;
+
+say $cost; \ No newline at end of file
diff --git a/challenge-270/arne-sommer/raku/special-positions b/challenge-270/arne-sommer/raku/special-positions
new file mode 100755
index 0000000000..003dceab02
--- /dev/null
+++ b/challenge-270/arne-sommer/raku/special-positions
@@ -0,0 +1,38 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($string = "1 0 0 | 0 0 1 | 1 0 0",
+ :v(:$verbose));
+
+my $matrix = $string.split("|")>>.words>>.Int>>.Array;
+
+die "The rows must have the same size" unless [==] $matrix>>.elems;
+
+die "Must contain 0s and 1s only" unless all($matrix[*;*]) ~~ one(0,1);
+
+my $rows = $matrix.elems;
+my $cols = $matrix[0].elems;
+my $count = 0;
+
+say ": matrix: $matrix" if $verbose;
+
+for ^$rows -> $row
+{
+ for ^$cols -> $col
+ {
+ my $val = $matrix[$row][$col];
+ my $row_sum = $matrix[$row;*].sum;
+ my $col_sum = $matrix[*;$col].sum;
+
+ say ": r: $row c: $col v: $val row: $matrix[$row;*] -> $row_sum col: $matrix[*;$col] -> $col_sum" if $verbose;
+
+ next unless $val == 1;
+ next unless $row_sum == 1;
+ next unless $col_sum == 1;
+
+ $count++;
+
+ say ": - is Special #$count" if $verbose;
+ }
+}
+
+say $count;