From 52e71cb65dd7c8cfec513a844eafca6fc0011f08 Mon Sep 17 00:00:00 2001 From: arnesom Date: Sun, 26 May 2024 23:32:44 +0200 Subject: Arne Sommer --- challenge-270/arne-sommer/blog.txt | 1 + challenge-270/arne-sommer/raku/ch-1.raku | 38 +++++++++++++ challenge-270/arne-sommer/raku/ch-2.raku | 52 ++++++++++++++++++ challenge-270/arne-sommer/raku/distribute-elements | 62 ++++++++++++++++++++++ .../arne-sommer/raku/distribute-elements-index | 52 ++++++++++++++++++ .../arne-sommer/raku/distribute-elements-same | 27 ++++++++++ challenge-270/arne-sommer/raku/special-positions | 38 +++++++++++++ 7 files changed, 270 insertions(+) create mode 100644 challenge-270/arne-sommer/blog.txt create mode 100755 challenge-270/arne-sommer/raku/ch-1.raku create mode 100755 challenge-270/arne-sommer/raku/ch-2.raku create mode 100755 challenge-270/arne-sommer/raku/distribute-elements create mode 100755 challenge-270/arne-sommer/raku/distribute-elements-index create mode 100755 challenge-270/arne-sommer/raku/distribute-elements-same create mode 100755 challenge-270/arne-sommer/raku/special-positions 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; -- cgit