私自身、at coderは初心者中の初心者なので、...
関係ありません。私もあまりAtCoderはやりませんがこれぐらいなら一瞬で出来ますよ。
一つ目。デバッグ方法を覚えましょう。それとデバッグしましょう。AtCoder等の競技プログラミングだけではなく、実際にソフトを作ったりする場合でもデバッグは当たり前のようにやります。
そもそもプログラミングは「こう書けばいい」というものではありません。ロジックを独自の書き方で書き下したものです。なので修正もその中に含まれます。
環境等によってデバッグ方法が変わるのでここでは書きませんが、「Python デバッグ方法」とかで調べてください。
二つ目。コードを読みましょう。コードを読むコツは「一行レベルで、その行が何をしているかを考えながら読む」です。
Python
1# 標準入力から受け取って整数としてAに入れる
2A = int(input())
3# 標準入力から受け取って整数としてBに入れる
4B = int(input())
5# Aが2以上13以下 かつ Bが2以上13以下なら
6if A>=2 and A<=13 and B>=2 and B<=13 :
7 # AがBより大きいなら
8 if A>B :
9 # "Alice"を表示
10 print("Alice")
11 # そうじゃなくてBの方が大きいなら
12 elif B>A :
13 # "Bob"を表示
14 print("Bob")
15 # そうじゃなくてAとBが同じなら
16 elif A == B:
17 # "draw"を表示
18 print("draw")
19 # そうじゃなくてAが2以上13以下 かつ Bが1 なら
20elif A>=2 and A<=13 and B == 1 :
21 # "Bob"と表示
22 print("Bob")
23# ......
24elif A == 1 and B>=2 and B<=13 :
25 print("Alice")
26elif A==1 and B==1 :
27 print("draw")
という風にやる。そしてこれを疑似コードとして切り出す。
1. 標準入力から受け取って整数としてAに入れる
2. 標準入力から受け取って整数としてBに入れる
3. Aが2以上13以下 かつ Bが2以上13以下なら
3.1. AがBより大きいなら
3.1.1. "Alice"を表示
3.2. そうじゃなくてBの方が大きいなら
3.2.1. "Bob"を表示
3.3. そうじゃなくてAとBが同じなら
3.3.1. "draw"を表示
4.そうじゃなくてAが2以上13以下 かつ Bが1 なら
4.1. "Bob"と表示
... (それ以降も続く)
のようになるはずです。まず(1)で標準入力から取得して整数としてAに入れる。ただし、公式によると
引数 prompt が存在すれば、それが末尾の改行を除いて標準出力に書き出されます。次に、この関数は入力から 1 行を読み込み、文字列に変換して (末尾の改行を除いて) 返します。
とあるので、「一行レベルでの取得」となります。取得して(2)へ。(2)ではBについて取得する。(3)に行き…とやっていく。
ここで一旦中断しておく。(普通はそのまま調べるんだけど)
三つ目。ちゃんと仕様を読みましょう。
まず入力値として与えられるデータ群はどのように与えられるのでしょうか? 問題文を見ると
Aliceが持っているカードに書かれている数は A 、Bobが持っているカードカードに書かれている数は B です。
(問題文より)
入力は以下の形式で標準入力から与えられる。
A B
(入力より)
つまり、「半角スペースを区切り文字として一行でA,Bが与えられる」です。
では二つ目の「コードを読みましょう」に戻って考えてみます。(1)で標準入力から読み取りますが、「一行として」読み取ります。ですが今回の場合、一行というのが「A B
」です。たとえば A = 1, B = 2 であれば
1 2
となっているはずです。
そうなると、(1)では"1 2"が取り出されますが、int() は整数に変換するだけなので "1 2"は整数に変換できずに失敗します。つまりエラー。(Pythonの仕様が変わって)仮に変換できたとしても(2)でBを取得するときには二行目のデータに移っているので存在しないデータを読み取ろうとしてこれもエラー。
もし仮に与えられるデータが
なのであれば確かに(1),(2)はうまくいく。
四つ目。「エラーメッセージを読みましょう」。
自分のパソコンとかで実際に動かしてみると具体的なエラーメッセージが出てきます。(AtCoderでは出ていたっけ?)
Paiza IOでやってみると
Error
1Traceback (most recent call last):
2 File "Main.py", line 4, in <module>
3 A = int(input())
4ValueError: invalid literal for int() with base 10: '3 1'
5
6[訳]
7Main.pyの4行目でエラーが出ている。
8ValueError。"3 1"っていうリテラルをint()で変換できへんで~
となっています。
[追記0]
さらに(3)以降も冗長です。仕様を確認してください。
弱 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < 11 < 12 < 13 < 1 強
となっています。
この場合、「規則性を見付ける」ことや「言い換え」て考えてみるのも手です。
強い手や弱い手の並びを見ると、常に 2から13まではそのまま昇順になっている。ただし、なぜか1だけが例外で「13」より強い。
でも基本的には「整数の昇順」なので13の次は14です。この1が2よりは弱い…のように特殊条件があれば別ですが今回に限っては単純に2~13 < 1
なので
1を14と置き換えてもよさそうです。
そうすれば、弱 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < 11 < 12 < 13 < 14 強
と単純に2から14まで昇順で並んでいるだけです。
整数の場合 A > B
とかで調べればいいですね。
で、今回は「Aが強ければ"Alice"と表示し、Bが強ければ"Bob"と表示し…」とあるので、A < B
のパターンとA > B
のパターンと分離しなければならない木がしますが、候補は「Aが強い」「Bが強い」「AとBは同じ(= 互角)」の三つだけです。
ということは、
AとBは同じかどうか ->違うならどちらかが強い
なので
i. AとBが同じかどうか => 「互角」
ii. Aの方が大きいか
ii.i. 「アリス」
iii. (そうじゃなくて)Bの方が大きいか
iii.i. 「ボブ」
のようにできるはずです。だって(i)を満たした時点で「互角」的なものを表示したらそれ以上の処理はありません。
なので上記のように省略できるはずです。
さらに 普通に整数を比較するときも「大きい」「小さい」「同じ」しかあり得ないので、「同じ」がすでに出ていて除外される以上、
2分の1しかありません。「大きい」か「小さい」。「大きい」が満たされないのなら「小さい」しかあり得ません。
つまり、elif を使って条件式を指定するまでもなく「それ以外なら」が使えるはずです。
ということは、
1. データを取得
2.データが1のときだけ変換
3. 後は比較して回答
ようにすればいいはずです。
シンプルに考えるとわかりやすいかも。