경쟁 전문 라이브러리 구성 ~ 주사위 ~

ICPC 용 주사위 라이브러리를 만들었습니다. 프로덕션에서는 주사위가 나오지 않았기 때문에 미안하지만, 향후 나오는 분의 참고가 되면 기쁩니다. 회전 조작의 실장 등은 우시 씨의 도서관 를 참고로 하고 있습니다.
또한 각 면의 알파벳 및 회전의 함수는 자신의 알기 쉬운 이름으로 하고 있으므로, 사용할 때는 편리하게 재작성해 주세요.

주사위 그림



아래 그림에서 주사위 표면의 u는 up, d는 down, f는 front, b는 back, l은 left, r은 right를 나타냅니다. 즉 아래 그림에서 y축의 부의 방향이 전면을 나타내고, x축의 양의 방향이 우면을 나타냅니다. 다른 면에 대해서도 마찬가지로 영어에 대응합니다.



코드 설명



주사위를 놓을 때 반대쪽에는 오지 않는 2면을 지정하면 주사위를 놓는 방법은 고유하게 결정됩니다. 또한 주사위를 놓는 방법은 위의 면을 고정하고 나서 옆의 면의 경우 나누기를 생각하는 것으로 정해지므로, 모두 24가지 있습니다. 그 24가지를 모두 내보낸 것이 클래스 변수의 state가 됩니다. 즉, 초기화 시점에서 알고 있는 2면의 정보를 주는 것으로 초기화를 할 수 있습니다. 또, 초기화로 주어진 2면을 가지는 주사위가 존재하지 않을 때는 에러 출력을 하도록 하고 있습니다. 그리고 주사위의 초기 위치 좌표로 초기화해야 합니다.

초기화를 할 수 있으면, 나머지는 6 방향의 회전을 실장할 뿐입니다. 이 때, 각각의 Rotate 함수에는 대문자의 알파벳이 말미에 대해 있어 각각 회전 방향을 나타냅니다. 또한 y축의 정방향을 북(North), 부방향을 남쪽(South), x축의 정방향을 동(East), 부방향을 서(West)로 하고 있습니다. 그리고 좌표를 바꾸지 않는 회전 방향은 전면에서 보고 왼쪽 방향(Left), 오른쪽 방향(Right)으로 하고 있습니다. 이 함수 내에서는 주사위의 면을 바꾸는 것과 동시에, 좌표를 바꾸는 4 방향의 회전에 대해서는 좌표의 값도 갱신합니다.

코드



dice.py
# coding: UTF-8
import sys

class Dice:
    #サイコロの全状態(u,d,f,b,l,rの順)(u+d=f+b=l+r=7が成り立つ)
    state=[[1,6,2,5,4,3],[1,6,3,4,2,5],[1,6,4,3,5,2],[1,6,5,2,3,4],
           [2,5,1,6,3,4],[2,5,3,4,6,1],[2,5,4,3,1,6],[2,5,6,1,4,3],
           [3,4,1,6,5,2],[3,4,2,5,1,6],[3,4,5,2,6,1],[3,4,6,1,2,5],
           [4,3,1,6,2,5],[4,3,2,5,6,1],[4,3,5,2,1,6],[4,3,6,1,5,2],
           [5,2,1,6,4,3],[5,2,3,4,1,6],[5,2,4,3,6,1],[5,2,6,1,3,4],
           [6,1,2,5,3,4],[6,1,3,4,5,2],[6,1,4,3,2,5],[6,1,5,2,4,3]]

    #u,d,f,b,l,rをそれぞれ0,1,2,3,4,5としてstate1,state2に指定
    #value1,value2はそれぞれstate1,state2に対応する面の目
    #nowは初期位置の座標
    #適切でない場合はエラー出力
    def __init__(self,state1,value1,state2,value2,now):
        self.now=[now[0],now[1]]
        for i in range(24):
            if Dice.state[i][state1]==value1 and Dice.state[i][state2]==value2:
                self.u,self.d,self.f,self.b,self.l,self.r=Dice.state[i]
                break
        else:
            print('Error:Constructor\'s Argument is missing.',file=sys.stderr)
            exit()

    #上から見てy軸の+方向に回転(後面が下面に!)
    def RotateN(self):
        self.d,self.f,self.u,self.b=self.b,self.d,self.f,self.u
        self.now[1]+=1

    #上から見てy軸の-方向に回転(前面が下面に!)
    def RotateS(self):
        self.d,self.f,self.u,self.b=self.f,self.u,self.b,self.d
        self.now[1]-=1

    #上から見てx軸の+方向に回転(右面が下面に!)
    def RotateE(self):
        self.d,self.l,self.u,self.r=self.r,self.d,self.l,self.u
        self.now[0]+=1

    #上から見てx軸の-方向に回転(左面が下面に!)
    def RotateW(self):
        self.d,self.l,self.u,self.r=self.l,self.u,self.r,self.d
        self.now[0]-=1

    #前から見て左回転(反時計回り)
    def RotateL(self):
        self.f,self.l,self.b,self.r=self.r,self.f,self.l,self.b

    #前から見て右回転(時計回り)
    def RotateR(self):
        self.f,self.l,self.b,self.r=self.l,self.b,self.r,self.f

verify한 문제



AOJ Biased Dice
제출 → h tp : // Judge. 우아이즈. 아 c. jp / 온네 네쥬 드게 / 레즈 에에 w. jsp? 리 d=4985962

좋은 웹페이지 즐겨찾기