todo: use narrower exception types
score computed as ratio instead of sum
todo: bonus flag