LoginSignup
1
0

More than 1 year has passed since last update.

ハイアンドロー・カードゲームの解き方

Last updated at Posted at 2021-11-10

はじめに

ハイアンドロー・カードゲーム問題でつまづいたところがあったので、備忘録にと書かせていただきました。

ハイアンドロー・カードゲームとは 

 ※問題をしている方は読み飛ばしても構いません。

ハイアンドロー・カードゲームは、複数枚の子カードそれぞれが、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ランクともに目指しましょう!

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0