the code challenge of Rain
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.2 KiB

#!/bin/sh
# .. / ..-. . . .-.. / .. -. / .-.. --- ...- . / .-- .. - .... / .... . .-. / .-- .-. .. - .. -. --. / - .... .. ...
# shellcheck disable=SC2086,SC1083,SC2154
# SC2086 - required for IFS replacement
# SC1083 - required for eval
# SC2154 - eval sets $cur
IFS=""; LANG=C
# index's
index="A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z:1:2:3:4:5:6:7:8:9:0: " # 36 items
indexl="a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:q:r:s:t:u:v:w:x:y:z:1:2:3:4:5:6:7:8:9:0: " # lowercase index for ascii
exb=".-:-...:-.-.:-..:.:..-.:--.:....:..:.---:-.-:.-..:--:-.:---:.--.:--.-:.-.:...:-:..-:...-:.--:-..-:-.--:--..:.----:..---:...--:....-:.....:-....:--...:---..:----.:-----:/"
ma() {
eval letter=\${$#}
eval cur=\${$letter}; [ "$cur" = 37 ] && cur=" " # IFS=": " causes #37 in $index to be lost
printf '%s' "${cur}"
}
am() {
IFS=""
eval letter=\${$#};
[ $letter -gt 37 ] && : $((letter-=37))
eval cur=\${$letter}; printf '%s ' "$cur"
}
unset bang; line=1; while read -r p || [ -n "$p" ]; do
p=${p# }; p=${p% }
[ "$line" -eq 1 -o "$bang" ] 2>/dev/null && { # start comment check # this is basically a shitpost lol
case "$p" in
'#'!*) bang=" ";;
'#'?-*|'#'?.*) p="${p#\#}"; printf '%sl: %s\n# ' "${bang# }" "${line}"
bang='
' # big hack to add newlines to start if >1
n1="0"; IFS=": "; for i in ${p}; do
for ii in $exb; do
: $((n1+=1));
case "$ii" in
"$i") ma ${indexl} "$n1"
esac
done
n1=0
done ;;
esac # this only converts morse
[ "$bang" ] && p="?"
}
case "$p" in
"") echo ;; # skip empty lines
-*|.*)
# for morse to ascii
n1="0"; IFS=": "; for i in ${p}; do
for ii in $exb; do
: $((n1+=1));
case "$ii" in
"$i") ma ${indexl} "$n1"
esac
done
n1=0
done ;;
*)
# ascii to morse
while [ "$p" ]; do
next="${p#?}"; # ${p%$next} is the current letter
IFS=":"; na="0"; for ai in ${index} ${indexl}; do
# echo $ai
: $((na+=1))
case "${p%$next}" in
"$ai") am $exb $na; break;;
esac
done
na=0
p="$next"
done
;;
esac
: $((line+=1))
done # stdin read; fuck you
echo