Files
exercism/bash/bowling/bowling.sh
2021-08-08 21:11:22 +02:00

87 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# V1: initial version
shopt -s extglob
# set to mask to enable logs. 0: none, 255: all
(( debug=2#00000000 ))
(( debug=2#00001111 ))
# $1: log level (mask), then strings to display.
debug () {
(( debug & $1 )) && shift && echo Line ${BASH_LINENO[0]}: "${@}" >&2
}
die () {
echo "${@}" >&2
exit 1
}
usage() {
die "usage: bowling.sh r1-20 [r21 [r22]]"
}
# pincount > 10. $1: frame
highroll() {
die Frame "Frame $1: Pin count exceeds pins on the lane."
}
# pincount > 10. $1: frame
negativeroll() {
die Frame "Frame $1: Negative roll is invalid."
}
# args test: 10 rolls mandatory
#(($# < 20)) && usage
rolls=($@)
debug 1 rolls=${rolls[@]}
((score = 0)) # total score
((tempscore = 0)) # tmp score (for spare/strike)
declare -a frames # frames scores
declare -a opened # spare:2, strike:1
((frame=-1)) # current frame
((curroll=1)) # roll in frame: 1:1st, 2:2nd
((i=0))
for ((roll=0; roll<$#; ++roll)); do
debug 2 loop roll="$roll"
(( ! roll % 2 && frame++ ))
exit 0
(( score=${rolls[$i]} ))
#(( score < 0 )) && || score > 10)) && echo 1
#if ((!roll % 2)); then # first roll in frame
((framescore=0)) # current frame score
for j in 0 1; do
(( roll = ${rolls[$i]} ))
((roll < 0)) && die Frame $((curframe+1)): Negative roll is invalid.
(( framescore += roll ))
((framescore == 10)) && ((opened[$curframe] = j+1))
(( i++ ))
done
debug 2 curframe=$curframe score=$framescore
#if ((roll))
((framescore > 10)) && wrongroll $curframe $curroll $framescore
frame[$curframe]=$framescore
((curroll = -curroll))
done
# emacs/vim settings.
# Local Variables:
# sh-basic-offset: 4
# indent-tabs-mode: nil
# comment-column: 50
# fill-column: 80
# End:
# vim: set tabstop=4 expandtab: