LoginSignup
1
1

More than 3 years have passed since last update.

pythonでサイコロをコロコロするアイディア

Last updated at Posted at 2019-09-03

最近競技プログラミングにはまっています。

有名ですが、サイコロは結構おしゃれなつくりをしていて、対面の数字を足すと7になります。
きっと何かそれを使ったおしゃれな解き方をする問題にいずれ出会うのでしょうか?

余談でした。

で、本題です。
サイコロを振るという話ではなく、6面体をころころと転がすような処理の話です。

といっても、転がり方については、
右回転を3回繰り返せば、左回転1回と同義なので、
実は3パターンで網羅可能。

そのパターンの1つが下みたいな感じ

    # サイコロのそれぞれの面を配列で保持してみるアイディア
    now_pos = [1,6,2,5,4,3]
    # サイコロを開くとこんな感じ
    #    1
    # 4  2  3  5
    #    6

    # 1,6を軸に4,2,3,5を4→2の向きで回転するとき
    #    1           →     1
    # 4  2  3  5     →  5  4  2  3
    #    6           →     6
    for p in now_pos:
        if p == 4:
            new_pos.append(2)
        elif p == 2:
            new_pos.append(3)
        elif p == 3:
            new_pos.append(5)
        elif p == 5:
            new_pos.append(4)
        else:
            new_pos.append(p)

あと2パターンかいてあげれば、サイコロを転がす処理は網羅可能なはず。

なんとなく、3×2=6で、[boolean,boolean,boolean]を使えば、
かっこよく処理できる気もしたのですが、
やりたいことの可愛さに対して、考えるのに時間がかかりそうなのでやめました。

なにかいい案や、「普通はこうやるんだぜ」なものがあれば、教えてください。5万点さしあげます。

shiracamusさんからコメントいただいた内容をもとに考えてみました!
こっちのほうがおしゃれですね!
これをベースに考えてみるとより良いかもしれないです!

    now_pos = [1,6,2,5,4,3]

    # [4,2,3,5]
    targets = [now_pos[4],now_pos[2],now_pos[5],now_pos[3] ]
    new_pos = []
    # 一つずらすパターン
    for i in range(len(targets)):
        new_pos.append(targets[(i+1) % len(targets)])

    # 動かない値を戻す。
    new_pos.insert(now_pos[0],0)
    new_pos.insert(now_pos[1],1)

競プロ関連のことってどの程度記事とかにしていいんでしょうかね。
塩梅がわからないので、こんなに書いちゃダメだよ!であればご指摘ください。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1