Aizu Online Judge を Python 3 でやってます。 今回はITP1_11_A~ITP1_11_Dまでです。 構造体とクラスを使ったプログラムです。 いよいよ、Introduction to Programming I の最後のトピックですが 正直ちょっと難しかったです。 サイコロがどのようになっているのかイメージしづらくて。。。 どうも空間的なものを考えるのは苦手かも。 ITP1_11_A - Dice Iダイスをclassを使って作成してみました。 オブジェクト指向のプログラミングに慣れていないのでこうゆうもので良いのかよくわかってませんがどうでしょう? __init__()メソッドはコンストラクタに相当するものです(正確にはコンストラクタではないらしい)。 あと、Pythonではインスタンスメソッドの第1引数にselfを書くという慣習らしい(あまりよくわかっていない)。selfはインスタンス(自分)を指すポインタ。 ダイスを回転させるroll()というメソッドと上になっている面を表示させるprint_top()メソッドをそのまま書いてみました。 ITP1_11_B - Dice IIdice クラスには右面を出力するprint_right()メソッドと 現在の状態を得るためのget_label()メソッドを追加しました。 プログラムの処理としては、与えられた質問ごとに for op in 'EEENEEENEEESEEESEEENEEEN': で質問に当てはまる上面と前面のセットが出るまでdiceを回転させています。 この命令セットでサイコロのすべての状態(6 x 4 = 24状態)が出せることは事前に確認しました。 もっと綺麗なやり方がありそうですが自分の中ではこのやり方が一番しっくりきたのでこの方法にしました。 ITP1_11_C - Dice III今度は2つのサイコロが与えられた時に、その2つが同一のものかどうかを判定するプログラムです。 dice クラスは先ほどと変わりありません。 プログラムの処理としても先ほどと同様に1つ目のサイコロに対して全ての状態を出す命令セットを回して、2つ目のサイコロと比較して一致すれば'Yes'、一致するものがなければ'No'を出力するようにしています。 Pythonではfor文に対して、else 文を書けるので for文の前で何か値を初期化して、for文中で条件にヒットしたかどうかをその変数で判断するといった手法を採らなくても同等のプログラムを書くことができます。 ITP1_11_D - Dice IVさて、いよいよ Introduction to Programming I の最後の問題です。 今度は複数のサイコロが与えられて、それら全てが異なるサイコロであれば'Yes'、同一のサイコロのペアが1つでもあれば'No'を出力するプログラムです。 今度は与えられたラベルとサイコロが一致するかどうかを確認するcompare()メソッドをdiceクラスに入れてみました。 プログラムの本文は、新しいサイコロが与えられるごとにそのサイコロと一致するものが今までのサイコロの中にあるかどうかを確認して、あれば No を出力して終了。なければリストに新しいサイコロを追加して、次のサイコロを取得するという手順で進めて、全てのサイコロを読み込んでも一致するものがなかったら、Yes を出力するようにしています。 for - else と break, continue を使って結構シンプルに書けたかなと思っているのですがどうでしょうか? 感想入門編の最後のトピックということもあって、それまでのものより難しく感じました。 色々試してみて、最終的に自分に合ってるなというやり方を紹介しましたがもっとうまいやり方がありそうな気もしています。
0 コメント
あなたのコメントは、承認後に掲載されます。
メッセージを残してください。 |