#!/usr/bin/env bash # Esoteric random number generator # self=rndn # Define usage function usage() { printf 'USAGE: %s [-h | -s SEED]\n' "$self" } # Parse options while getopts 'hs:' opt ; do case $opt in # -h for help h) usage exit 0 ;; # -s to set seed manually s) seed=$OPTARG ;; # Unknown option, print usage and fail \?) usage >&2 exit 2 ;; esac done shift "$((OPTIND-1))" # If no seed given, get one from Bash's $RANDOM : "${seed:=$((RANDOM ** 2))}" # Truncate the seed seed=${seed:0:32} # Check seed meets algorithm conditions if [[ $seed == *[^0-9]* ]] || ((seed < 0)) ; then printf >&2 '%s: error: seed must be non-negative integer\n' "$self" exit 2 fi # Apply algorithm for ((seed += 10, i = 0; i < ${#seed}; i++)) ; do ((sum += ${seed:i:1})) done for ((red = seed - sum; ${#red} > 1; red = redn)) ; do for ((j = 0, redn = 0; j < ${#red}; j++)) ; do ((redn += ${red:j:1})) done done # Print result printf '%u\n' "$red"