diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-10-27 10:55:32 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-27 10:55:32 +0100 |
| commit | 5a87803e2ef44a0f0a0bd2f9fa6f0024fa0d4c09 (patch) | |
| tree | 1c242520b4794e66276f1d1ace9bf8afcbfd2457 | |
| parent | 4e2fa309014610ee3f8fc4aa6329326722570081 (diff) | |
| parent | 5c2c896b413eeb0a1311eccfdd6d884c7e6d9834 (diff) | |
| download | perlweeklychallenge-club-5a87803e2ef44a0f0a0bd2f9fa6f0024fa0d4c09.tar.gz perlweeklychallenge-club-5a87803e2ef44a0f0a0bd2f9fa6f0024fa0d4c09.tar.bz2 perlweeklychallenge-club-5a87803e2ef44a0f0a0bd2f9fa6f0024fa0d4c09.zip | |
Merge pull request #5110 from Abigail/abigail/week-136
Abigail/week 136
| -rw-r--r-- | challenge-136/abigail/README.md | 2 | ||||
| -rw-r--r-- | challenge-136/abigail/c/ch-1.c | 4 | ||||
| -rw-r--r-- | challenge-136/abigail/pascal/ch-1.p | 64 | ||||
| -rw-r--r-- | challenge-136/abigail/pascal/ch-2.p | 27 |
4 files changed, 95 insertions, 2 deletions
diff --git a/challenge-136/abigail/README.md b/challenge-136/abigail/README.md index df95d28447..b1b1f2b0ef 100644 --- a/challenge-136/abigail/README.md +++ b/challenge-136/abigail/README.md @@ -10,6 +10,7 @@ * [Java](java/ch-1.java) * [Lua](lua/ch-1.lua) * [Node.js](node/ch-1.js) +* [Pascal](pascal/ch-1.p) * [Perl](perl/ch-1.pl) * [Python](python/ch-1.py) * [R](r/ch-1.r) @@ -27,6 +28,7 @@ * [Java](java/ch-2.java) * [Lua](lua/ch-2.lua) * [Node.js](node/ch-2.js) +* [Pascal](pascal/ch-2.p) * [Perl](perl/ch-2.pl) * [Python](python/ch-2.py) * [R](r/ch-2.r) diff --git a/challenge-136/abigail/c/ch-1.c b/challenge-136/abigail/c/ch-1.c index d1c218aee5..d6fcc4d898 100644 --- a/challenge-136/abigail/c/ch-1.c +++ b/challenge-136/abigail/c/ch-1.c @@ -20,8 +20,8 @@ long long gcd (long long u, long long v) { long long u_odd = u % 2; long long v_odd = v % 2; - return u == v || !v ? u - : !u ? v + return u == v || !v ? u + : !u ? v : !u_odd && !v_odd ? gcd (u >> 1, v >> 1) << 1 : !u_odd && v_odd ? gcd (u >> 1, v) : u_odd && !v_odd ? gcd (u, v >> 1) diff --git a/challenge-136/abigail/pascal/ch-1.p b/challenge-136/abigail/pascal/ch-1.p new file mode 100644 index 0000000000..391a4fe69f --- /dev/null +++ b/challenge-136/abigail/pascal/ch-1.p @@ -0,0 +1,64 @@ +Program XXX; + +(* *) +(* See ../README.md *) +(* *) + +(* *) +(* Run as: fpc -och-1.out ch-1.p; ./ch-1.out < input-file *) +(* *) + +(* *) +(* Find the GCD, using Stein's algorithm *) +(* (https://en.wikipedia.org/wiki/Binary_GCD_algorithm) *) +(* *) +function gcd (u, v: integer): integer; + var + u_odd, v_odd: boolean; + + begin + u_odd := u mod 2 <> 0; + v_odd := v mod 2 <> 0; + + if (u = v) or (v = 0) then gcd := u + else if (u = 0) then gcd := v + else if not u_odd and not v_odd then gcd := gcd (u >> 1, v >> 1) << 1 + else if not u_odd and v_odd then gcd := gcd (u >> 1, v) + else if u_odd and not v_odd then gcd := gcd (u, v >> 1) + else if u > v then gcd := gcd (u - v, v) + else gcd := gcd (v - u, u); + end; + + +(* *) +(* Return true if number is a power of n, that is, number == n ^ p *) +(* for some non-negative integer p. Return false otherwise. *) +(* *) +function is_power_of_n (number, n: integer): boolean; + begin + if number < 1 then is_power_of_n := false + else if number = 1 then is_power_of_n := true + else if number mod n <> 0 then is_power_of_n := false + else is_power_of_n := is_power_of_n (number div n, n); + end; + +function is_power_of_2 (number: integer): boolean; + begin + is_power_of_2 := is_power_of_n (number, 2); + end; + + + +var + m, n, r: integer; + +begin + while (not eof) do begin + readln (m, n); + r := gcd (m, n); + if (r > 1) and is_power_of_2 (r) then + writeln (1) + else + writeln (0) + end +end. diff --git a/challenge-136/abigail/pascal/ch-2.p b/challenge-136/abigail/pascal/ch-2.p new file mode 100644 index 0000000000..6515b4e5ca --- /dev/null +++ b/challenge-136/abigail/pascal/ch-2.p @@ -0,0 +1,27 @@ +Program XXX; + +(* *) +(* See ../README.md *) +(* *) + +(* *) +(* Run as: fpc -och-2.out ch-2.p; ./ch-2.out < input-file *) +(* *) + +function count (target, this_fib, prev_fib: integer): integer; + begin + if target < this_fib then count := 0 + else if target = this_fib then count := 1 + else count := count (target - this_fib, this_fib + prev_fib, this_fib) + + count (target, this_fib + prev_fib, this_fib); + end; + +var + n: integer; + +begin + while (not eof) do begin + readln (n); + writeln (count (n, 1, 1)); + end +end. |
