質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

825閲覧

at coder の過去問で、vsCodeだと正しく動くのに、サイトで提出するとREとなる

iwakikota0815

総合スコア3

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/04/19 05:10

発生している問題・エラーメッセージ
At coder problemsで過去問を解いているのですが、vsCodeの環境だと正しく動作するのに、サイトでコードを提出するとREと表示されてしまいます。
問題はこちらです。
https://atcoder.jp/contests/abc054/tasks/abc054_a

該当のソースコード
以下に私の書いたコードをしるします。また、私の使っている言語はpython(3.8.2)になります。

A = int(input()) B = int(input()) if A>=2 and A<=13 and B>=2 and B<=13 : if A>B : print("Alice") elif B>A : print("Bob") elif A == B: print("draw") elif A>=2 and A<=13 and B == 1 : print("Bob") elif A == 1 and B>=2 and B<=13 : print("Alice") elif A==1 and B==1 : print("draw")

こちらのコードで、REと表示されてしまう原因が分かる方、どうかご教授くださると幸いです。

使っているツールのバージョンなど補足情報
私自身、at coderは初心者中の初心者なので、当たり前の質問などをしているかもしれませんが、どうかよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2022/04/19 06:00

8 6 と 8 6 の違いでは。
BeatStar

2022/04/20 00:59

> vsCodeの環境だと正しく動作するのに とはどういうことでしょうか?
guest

回答1

0

私自身、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を取得するときには二行目のデータに移っているので存在しないデータを読み取ろうとしてこれもエラー。

もし仮に与えられるデータが

A 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. 後は比較して回答

ようにすればいいはずです。

シンプルに考えるとわかりやすいかも。

投稿2022/04/19 10:22

編集2022/04/19 10:49
BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問