while True:

問題18

ボウリングの得点を計算するプログラムを作れ. ただし,データとしては,各投球の直後に残っているピンの数を次の例のように与えるものとする. 5, 1, 0, 2, 0, 3, 1, 0, 8, 0, 0, 3, 0, 0, 1, 0, 1

難易度 ★★★★★

超発展な問題です。競プロなどをしている人は簡単かもしれません。実際、IF文を多用することでゴリ押しで回答できる問題ではあります。 しかし、この問題を選択する以上はより簡潔に解答してほしいですね。ヒントは、どうして倒したピン数ではなく、残りのピン数を入力するのかです。 残りのピン数が0であることは、その投球がストライクかスペアであったことを示します。あとは、それがストライクかスペアかどうかを、そのフレームでの何投目かにより計算したのちに、 次の投球でのスコア(ストライクの場合はその次のスコアも含めて)をそのフレームでのスコアにしてあげることで完成します。 サンプルでは、なるべく短く簡潔に書きました。これよりもいい解法が見つかった人はぜひ教えてください。
program question18
	implicit none
	integer :: throws, score, times, frame, i
	integer, allocatable :: pins(:)

	print *, "input throws :"
	read *, throws

	allocate(pins(throws + 2))
	pins = 10
	print *, "input pins :"
	read *, pins(1:throws)

	score = 0
	frame = 1
	times = 1
	do i = 1, throws
		if (times == 1 .or. frame == 10) then
			score = score + (10 - pins(i))
			times = 2
			if (pins(i) == 0 .and. frame /= 10) then
				if (pins(i + 1) == 0) then
					score = score + (10 - pins(i + 1)) + (10 - pins(i + 2))
				else
					score = score + (10 - pins(i + 1)) + (pins(i + 1) - pins(i + 2))
				end if
				times = 1
				if (frame /= 10) then
					frame = frame + 1
				end if
			end if
		else if (times == 2) then
			score = score + (pins(i - 1) - pins(i))
			if (pins(i) == 0 .and. frame /= 10) then
				score = score + (10 - pins(i + 1))
			end if
			times = 1
			if (frame /= 10) then
				frame = frame + 1
			end if
		end if
	end do

	print *, "score :", score

end program question18
ページのトップへ戻る