From b8649d44c3a5e1bd34a87a14c13426fda45acfd7 Mon Sep 17 00:00:00 2001 From: Noud Aldenhoven Date: Sat, 9 May 2020 14:01:51 +0200 Subject: Solution to challenge 059 task 1 and 2 in Raku by Noud --- challenge-059/noud/raku/ch-1.p6 | 18 ++++++++++++++++++ challenge-059/noud/raku/ch-2.p6 | 42 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 challenge-059/noud/raku/ch-1.p6 create mode 100644 challenge-059/noud/raku/ch-2.p6 (limited to 'challenge-059') diff --git a/challenge-059/noud/raku/ch-1.p6 b/challenge-059/noud/raku/ch-1.p6 new file mode 100644 index 0000000000..570ab00efe --- /dev/null +++ b/challenge-059/noud/raku/ch-1.p6 @@ -0,0 +1,18 @@ +# You are given a linked list and a value k. Write a script to partition the +# linked list such that all nodes less than k come before nodes greater than or +# equal to k. Make sure you preserve the original relative order of the nodes +# in each of the two partitions. +# +# For example: +# +# Linked List: 1 → 4 → 3 → 2 → 5 → 2 +# +# k = 3 +# +# Expected Output: 1 → 2 → 2 → 4 → 3 → 5. + +sub partition(@l, $k) { + return [|(@l.grep({ $_ < $k })), |(@l.grep({ $_ >= $k }))]; +} + +say partition([1, 4, 3, 2, 5, 2], 3).join(' → '); diff --git a/challenge-059/noud/raku/ch-2.p6 b/challenge-059/noud/raku/ch-2.p6 new file mode 100644 index 0000000000..1c1b1fb693 --- /dev/null +++ b/challenge-059/noud/raku/ch-2.p6 @@ -0,0 +1,42 @@ +# Helper Function +# +# For this task, you will most likely need a function f(a,b) which returns the +# count of different bits of binary representation of a and b. +# +# For example, f(1,3) = 1, since: +# +# Binary representation of 1 = 01 +# Binary representation of 3 = 11 +# +# There is only 1 different bit. Therefore the subroutine should return 1. Note +# that if one number is longer than the other in binary, the most significant +# bits of the smaller number are padded (i.e., they are assumed to be zeroes). +# +# Script Output +# +# You script should accept n positive numbers. Your script should sum the +# result of f(a,b) for every pair of numbers given: +# For example, given 2, 3, 4, the output would be 6, since f(2,3) + f(2,4) + +# f(3,4) = 1 + 2 + 3 = 6 + +sub f($a, $b) { + return [+] ($a +^ $b).base(2).comb; +} + +sub pair-sum(@a) { + return [+] @a.combinations(2).map({ f($_[0], $_[1]); }); +} + +say pair-sum([2, 3]); +say pair-sum([2, 3, 4]); +say pair-sum([2, 3, 4, 5]); +say pair-sum([2, 3, 4, 5, 6]); +say pair-sum([2, 3, 4, 5, 6, 7]); +say pair-sum([2, 3, 4, 5, 6, 7, 8]); +say pair-sum([2, 3, 4, 5, 6, 7, 8, 9]); +say pair-sum([2, 3, 4, 5, 6, 7, 8, 9, 10]); + +# Note: This sequence is unknown in the online encyclopedia of integer +# sequences (OEIS). I'm surprised it's not in there. Is this pair-sum function +# somehow a well know function? If it isn't I think it's a good idea to add it +# to the OEIS. -- cgit