aboutsummaryrefslogtreecommitdiff
path: root/challenge-104/abigail/bash
diff options
context:
space:
mode:
authorAbigail <abigail@abigail.be>2021-03-18 01:02:40 +0100
committerAbigail <abigail@abigail.be>2021-03-18 01:02:40 +0100
commitd7ae4aa3f9ff963bd9b2c42da3eafec3bb391633 (patch)
tree48abe8176edd3f9d9c87664965ea3ae6cf4d0c51 /challenge-104/abigail/bash
parent78b8eff4fd091098bf6cba2ec9bcfb1ac145166c (diff)
downloadperlweeklychallenge-club-d7ae4aa3f9ff963bd9b2c42da3eafec3bb391633.tar.gz
perlweeklychallenge-club-d7ae4aa3f9ff963bd9b2c42da3eafec3bb391633.tar.bz2
perlweeklychallenge-club-d7ae4aa3f9ff963bd9b2c42da3eafec3bb391633.zip
Alternative Bash solution for week 104, part 1
Diffstat (limited to 'challenge-104/abigail/bash')
-rw-r--r--challenge-104/abigail/bash/ch-1a.sh67
1 files changed, 67 insertions, 0 deletions
diff --git a/challenge-104/abigail/bash/ch-1a.sh b/challenge-104/abigail/bash/ch-1a.sh
new file mode 100644
index 0000000000..69d7e9631f
--- /dev/null
+++ b/challenge-104/abigail/bash/ch-1a.sh
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+#
+# See ../README.md
+#
+
+#
+# Run as: bash ch-1a.sh
+#
+
+
+declare -a cache
+cache[0]=0
+cache[1]=1
+
+max=50
+
+#
+# Fusc sequence is defined as:
+# ( n, 0 <= n <= 1
+# fusc (n) = { fusc (n / 2), n > 1 && n even
+# ( fusc ((n - 1) / 2) + fusc ((n + 1) / 2), n > 1 && n odd
+#
+
+function fusc () {
+ local n=$1
+ if ((${cache[$n]} >= 0))
+ then fusc_out=${cache[$n]}
+ return
+ fi
+
+ if ((n % 2))
+ then local p1=$((($1 - 1) / 2))
+ local p2=$((($1 + 1) / 2))
+ fusc $p1; local f1=$fusc_out
+ fusc $p2; local f2=$fusc_out
+ cache[$1]=$((f1 + f2))
+ else fusc $((n / 2))
+ cache[$1]=$fusc_out
+ fi
+
+ fusc_out=${cache[$n]}
+ return
+}
+
+#
+# Initialize the cache
+#
+for ((m = 0; m < max; m ++))
+do cache[$m]=-1
+done
+
+cache[0]=0
+cache[1]=1
+
+#
+# Calculate the first 50 values, and print them.
+#
+for ((m = 0; m < max; m ++))
+do if ((m > 0))
+ then printf " "
+ fi
+ fusc $m
+ printf $fusc_out
+done
+
+echo