|
#!/usr/bin/env bash |
|
# Copyright 2023, Koichi Murase <[email protected]>. |
|
# |
|
# usage: You can run this script in a terminal. Send Ctrl+C (SIGINT) |
|
# to stop the program. |
|
|
|
((BASH_VERSINFO[0]*100+BASH_VERSINFO[1]>=502)) || { echo 'bash >= 5.2 is required.' >&2; exit 1; } |
|
IFS=, |
|
set -f |
|
shopt -s checkwinsize patsub_replacement &>/dev/null |
|
|
|
printf '\e[?47h\e[?25l\e7\e[;40;97m' |
|
trap "printf '\e[m\e8\e[?47l\e[?25h'" 0 |
|
trap '(:);p=init' WINCH |
|
kill -WINCH "$$" |
|
|
|
init() { |
|
((X=(COLUMNS+63)/64,A=X*LINES,S=COLUMNS-(X-1)*64-1)) |
|
local LM='0' Lc='~0' |
|
((S)) && LM='-1<<'$((64-S)) Lc='~('$LM')' |
|
local -a buff=() |
|
for ((i=0;i<A;i++)); do |
|
((l=!(i%X),r=!((i+1)%X))) |
|
buff+=( |
|
"b=a[$i]" |
|
"c=b<<1&${LM[!r]:-~1}|a[$((i+1-r*X))]>>$((r?S:63))&${Lc[!r]:-1}" |
|
"d=b>>1&~(1<<63)|a[$((i-1+l*X))]<<$((l?S:63))&1<<63" |
|
"x$i=b^c^d" "y$i=c&d|b&(c|d)") |
|
done |
|
for ((i=0;i<A;i++)); do |
|
buff+=( |
|
"b=x$i" "c=x$(((i-X+A)%A))" "d=x$(((i+X)%A))" |
|
"e=y$i" "f=y$(((i-X+A)%A))" "g=y$(((i+X)%A))" "h=c&d|b&(c|d)" |
|
"m=b^c^d" |
|
"n=e^f^g^h" |
|
"t=m&n&~((e|f)&(g|h))" |
|
"u=~(m|n|e&f&g&h)&(e|f|g|h)" |
|
"a[$i]=t|u&a[$i]") |
|
done |
|
eval "step=\"\${buff[*]}\"" |
|
p='((step))' |
|
|
|
printf -v R '%*s' "$((X-1))"; R=${R//?/%s}%.$((S+1))s |
|
local -a H=({' ','*'}{' ','*'}{' ','*'}{' ','*'}) |
|
eval "$(printf 'H%x=${H[%d]};' {0..15}{,})" |
|
|
|
RAND64='RANDOM^RANDOM<<15^RANDOM<<30^RANDOM<<45^RANDOM<<60' |
|
eval "a=(); let 'a['{0..$((A-1))}']=RAND64'" |
|
} |
|
let j=196 D=0 'C[D++]=j+='{6,-36,1,-6,36,-1}{,,,,} j=0 |
|
while :; do |
|
eval "$p" |
|
printf -v s '%016x,' "${a[@]}" |
|
eval "s=${s//[!,]/'$H'&}" |
|
printf %s $'\e[?2026h\e[H\e[38;5;'"${C[j++/100%D]}m" |
|
printf "$R" $s |
|
printf %s $'\e[H\e[?2026l' |
|
done |