aboutsummaryrefslogtreecommitdiff
path: root/challenge-059
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-059')
-rw-r--r--challenge-059/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-059/arne-sommer/raku/bit-diff23
-rwxr-xr-xchallenge-059/arne-sommer/raku/bit-diff218
-rwxr-xr-xchallenge-059/arne-sommer/raku/bit-sum20
-rwxr-xr-xchallenge-059/arne-sommer/raku/bit-sum-musing46
-rwxr-xr-xchallenge-059/arne-sommer/raku/bit-sum-musing256
-rwxr-xr-xchallenge-059/arne-sommer/raku/ch-1.p631
-rwxr-xr-xchallenge-059/arne-sommer/raku/ch-2.p620
-rwxr-xr-xchallenge-059/arne-sommer/raku/linked-list31
-rwxr-xr-xchallenge-059/arne-sommer/raku/linked-list-linked48
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;
+}