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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

2回答

2295閲覧

競技プログラミングのRuntime errorとは(Python3)

mofu_mofu

総合スコア73

Python 3.x

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

0グッド

1クリップ

投稿2018/02/21 10:53

編集2018/02/21 13:24

いつも大変お世話になっております。

以前プログラミングが速い人って日常的に何をしているのか?と質問して、その回答として問題をたくさん解くという回答をいただきました。なのでコーディングの練習としてyukicoderを始めました。

ですが、この問題を提出する際にRuntime errorで引っかかっています。私が提出したコードはこちらになります。

自分で調べてみてもRuntime errorは様々な理由が考えられますと書かれていているのみで、具体的な解決策の検討が付かない状態です。

この場合のRuntime errorとは何を指しているのか教えていただけないでしょうか。
よろしくお願いいたします。


環境
Python3.6
Pycharm
Windows10


追記分
回答を参考に修正をしたらテストケースが通りました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ぱっと見た感じ、入力に問題ありです。

Python

s = [input() for i in range(n)]
...
bool_list.append(((s[i] + 1) == s[i + 1]) or ((s[i] - 1) == s[i + 1]))

このsって文字列のリストですよね?数値は足せません。
数値のリストとして扱いたいなら、s = [int(input()) for i in range(n)]ですかね。


手元の環境、あるいはWandboxなどで試してみると詳細なエラーを知れますよ。
yukicoderのヘルプページにも、次のように書いてありますし。

####ランタイムエラーメッセージが見たい

セキュリティ上よろしくないものもメッセージとして出せちゃうので、出さないようにしてます。
テストケースのダウンロードもできるので、お手元の環境で実行してみてください。
どうしてもわからない(環境依存)という場合は、ご連絡頂ければ、ユーザーのTwitterなどにご連絡します。

まあ、今回はエラーメッセージがとんでもなく分かりづらいのですが...

Python

1>>> 'a' + 1 2Traceback (most recent call last): 3 File "<stdin>", line 1, in <module> 4TypeError: must be str, not int

投稿2018/02/21 11:00

編集2018/02/21 11:06
LouiS0616

総合スコア35660

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

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

mofu_mofu

2018/02/21 13:39

LouiS0106さんいつもありがとうございます。 おっしゃるとおり、input()で受け取ったstrに対してintのように対応していました。 その後修正をして、テストがすべて通りました。 https://yukicoder.me/submissions/237612 昨日PycharmでShift+F10で実行してテストをしていたのですが、なぜかエラーを吐かなかったので問題ないと思っていましたが、今日再度テストしてみたらこのエラーを吐きました。 これからはコマンドライン上でもテストしてみます。 ありがとうございました。
LouiS0616

2018/02/21 13:56

エラーを吐かなかったのは不思議ですね。 ひょっとしてPyCharmではPython2.7を使っていたりしませんか? 2.7のinput関数は自動的に数値を解釈してくれちゃうのです。
mofu_mofu

2018/02/21 14:04

LouiS0616さん 2.7だとinputは数値に自動で変換するのですね...。 おそらく、Python2系を使用していた可能性が高いです。 Run > edit configurationsでpython 3.6.2を選択して実行してからエラーをはいたような気がします。 だから手動でのテストが通っていたのですね、なるほど。。 勉強させていただきました。ご丁寧にどうもありがとうございます。
guest

0

ご自身のコードをmain.pyと保存して、
テストケースをin0とすると、
python main.py < in0と実行することで本番と限りなく近い状況を作ることができます。

投稿2018/02/21 11:26

mkgrei

総合スコア8560

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

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

mofu_mofu

2018/02/21 13:33

mkgreiさん 回答ありがとうございます。 私の使い方が間違っている可能性が高いのですが、assertをつかってテストをして、その後Pycharmで実行やデバッグをしていたのですが、デバッグでassertが通っていることを確認したのにassertでエラーをはいていたりしていて、assertを使うかどうか迷っていたところなので今後の参考にさせていただきます。ありがとうございます。
mkgrei

2018/02/21 14:13

assertの使い方にもよりますが、コードの中に入れると実行速度に影響があるので、削除の手間がかかります。 また、assertを使うとコード内に直書きになるかと思いますが、それだとインプットをいろいろと変えた時に手間です。 競技プログラミングは結果が単純な場合が多いので、目視で結果を確認できることが多いです。 インプットだけころころ入れ替えれて、デバッグが完了したらそのままコードをコピペできる方法がおすすめです。
mkgrei

2018/02/21 14:18

assertはメソッドの引数チェックや途中計算の整合性を確認することが多いと思われます。 assertに引っかかるとエラーハンドリングするか、スクリプトがクラッシュするので、外側に何かと組み合わせて使うことが多いです。 例えば単体テスト用のライブラリを使うと、エラーをキャッチしてまとめの結果を表示してもらったりします。 ------ assertはコンパイル言語との方が相性が良いです。 コンパイルする時にassertをオフにすること(コールがそもそもされない)が簡単にできるからです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問