diff options
Diffstat (limited to 'challenge-059')
| -rw-r--r-- | challenge-059/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-059/arne-sommer/raku/bit-diff | 23 | ||||
| -rwxr-xr-x | challenge-059/arne-sommer/raku/bit-diff2 | 18 | ||||
| -rwxr-xr-x | challenge-059/arne-sommer/raku/bit-sum | 20 | ||||
| -rwxr-xr-x | challenge-059/arne-sommer/raku/bit-sum-musing | 46 | ||||
| -rwxr-xr-x | challenge-059/arne-sommer/raku/bit-sum-musing2 | 56 | ||||
| -rwxr-xr-x | challenge-059/arne-sommer/raku/ch-1.p6 | 31 | ||||
| -rwxr-xr-x | challenge-059/arne-sommer/raku/ch-2.p6 | 20 | ||||
| -rwxr-xr-x | challenge-059/arne-sommer/raku/linked-list | 31 | ||||
| -rwxr-xr-x | challenge-059/arne-sommer/raku/linked-list-linked | 48 |
10 files changed, 294 insertions, 0 deletions
diff --git a/challenge-059/arne-sommer/blog.txt b/challenge-059/arne-sommer/blog.txt new file mode 100644 index 0000000000..3217ab84fe --- /dev/null +++ b/challenge-059/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/linked-sum.html diff --git a/challenge-059/arne-sommer/raku/bit-diff b/challenge-059/arne-sommer/raku/bit-diff new file mode 100755 index 0000000000..fc27e3b060 --- /dev/null +++ b/challenge-059/arne-sommer/raku/bit-diff @@ -0,0 +1,23 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $a is copy, $b is copy, :$verbose); + +($a, $b) = ($b, $a) if $b > $a; + +my $a2 = $a.base(2); + +my $length = $a2.chars; + +my $b2 = $b.fmt('%0' ~ $length ~ 'b'); + +my $c2 = ($a +^ $b).fmt('%0' ~ $length ~ 'b'); + +if $verbose +{ + say ": $a2 ($a)"; + say ": $b2 ($b)"; + say ": $c2 -> ", $c2.comb.sum; +} + +say $c2.comb.sum; + diff --git a/challenge-059/arne-sommer/raku/bit-diff2 b/challenge-059/arne-sommer/raku/bit-diff2 new file mode 100755 index 0000000000..0cb783fa56 --- /dev/null +++ b/challenge-059/arne-sommer/raku/bit-diff2 @@ -0,0 +1,18 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $a, $b, :$verbose); + +my $c = ($a +^ $b); + +my $sum = $c.comb.sum; + +if $verbose +{ + my $length = (max($a, $b)).base(2).chars; + + say ": { $a.fmt('%0' ~ $length ~ 'b') } ($a)"; + say ": { $b.fmt('%0' ~ $length ~ 'b') } ($b)"; + say ": { $c.fmt('%0' ~ $length ~ 'b') } -> $sum"; +} + +say $sum; diff --git a/challenge-059/arne-sommer/raku/bit-sum b/challenge-059/arne-sommer/raku/bit-sum new file mode 100755 index 0000000000..89962b4271 --- /dev/null +++ b/challenge-059/arne-sommer/raku/bit-sum @@ -0,0 +1,20 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@numbers where @numbers.elems > 1 && all(@numbers) ~~ Int, + :$verbose); + +my $grand-total; + +for @numbers.combinations(2) -> $list +{ + my $sum = bit-diff(|$list); + say ": $list -> $sum" if $verbose; + $grand-total += $sum; +} + +say $grand-total; + +sub bit-diff (Int $a, Int $b) +{ + return ($a +^ $b).base(2).comb.sum; +} diff --git a/challenge-059/arne-sommer/raku/bit-sum-musing b/challenge-059/arne-sommer/raku/bit-sum-musing new file mode 100755 index 0000000000..e4d1166e93 --- /dev/null +++ b/challenge-059/arne-sommer/raku/bit-sum-musing @@ -0,0 +1,46 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $limit where $limit > 1 = 100, :$verbose); + +my $prev-sum = 0; +my $prev-inc = 0; +my $prev-inx = 0; + +my @result; + +for 2 .. $limit -> $number +{ + my @list = 1 .. $number; + + my $sum = bit-sum(@list); + my $inc = $sum - $prev-sum; + my $inx = $inc - $prev-inc; + + say ": bit-sum 1..{ $number.fmt("%3d") } -> { $sum.fmt("%3d") } -> { $inc.fmt("%3d") } -> { $inx.fmt("%3d") }" if $verbose; + + @result.push: $inx; + + $prev-sum = $sum; + $prev-inc = $inc; + $prev-inx = $inx; +} + +put @result; + +sub bit-sum (*@numbers where @numbers.elems > 1 && all(@numbers) ~~ Int) +{ + my $grand-total; + + for @numbers.combinations(2) -> $list + { + my $sum = bit-diff(|$list); + $grand-total += $sum; + } + + return $grand-total; + + sub bit-diff (Int $a, Int $b) + { + return ($a +^ $b).base(2).comb.sum; + } +} diff --git a/challenge-059/arne-sommer/raku/bit-sum-musing2 b/challenge-059/arne-sommer/raku/bit-sum-musing2 new file mode 100755 index 0000000000..9562349691 --- /dev/null +++ b/challenge-059/arne-sommer/raku/bit-sum-musing2 @@ -0,0 +1,56 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $limit where $limit > 1 = 100, :$verbose, :$type = "int"); + +my $prev-sum = 0; +my $prev-inc = 0; +my $prev-inx = 0; + +my @result; + +for 2 .. $limit -> $number +{ + my @list; + + given $type + { + when "int" { @list = (1 .. Inf)[^$number] } + when "even" { @list = (2, 4 ... Inf)[^$number] } + when "odd" { @list = (1, 3 ... Inf)[^$number] } + when "prime" { @list = ((1 .. Inf).grep: *.is-prime)[^$number] } + when "fib" { @list = (1, 1, * + * ... Inf)[^$number] } + default { die "Unknown type $_" } + } + + my $sum = bit-sum(@list); + my $inc = $sum - $prev-sum; + my $inx = $inc - $prev-inc; + + say ": bit-sum @list[] -> { $sum.fmt("%3d") } -> { $inc.fmt("%3d") } -> { $inx.fmt("%3d") }" if $verbose; + + @result.push: $inx; + + $prev-sum = $sum; + $prev-inc = $inc; + $prev-inx = $inx; +} + +put @result; + +sub bit-sum (*@numbers where @numbers.elems > 1 && all(@numbers) ~~ Int) +{ + my $grand-total; + + for @numbers.combinations(2) -> $list + { + my $sum = bit-diff(|$list); + $grand-total += $sum; + } + + return $grand-total; + + sub bit-diff (Int $a, Int $b) + { + return ($a +^ $b).base(2).comb.sum; + } +} diff --git a/challenge-059/arne-sommer/raku/ch-1.p6 b/challenge-059/arne-sommer/raku/ch-1.p6 new file mode 100755 index 0000000000..27b549dfd5 --- /dev/null +++ b/challenge-059/arne-sommer/raku/ch-1.p6 @@ -0,0 +1,31 @@ +#! /usr/bin/env raku + +multi MAIN (Int $k = 3, Str $list = "1 4 3 2 5 2", :$verbose) +{ + MAIN($k, $list.words, :$verbose); +} + +multi MAIN (Int $k = 3, *@list, :$verbose) +{ + my @lower; + my @higher; + + for @list -> $elem + { + $elem >= $k + ?? @higher.push: $elem + !! @lower.push: $elem; + } + + my @result = (@lower, @higher).flat; + + if $verbose + { + say ": == : $k"; + say ": < : @lower[]"; + say ": >= : @higher[]"; + } + + say @result.join(" → "); +} +
\ No newline at end of file diff --git a/challenge-059/arne-sommer/raku/ch-2.p6 b/challenge-059/arne-sommer/raku/ch-2.p6 new file mode 100755 index 0000000000..89962b4271 --- /dev/null +++ b/challenge-059/arne-sommer/raku/ch-2.p6 @@ -0,0 +1,20 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@numbers where @numbers.elems > 1 && all(@numbers) ~~ Int, + :$verbose); + +my $grand-total; + +for @numbers.combinations(2) -> $list +{ + my $sum = bit-diff(|$list); + say ": $list -> $sum" if $verbose; + $grand-total += $sum; +} + +say $grand-total; + +sub bit-diff (Int $a, Int $b) +{ + return ($a +^ $b).base(2).comb.sum; +} diff --git a/challenge-059/arne-sommer/raku/linked-list b/challenge-059/arne-sommer/raku/linked-list new file mode 100755 index 0000000000..27b549dfd5 --- /dev/null +++ b/challenge-059/arne-sommer/raku/linked-list @@ -0,0 +1,31 @@ +#! /usr/bin/env raku + +multi MAIN (Int $k = 3, Str $list = "1 4 3 2 5 2", :$verbose) +{ + MAIN($k, $list.words, :$verbose); +} + +multi MAIN (Int $k = 3, *@list, :$verbose) +{ + my @lower; + my @higher; + + for @list -> $elem + { + $elem >= $k + ?? @higher.push: $elem + !! @lower.push: $elem; + } + + my @result = (@lower, @higher).flat; + + if $verbose + { + say ": == : $k"; + say ": < : @lower[]"; + say ": >= : @higher[]"; + } + + say @result.join(" → "); +} +
\ No newline at end of file diff --git a/challenge-059/arne-sommer/raku/linked-list-linked b/challenge-059/arne-sommer/raku/linked-list-linked new file mode 100755 index 0000000000..00796d8676 --- /dev/null +++ b/challenge-059/arne-sommer/raku/linked-list-linked @@ -0,0 +1,48 @@ +#! /usr/bin/env raku + +multi MAIN (Int $k = 3, Str $list = "1 4 3 2 5 2", :$verbose) +{ + MAIN($k, $list.words, :$verbose); +} + +multi MAIN (Int $k = 3, *@list, :$verbose) +{ + my @lower; + my @higher; + + for @list -> $elem + { + $elem >= $k + ?? @higher.push: $elem + !! @lower.push: $elem; + } + + my @result = (@lower, @higher).flat; + + if $verbose + { + say ": == : $k"; + say ": < : @lower[]"; + say ": >= : @higher[]"; + } + + say @result.join(" → ") if $verbose; + + class ListElem + { + has $.value; + has $.next is rw; + + method display + { + print $.value; + if $.next { print " → "; $.next.display; } else { say ""; } + } + } + + my $head; + + $head = ListElem.new(value => $_, next => $head) for @result.reverse; + + $head.display; +} |
