AIZU ONLINE JUDGE: Programming Challenge プログラミング入門 トピック11

AOJの プログラミング入門 トピック11にチャレンジしました。

onlinejudge.u-aizu.ac.jp

 

トピック11 数学関数

 

 

トピック11

 

11_A:Dice Ⅰ

11_A から11_DまですべてDiceの問題です。

Noteに「クラスや構造体を利用してDiceを作成しましょう」とあるので、Classを使用して作成してみます。

クラスの定義やインスタンス化などの使用方法が記載されていますが、言語がJAVAになっています。。

 

とりあえず以下のように定義してローカルで実行するとエラーとなりました。。

class Dice_class:
    #さいころの目:1から6
    list_dice = list(range(1,7))

    #入力データをさいころの目に上書き
    def set_num(in_data):
        for iii in range(6):
            list_dice[iii] = in_data[iii]

#クラスのインスタンス
d1 = Dice_class()

#データの入力
list_data = list(map(int,input().split()))
 
#set_num関数の呼び出し
d1.set_num(list_data)

#list_daice内の値を変更内容を表示
print(d1.list_dice)

 

実行結果

TypeError: set_num() takes 1 positional argument but 2 were given

 

引き数の定義が1個しかないのに2個与えられています。と表示されました。

Pythonではクラスをインスタンス化して関数を実行する場合、インスタンス名も引数にわたされるようで、以下のようにset_num関数の引数にselfを追加して修正しました。

class Dice_class:
    #さいころの目:1から6
    list_dice = list(range(1,7))

    #入力データをさいころの目に上書き
    def set_num(self,in_data):
        for iii in range(6):
            list_dice[iii] = in_data[iii]

#クラスのインスタンス
d1 = Dice_class()

#データの入力
list_data = list(map(int,input().split()))
 
#set_num関数の呼び出し
d1.set_num(list_data)

#list_daice内の値を変更内容を表示
print(d1.list_dice)

 

実行結果

NameError: name 'list_dice' is not defined

 

クラス内の変数を関数内で使用する場合もselfが必要でした。

追加して実行し、入力データに上書きされていることが確認できました。

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]

#クラスのインスタンス
d1 = Dice_class()

#データの入力
list_data = list(map(int,input().split()))
 
#set_num関数の呼び出し
d1.set_num(list_data)

#list_daice内の値を変更内容を表示
print(d1.list_dice)

 

入力データと実行結果

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]

#クラスのインスタンス
d1 = Dice_class()

#データの入力
list_data = list(map(int,input().split()))
 
#set_num関数の呼び出し
d1.set_num(list_data)

#list_daice内の値を変更内容を表示
print(d1.list_dice)

 

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")

 

これでプログラム入門編は完了しました。

Completed

 

 

 

 

 

 

 

/* -----codeの行番号----- */