python3を使用してAOJ(Aizu Online Judge)に挑戦した際にひっかかったこと
計算結果が0.0になってほしいところが、-0.0になってしまう
- 現象
Volume0 0004 連立方程式用のプログラムを作成した。Sample Input2で期待値が「0.000 3.000」に対して「-0.000 3.000」になってしまう。
- 原因
浮動小数点演算の誤差?
- 対策
以下のようなコードを追加して、値が-0.0になった場合、強制的に0.0になるようにする。
from math import fabs # ... epsilon = 1e-9 # ... if fabs(x) < epsilon: x = 0.0 if fabs(y) < epsilon: y = 0.0
日付から曜日に変換するのが面倒
- 現象
Volume0 0027 何曜日?で日付から曜日を計算するプログラムを作成した。楽をしようと思ってdatetime.dateを使用して計算したら曜日が一つずれてしまう。
- 原因
date.weekday()の仕様。このメソッドは月曜日なら0、日曜日なら6を返してくる。月曜日なら1、日曜日なら7を返してほしければ、date.isoweekday()を使用する。
- 対策
そもそも、date.weekday()/isoweekday()を使って曜日の数字を返してもらい、それを手動で文字列に変換するのが間違っている。date.strftime()を使用して書式に「%A」を指定すれば、曜日を文字列で返してくれる。
標準ライブラリリファレンス: 8.1.8. strftime() と strptime() の振る舞い
from datetime import date ... dt = date(2004, month, day) print(dt.strftime('%A'))
colloctions.dequeを使用したプログラムでRuntime Errorが発生する。
- 現象
Volume0 0030 整数の和でプログラムの途中経過を確認するためにdequeを使用した。ローカル環境では完璧に動作しているハズなのに、判定に持っていくとエラーで落とされてしまう。
- 原因
勘違い。元々のコードでは、dequeに入れてある状態を関数の引数の時の感覚で以下のようなコードでリストに変換していた。ローカルのpython3.5では、この書き方で期待した動作をするが、AOJのpython3.4ではエラーになる。
from collections import deque # ... q = deque() q.append(1) q.append(2) q.append(3) status = [*q] # deque名の前に*を付けると、各要素に展開される???
- 対策
今回はデバッグ用の箇所でひっかかっていたので3番で。
forループを使用して展開する
dequeを使用せずに、リストで頑張る
該当コードを削除(コメントアウト)する