aboutsummaryrefslogtreecommitdiff
path: root/games/rndn.sh
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2017-04-05 20:06:39 +1200
committerTom Ryder <tom@sanctum.geek.nz>2017-04-05 20:46:47 +1200
commitc8ab406749124d2e762ad5cf53963070113afd0f (patch)
tree54c9721a06957ebe7098a211eea803b0230c0f5d /games/rndn.sh
parentHandle POSIX correctness in ~/.bash_profile (diff)
downloaddotfiles-c8ab406749124d2e762ad5cf53963070113afd0f.tar.gz
dotfiles-c8ab406749124d2e762ad5cf53963070113afd0f.zip
Apply runtime shebanging to POSIX shell
Diffstat (limited to 'games/rndn.sh')
-rw-r--r--games/rndn.sh43
1 files changed, 43 insertions, 0 deletions
diff --git a/games/rndn.sh b/games/rndn.sh
new file mode 100644
index 00000000..18c34218
--- /dev/null
+++ b/games/rndn.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+# Esoteric random number generator
+
+# Single optional argument is a random seed, otherwise use rnds(1df)
+s=${1:-"$(rnds)"}
+
+# Validate s
+case $s in
+ *[!0-9]*)
+ printf >&2 'rndn: Seed must be non-negative integer\n'
+ exit 2
+ ;;
+esac
+
+# Helper functions
+t() {
+ printf %u "$1" | cut -c -"$2"
+}
+l() {
+ printf %u "$1" | wc -c
+}
+c() {
+ printf %u "$1" | cut -c "$2"
+}
+
+# Apply algorithm; you are not expected to understand this
+s=$(t "$((s + 10))" 32) i=1 t=0
+while [ "$i" -le "$(l "$s")" ] ; do
+ d=$(c "$s" "$i")
+ t=$((t + d)) i=$((i + 1))
+done
+p=$((s - t))
+while [ "$(l "$p")" -gt 1 ] ; do
+ j=1 q=0
+ while [ "$j" -le "$(l "$p")" ] ; do
+ d=$(c "$p" "$j")
+ q=$((q + d)) j=$((j + 1))
+ done
+ p=$q
+done
+
+# Print result
+printf '%u\n' "$p"