diff options
| author | Abigail <abigail@abigail.be> | 2021-10-25 15:36:55 +0200 |
|---|---|---|
| committer | Abigail <abigail@abigail.be> | 2021-10-25 15:36:55 +0200 |
| commit | 593e3b55cf0395b75891730d28f8a9eb7a26951a (patch) | |
| tree | 70a03cc9657082bedd7257b7cc478995c5bce2d2 | |
| parent | 2dbe6d2e70c029297f85d39fa0f7ce4363bf8d0d (diff) | |
| download | perlweeklychallenge-club-593e3b55cf0395b75891730d28f8a9eb7a26951a.tar.gz perlweeklychallenge-club-593e3b55cf0395b75891730d28f8a9eb7a26951a.tar.bz2 perlweeklychallenge-club-593e3b55cf0395b75891730d28f8a9eb7a26951a.zip | |
AWK solution for week 136
| -rw-r--r-- | challenge-136/abigail/README.md | 2 | ||||
| -rw-r--r-- | challenge-136/abigail/awk/ch-1.gawk | 41 | ||||
| -rw-r--r-- | challenge-136/abigail/awk/ch-2.awk | 20 |
3 files changed, 63 insertions, 0 deletions
diff --git a/challenge-136/abigail/README.md b/challenge-136/abigail/README.md index aa835b7f1e..ef4c25705c 100644 --- a/challenge-136/abigail/README.md +++ b/challenge-136/abigail/README.md @@ -2,8 +2,10 @@ ## Part 1 +* [GNU AWK](awk/ch-1.gawk) * [Perl](perl/ch-1.pl) ## Part 2 +* [AWK](awk/ch-2.awk) * [Perl](perl/ch-2.pl) diff --git a/challenge-136/abigail/awk/ch-1.gawk b/challenge-136/abigail/awk/ch-1.gawk new file mode 100644 index 0000000000..c40210446f --- /dev/null +++ b/challenge-136/abigail/awk/ch-1.gawk @@ -0,0 +1,41 @@ +#!/opt/local/bin/gawk + +# +# See ../README.md +# + +# +# Run as: gawk -f ch-1.gawk < input-file +# + + +# +# Find the GCD, using Stein's algorithm +# (https://en.wikipedia.org/wiki/Binary_GCD_algorithm) +# +function gcd (u, v, u_odd, v_odd) { + u_odd = u % 2 + v_odd = v % 2 + + return u == v || !v ? u \ + : !u ? v \ + : !u_odd && !v_odd ? lshift (gcd(rshift (u, 1), rshift (v, 1)), 1) \ + : !u_odd && !v_odd ? gcd(rshift (u, 1), v) \ + : !u_odd && !v_odd ? gcd(u, rshift (v, 1)) \ + : u > v ? gcd(u - v, v) \ + : gcd(v - u, u) +} + +# +# Pre calculate powers of 2. We can do powers up to and including 2^52 +# +BEGIN { + for (i = 1; i <= 52; i ++) { + power_of_2 [lshift (1, i)] = 1 + } +} + + +{ + print power_of_2 [gcd($1, $2)] || 0 +} diff --git a/challenge-136/abigail/awk/ch-2.awk b/challenge-136/abigail/awk/ch-2.awk new file mode 100644 index 0000000000..f950feb582 --- /dev/null +++ b/challenge-136/abigail/awk/ch-2.awk @@ -0,0 +1,20 @@ +#!/usr/bin/awk + +# +# See ../README.md +# + +# +# Run as: awk -f ch-2.awk < input-file +# + +function count (target, this_fib, prev_fib) { + return target < this_fib ? 0 \ + : target == this_fib ? 1 \ + : count(target - this_fib, this_fib + prev_fib, this_fib) + \ + count(target, this_fib + prev_fib, this_fib) +} + +{ + print count($1, 1, 1) +} |
