AOJの プログラミング入門 トピック11にチャレンジしました。
トピック11 数学関数
11_A:Dice Ⅰ
11_A から11_DまですべてDiceの問題です。
Noteに「クラスや構造体を利用してDiceを作成しましょう」とあるので、Classを使用して作成してみます。
クラスの定義やインスタンス化などの使用方法が記載されていますが、言語がJAVAになっています。。
とりあえず以下のように定義してローカルで実行するとエラーとなりました。。
実行結果
TypeError: set_num() takes 1 positional argument but 2 were given
引き数の定義が1個しかないのに2個与えられています。と表示されました。
Pythonではクラスをインスタンス化して関数を実行する場合、インスタンス名も引数にわたされるようで、以下のようにset_num関数の引数にselfを追加して修正しました。
実行結果
NameError: name 'list_dice' is not defined
クラス内の変数を関数内で使用する場合もselfが必要でした。
追加して実行し、入力データに上書きされていることが確認できました。
入力データと実行結果
E、W、S、Nの入力でDiceの向きがかわるchange_num関数を追加して、実行しPASSできました。
class Dice_class:
#さいころの目:1から6
list_dice = list(range(1,7))
#入力データをさいころの目に上書き
def set_num(self,in_data):
for iii in range(6):
self.list_dice[iii] = in_data[iii]
def change_num(self,change_list):
for iii in range(len(change_list)):
no1 = self.list_dice[0]
no2 = self.list_dice[1]
no3 = self.list_dice[2]
no4 = self.list_dice[3]
no5 = self.list_dice[4]
no6 = self.list_dice[5]
if change_list[iii] == 'N':
no1 = self.list_dice[1]
no2 = self.list_dice[5]
no3 = self.list_dice[2]
no4 = self.list_dice[3]
no5 = self.list_dice[0]
no6 = self.list_dice[4]
elif change_list[iii] == 'W':
no1 = self.list_dice[2]
no2 = self.list_dice[1]
no3 = self.list_dice[5]
no4 = self.list_dice[0]
no5 = self.list_dice[4]
no6 = self.list_dice[3]
elif change_list[iii] == 'E':
no1 = self.list_dice[3]
no2 = self.list_dice[1]
no3 = self.list_dice[0]
no4 = self.list_dice[5]
no5 = self.list_dice[4]
no6 = self.list_dice[2]
elif change_list[iii] == 'S':
no1 = self.list_dice[4]
no2 = self.list_dice[0]
no3 = self.list_dice[2]
no4 = self.list_dice[3]
no5 = self.list_dice[5]
no6 = self.list_dice[1]
self.list_dice[0] = no1
self.list_dice[1] = no2
self.list_dice[2] = no3
self.list_dice[3] = no4
self.list_dice[4] = no5
self.list_dice[5] = no6
#クラスのインスタンス化
d1 = Dice_class()
#データの入力
list_data = list(map(int,input().split()))
in_data2 = list(input())
#set_num関数の呼び出し
d1.set_num(list_data)
#change_num関数の呼び出し
d1.change_num(in_data2)
#list_daice内の値を変更内容を表示
print(d1.list_dice[0])
10_B:Dice Ⅱ
DiceⅡは上面、全面の値をもらい、Diceの側面の値をこたえる問題です。
各面の値を元に、上面と入力値が一致したときの4面の側面データをみて、
求められるアウトプットが出力される関数を追加しました。
def check_num(self,in_data2,in_data3):
ok_flag = 0
for iii in range(8):
if iii > 3 :
self.change_num(['W'])
if in_data2 == self.list_dice[0] and in_data3 == self.list_dice[1]:
ok_flag = 1
return self.list_dice[2]
break
elif in_data2 == self.list_dice[0] and in_data3 == self.list_dice[2]:
ok_flag = 1
return self.list_dice[4]
break
elif in_data2 == self.list_dice[0] and in_data3 == self.list_dice[3]:
ok_flag = 1
return self.list_dice[1]
break
elif in_data2 == self.list_dice[0] and in_data3 == self.list_dice[4]:
ok_flag = 1
return self.list_dice[3]
break
else:
self.change_num(['S'])
クラスの各関数を実行し、PASSできました。
#クラスのインスタンス化
d1 = Dice_class()
#データの入力
list_data = list(map(int,input().split()))
in_data = int(input())
#set_num関数の呼び出し
d1.set_num(list_data)
iii=0
while iii < in_data :
in_data2,in_data3 = map(int,input().split())
get_num = d1.check_num(in_data2,in_data3)
#list_daice内の値を変更内容を表示
print(get_num)
iii+=1
11_C:Dice Ⅲ
2つのDiceが同じならYes、違うならNoを出力する問題です。
クラス内の変数をそのまま宣言して使用していましたが、これだとクラス変数となり、複数インスタンスを作成しても同じ値となってしまいます。
list_dice = list(range(1,7))
なので、インスタンスごとに個別の値を使用したいので以下のようにインスタンス変数にへんこうします。
def __init__(self):
self.list_dice = list(range(1,7))
上記変更後、2つインスタンスを作成し、比較一致を行いました。
#クラスのインスタンス化
d1 = Dice_class()
d2 = Dice_class()
#データの入力
list_data1 = list(map(int,input().split()))
list_data2 = list(map(int,input().split()))
#set_num関数の呼び出し
d1.set_num(list_data1)
d2.set_num(list_data2)
ok_flag = 0
for iii in range(4):
if ok_flag==1:
break
for jjj in range(4):
#print("1st",d2.list_dice)
d2.change_num(['S'])
if d1.list_dice == d2.list_dice:
print("Yes")
ok_flag = 1
break
d2.change_num(['W'])
if ok_flag ==0 :
d2.change_num(['N'])
for iii in range(4):
if ok_flag==1 :
break
for jjj in range(4):
#print("2nd",d2.list_dice)
d2.change_num(['S'])
if d1.list_dice == d2.list_dice:
print("Yes")
ok_flag = 1
break
d2.change_num(['W'])
if ok_flag ==0 :
print("No")
11_D:Dice Ⅳ
Diceの種類が全て異なればYes、そうでなければNoを出力する問題です。
複数インスタンスを作成する必要があるので、リストを作成し、そこでインスタンス化を実行しました。あとは、前回使った関数を利用して一致、不一致を判断しました。
d1 = Dice_class()
dice = []
ok_flag = 0
num = int(input())
list_data = list(map(int,input().split()))
d1.set_num(list_data)
for iii in range(num-1):
list_data1 = list(map(int,input().split()))
Dice_class1 = Dice_class()
Dice_class1.set_num(list_data1)
dice.append(Dice_class1)
for kkk in range(num-1):
for iii in range(4):
if ok_flag==1:
break
for jjj in range(4):
dice[kkk].change_num(['S'])
if d1.list_dice == dice[kkk].list_dice:
print("No")
ok_flag = 1
break
dice[kkk].change_num(['W'])
if ok_flag ==0 :
dice[kkk].change_num(['N'])
for iii in range(4):
if ok_flag==1 :
break
for jjj in range(4):
dice[kkk].change_num(['S'])
if d1.list_dice == dice[kkk].list_dice:
print("No")
ok_flag = 1
break
dice[kkk].change_num(['W'])
if ok_flag ==0 :
print("Yes")
これでプログラム入門編は完了しました。