diff options
| -rw-r--r-- | challenge-104/abigail/README.md | 4 | ||||
| -rw-r--r-- | challenge-104/abigail/bash/ch-1a.sh | 67 |
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 |
