ナノピコ教室の東海道五十三次をPythonで解いてみた(2)

プログラミング

東海道本線

前回の続きです。

ライブラリのインポート・グローバル変数

import csv
import math
import copy
import sys

fare_list = []
stations = []
csv、math、copy、sysの4つの標準ライブラリをインポートしています。

csvライブラリは、csvファイルを読み込む際にcsv.reader関数を使っています。

mathライブラリは、1キロメートル未満の端数を切り上げるためにmath.ceil関数を使っています。JRの運賃計算が

運賃は営業キロを使用して計算します。
営業キロは、「JR時刻表」の列車時刻の駅名欄の左側にある「営業キロ」から算出し、1キロメートル未満のは数は切り上げ、これを「A表 本州3社内の幹線の普通運賃表」または「B表 本州3社内の地方交通線の普通運賃表」にあてはめて運賃を計算します。
東京・名古屋・大阪の一部地区では特定運賃が適用される区間があります。

となっているためです。

copyライブラリは、リストをコピーする際にcopy.deepcopyを使っています。プログラムを作る際に配列・リストのようなデータの集まりをコピーする場合「浅いコピー」「深いコピー」で引っかかることがよくあります。詳細は省きますが、「浅いコピー」「深いコピー」「参照渡し」「値渡し」という言葉に馴染みがない場合、簡単なプログラムを動かして挙動を確認したり、配列などがどのようにメモリ内部にデータを持っているかを確認したりするとよいと思います。別の変数名だから別の値だと思ってプログラムを書いていると、値を変更したり追加したときに連動して変更・追加されてしまうことがあるので要注意です。

sysライブラリは、ものすごく大きい数としてsys.maxsizeを使うために利用しています。ものすごく大きい数をどうするかという問題になりますが、運賃だから百万円は超えないだろうから1,000,000にするのでよいでしょうか?かつてジンバブエがハイパーインフレに見舞われ100兆ジンバブエ・ドルが発行されたという過去もあるので、ベタで数値を書くのではなく、システムが持っている最大の数sys.maxsizeを使っています。ジンバブエもびっくりな922京を超えるような金額を計算する必要が出た場合、見つけるのが困難なバグの温床ですが・・・

変数fare_listは営業キロと運賃の対応を扱う変数です。また、変数stationsは駅の名前、東京からの営業キロといったデータを扱う変数です。

main関数

def main():
    init()
    find()
    print_result()

プログラムがやっている流れがわかりやすいように、粒度を大きくして関数にしています。

このプログラムでは

初期化をして(init関数) → 最安ルートを探索して(find関数) → 結果表示する(print_result関数)

だけです。各関数については別のところで書きます。

main関数の呼び出しは64行目以降の

if __name__ == '__main__':
    main()

から呼び出しています。64行目のif文により、直接実行した場合のみmain関数が実行されます。

長くなったので、今回はここまでにして続きは後日書きます。

Posted by 春日井 優