49 lines
1.1 KiB
Bash
Executable File
49 lines
1.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
source bashlib
|
|
cdsource
|
|
|
|
getword() {
|
|
local cat=$1 pop_limit=$2 words=()
|
|
|
|
while read pop word; do
|
|
(( pop_limit && pop > pop_limit )) && break
|
|
words+=( "$word" )
|
|
done < "words.txt.$cat"
|
|
|
|
(( ${#words[@]} )) || { echo '1 -'; return 1; }
|
|
echo "${#words[@]} ${words[RANDOM % ${#words[@]}]}"
|
|
}
|
|
|
|
declare -A categoryByCharacter=(
|
|
['a']=adj
|
|
['r']=adv
|
|
['n']=noun
|
|
['v']=verb
|
|
)
|
|
templates=(
|
|
ran # ~32.0 bit
|
|
)
|
|
permutations=1
|
|
|
|
while getopts :t:p: arg; do
|
|
case $arg in
|
|
# The sentence template to use.
|
|
t) template=$OPTARG ;;
|
|
# Use only the top N most popular words.
|
|
p) pop_limit=$OPTARG ;;
|
|
esac
|
|
done
|
|
template=${template:-${templates[$((RANDOM % ${#templates[@]}))]}}
|
|
|
|
|
|
printf 'sentence: '
|
|
while read -n1 character && [[ $character ]]; do
|
|
category=${categoryByCharacter["$character"]}
|
|
read p word < <(getword "$category" "$pop_limit")
|
|
(( permutations *= p ))
|
|
printf '%s ' "$word"
|
|
done <<< "$template"
|
|
echo
|
|
printf 'permutations: %s, entropy: ~%.1f bit\n' "$permutations" "$(bc -l <<< "l($permutations) / l(2)")"
|
|
|