aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-104/abigail/README.md4
-rw-r--r--challenge-104/abigail/bash/ch-1a.sh67
2 files changed, 70 insertions, 1 deletions
diff --git a/challenge-104/abigail/README.md b/challenge-104/abigail/README.md
index f4c74aad05..a53b6ef3ec 100644
--- a/challenge-104/abigail/README.md
+++ b/challenge-104/abigail/README.md
@@ -26,7 +26,9 @@ the solution.
* AWK
* [Simple](awk/ch-1.awk)
* [Calculated](awk/ch-1a.awk)
-* [Bash](bash/ch-1.sh)
+* Bash
+ * [Simple](bash/ch-1.sh)
+ * [Calculated](bash/ch-1a.sh)
* [Basic](basic/ch-1.bas)
* [Befunge-93](befunge-93/ch-1.bf93)
* [bc](bc/ch-1.bc)
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