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番で。

  1. forループを使用して展開する

  2. dequeを使用せずに、リストで頑張る

  3. 該当コードを削除(コメントアウト)する