問題
小学校低学年向けの足し算と引き算の計算ドリルをつくりましょう。計算ドリルとして問題に重複があると計算力の訓練にならないため、足し算、引き算それぞれで重複が無いようにつくらなければなりません。必要な足し算と引き算の問題の数が与えられるので、それに従ってドリルを作成してください。
なお、その際問題に出てくる数値および解答はすべて 0 ~ 99 の整数になるようにします。
足し算も順番を変えたものは異なる問題とします (a ≠ b のとき "a + b =" と "b + a =" は異なる問題)。
例)
足し算 5 つ、引き算 3 つのドリルを作成 (入力例 1 に対応)
計算ドリルの例:
25 + 5 =
89 + 10 =
45 - 16 =
3 + 46 =
82 + 3 =
0 + 84 =
70 - 6 =
27 - 26 =
条件
すべてのテストケースにおいて、以下の条件をみたします。
・0 ≦ M, N ≦ 5,050 (条件内で作成可能な足し算・引き算の最大数)
・M + N ≧ 1
回答コード1(20点)
input_lines = gets.split(" ")
tasizan = input_lines[0].to_i
hikizan = input_lines[1].to_i
cnt=-0
drill=[]
while cnt<tasizan
kazu1 = rand(100)
kazu2 = rand(100)
next if kazu1+kazu2>99
next if kazu1==kazu2
drill.push("#{kazu1} + #{kazu2} =")
cnt+=1
end
cnt=0
while cnt<hikizan
kazu1 = rand(100)
kazu2 = rand(100)
next if kazu1 <= kazu2
drill.push("#{kazu1} - #{kazu2} =")
cnt+=1
end
drill.each{|i|
puts i
}
解説
入力から足し算引き算それぞれ必要な出力数を取得してその回数ループする様に
while文をくみたてた。
Arrayのdrillは必要な式全てぶち込んでから最後にランダムで出力出来るようにと思って用意したけど結果的に時間を取りに行くために出力は添え字の順番でということになっている。(問題の回答としては問題無い)
randメソッドで引数に100を指定した事で0~99の数をランダムで返すがそれぞれのループに対して条件を設けている
足し算
→回答が100以上ならパス
→数字の被りはパス(減点対象)
引き算
→引かれる側が必ず大きい事
とした。結果20点。タイムは45分。
回答コード2(訂正 90点)
input_lines = gets.split(" ")
tasizan = input_lines[0].to_i
hikizan = input_lines[1].to_i
cnt=-0
drill=[]
while cnt<tasizan
kazu1 = rand(100)
kazu2 = rand(100)
next if kazu1+kazu2>99
next if drill.include?("#{kazu1} + #{kazu2} =")
drill.push("#{kazu1} + #{kazu2} =")
cnt+=1
end
cnt=0
while cnt<hikizan
kazu1 = rand(100)
kazu2 = rand(100)
next if kazu1 <= kazu2
next if drill.include?("#{kazu1} - #{kazu2} =")
drill.push("#{kazu1} - #{kazu2} =")
cnt+=1
end
puts drill.sample(tasizan+hikizan)
解説
一回目の提出がたった20点だった。
原因は同じ式の出力が行われたことであると考える。
drillにpuShする前に同じ式が無いかを確認するコードを加えて、
更に足し算引き算ランダムに出力される様にsampleメソッドを用いてみた。
”引数に整数を指定すると、その数だけ要素をランダムに取り出し配列で返します。要素の順番もランダムになります。”
結果ケース10で何回やってもタイムオーバーになってしまうが90点。Bが遠い