aboutsummaryrefslogtreecommitdiff
path: root/challenge-133/abigail/awk/ch-2.awk
diff options
context:
space:
mode:
authorAbigail <abigail@abigail.be>2021-11-05 20:58:51 +0100
committerAbigail <abigail@abigail.be>2021-11-05 20:58:51 +0100
commita0298e354570ba3ebf90abaeaf9f2af3b58702e7 (patch)
treeb0aaf38d1443e4d6cf21dd5dc476a5fa2c65e974 /challenge-133/abigail/awk/ch-2.awk
parent62496f0a55d58841ca5b56cc386a329285d8e35d (diff)
downloadperlweeklychallenge-club-a0298e354570ba3ebf90abaeaf9f2af3b58702e7.tar.gz
perlweeklychallenge-club-a0298e354570ba3ebf90abaeaf9f2af3b58702e7.tar.bz2
perlweeklychallenge-club-a0298e354570ba3ebf90abaeaf9f2af3b58702e7.zip
AWK, Bash, Lua, Node.js, Python and Ruby solutions for week 133, part 2.
Diffstat (limited to 'challenge-133/abigail/awk/ch-2.awk')
-rw-r--r--challenge-133/abigail/awk/ch-2.awk67
1 files changed, 67 insertions, 0 deletions
diff --git a/challenge-133/abigail/awk/ch-2.awk b/challenge-133/abigail/awk/ch-2.awk
new file mode 100644
index 0000000000..b9d4e413f7
--- /dev/null
+++ b/challenge-133/abigail/awk/ch-2.awk
@@ -0,0 +1,67 @@
+#!/usr/bin/awk
+
+#
+# See ../README.md
+#
+
+#
+# Run as: awk -f ch-2.awk < input-file
+#
+
+function digit_sum (number, sum) {
+ sum = 0
+ while (number > 0) {
+ sum += number % 10
+ number = int (number / 10)
+ }
+ return sum
+}
+
+
+#
+# Factorize a number, given a set of small primes. This will work
+# for numbers up to, but not including, p^2, where p is the smallest
+# prime not included in the set. For the given set, the smallest number
+# which fails to factorize is 37^2 == 1369.
+#
+# We'll return a string containing all the factors.
+#
+function factorize (n, out, i, prime, c) {
+ out = ""
+ c = 0
+
+ for (i in small_primes) {
+ prime = small_primes [i]
+ while (n % prime == 0) {
+ out = out prime
+ n /= prime
+ c ++
+ }
+ }
+
+ if (n > 1) {
+ out = out n
+ c ++
+ }
+
+ return (c ";" out)
+}
+
+BEGIN {
+ split ("2 3 5 7 11 13 17 19 23 29 31", small_primes, " ")
+}
+
+BEGIN {
+ try = 1
+ count = 0
+ while (count < 10) {
+ split (factorize(try), info, ";")
+ if (info [1] > 1 && digit_sum(try) == digit_sum(info [2])) {
+ print try
+ count ++
+ }
+ try ++
+ }
+}
+
+