はじめに
ハイアンドロー・カードゲーム問題でつまづいたところがあったので、備忘録にと書かせていただきました。
ハイアンドロー・カードゲームとは
### ※問題をしている方は読み飛ばしても構いません。
ハイアンドロー・カードゲームは、複数枚の子カードそれぞれが、1枚の親カードとの強弱関係で勝負するゲームです。
どのカードにも2つの番号が書かれています。
1つ目の番号は1から10の整数、2つ目の番号は1から4の整数で表されます。
また、2つの番号の各組み合わせは1枚だけカードの束に含まれています。(同じカードが2枚以上存在しません)
2枚のカードの強弱関係は、次のルールによって決まります。
・1つ目の番号が大きいカードのほうが強い
・1つ目の番号が同じ場合、2つ目の番号が小さいカードのほうが強い
親カードと子カードの情報が与えられるので、それらの強弱関係を調べるプログラムを作成してください。
##入力される値
入力は以下のフォーマットで与えられます。
a b
n
A_1 B_1
…
A_n B_n
1行目では親カードの情報が与えられます。親カードの1つ目の番号は a、2つ目の番号は b で表されます。
2行目では整数 n が与えられます。
3行目から n 行の入力が続き、各行では、子カード i (1 ≦ i ≦ n)の情報が与えられます。
子カード i の1つ目の番号は A_i、2つ目の番号は B_i で表されます。
それぞれの値は文字列で標準入力から渡されます。
##期待する出力
出力の i 行目では、親カードと子カード i の強弱関係を調べたときに
親カードの方が強いならば "High"、そうでなければ "Low" と出力してください。
各行では、"High" または "Low" 以外の余分な文字、空白を含んではいけません。
最後は改行し、余計な文字、空行を含んではいけません。
##条件
すべてのテストケースで以下の条件を満たします。
・1 ≦ a, A_i ≦ 10
・1 ≦ b, B_i ≦ 4
・1 ≦ n < 40
※入力データの中で同じカードが現れることはありません。
####入力例2
7 3
4
7 1
7 4
5 3
10 1
####出力例2
Low
High
High
Low
###はい、よくわかりませんね。読解するのにちょっと時間がかかりました。
入力例2を参考に解説します。
親カード(7 3)
4回timesで回していきます。
子カード1 (7 1)
子カード2 (7 4)
子カード3 (5 3)
子カード4 (10 1)
まず親カードの(7)と子カード1の(7)を比べます。(一回目)
同じ強さなので
親カードの(3)と子カード1の(1)を比べます。(二回目)
親カードが弱いので出力はLow(二回目は1が一番強くなります。)
親カードの(7)と子カード3の(3)を比べたときに
親カードが小さいので出力はHigh
こんな感じです。
#解き方
### 問題が解決済みの方・わからなかった方のみ読むことを推奨します
まずは親カード(7 3)を受け取ってください。
受け取り方がわからない方はこちら(paizaで頻出するメソッドまとめ)から。
次にn回入力をしたいので4を受け取る記述。
n回数、timesで子カードの情報を受け取ります。
n.times do
A, B = gets.split(" ").map &:to_i
puts A, B
end
出力
7
1
7
4
5
3
10
1
次にif文で強弱関係の比較演算子を記述します。
n.times do
A, B = gets.split(" ").map &:to_i
if a > A || (a == A) && (b < B)
puts "High"
elsif a < A || (a == A) && (b > B)
puts "Low"
end
end
解説します。
親要素(a b)と子要素(A B)を比較していきましょう。
親カードの一番目が強い場合。
もしくは一番目のカードが同じ強さで、親カードが2番目が強かった場合の記述です。
このどちらかがtrueだった場合、"High"が出力されます。
どちらもfalseだった場合、elsifで比較されます。
if a > A || (a == A) && (b < B)
こちらも同様です。
親カードの一番目が弱い場合。
もしくは一番目のカードが同じ強さで、親カードが2番目が弱かった場合の記述です。
このどちらかがtrueだった場合、"Low"が出力されます。
どちらもfalseだった場合は想定されていないのでelseは無しで構いません。
elsif a < A || (a == A) && (b > B)
解説は以上になります。
終わりに
今回丸々書いてしまいましたが、検索をかければかなりの数が出てきます。
その中でも一番わかりやすく書いた(つもり)なので理解したって方はぜひLGTMをください!
Bランクともに目指しましょう!