LoginSignup
1
0

More than 5 years have passed since last update.

dice.rb

Last updated at Posted at 2013-07-06

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord12rotdice/

S = "SNWE"

def solve(q)
  dice = [2,1,3]
  [dice[1]] + q.chars.map{|c|
    i, j = S.index(c)/2, S.index(c)%2
    dice[i], dice[i+1] = dice[i+1], dice[i]
    dice[i+j] = 7 - dice[i+j]
    dice[1]
  }
end

DATA.readlines.each do |line|
  no,q,a = line.split
  ans = solve(q).join.to_s
  print no + "\t" + ans
  puts ans == a ? ' o' : ' x'
end
__END__
0   NNESWWS     15635624
1   EEEE    13641
2   WWWW    14631
3   SSSS    12651
4   NNNN    15621
5   EENN    13651
6   WWNN    14651
7   SSNN    12621
8   NENNN   153641
9   NWNNN   154631
10  SWWWSNEEEN  12453635421
11  SENWSWSNSWE     123123656545
12  SSSWNNNE    126546315
13  SWNWSSSWWE  12415423646
14  ENNWWS  1354135
15  ESWNNW  1321365
16  NWSSE   154135
17  SWNWEWSEEN  12415154135
18  EWNWEEEEWN  13154532426
19  WNEWEWWWSNW     145151562421
20  NNEE    15631
21  EEEEWNWSW   1364145642
22  SENNWWES    123142321
23  SWWWSNSNESWW    1245363635631
24  WESSENSE    141263231
25  SWNSSESESSS     124146231562
26  ENS     1353
27  WNN     1453
28  SSEENEEEN   1263124536
29  NWSNNNW     15414632
30  ESSSSSWW    132453215
31  ESE     1326
32  SNWNWWNSSSS     121456232453
33  SWEESEN     12423653
34  NEEWNSSWWW  15323631562
35  WSEW    14212
36  SWSNNNSNWE  12464131353
37  ENWEWSEEW   1351513545
38  WSEWN   142124
39  EWNEESEWE   1315321414
40  NESEEN  1531263
41  WSW     1426
42  ENEWE   135656

解説

・サイコロの状態の持ち方について
 サイコロは6面ありますが、3面の位置関係がわかっていれば残りの面の位置はわかるので、dice=[2,1,3]でサイコロの初期状態をもたせます。順番は[x軸,z軸,y軸]の順です。

・転がしたときの状態の変化について
 北または南に転がすと、必ずx軸とz軸の面が入れ替わり、東または西に転がすと必ずz軸とy軸の面が入れ替わります。ここで状態を[x軸,z軸,y軸]の順で持っていると南北は第1要素と第2要素、東西は第2要素と第3要素を入れ替えればいいので、S = "SNWE"という文字列を作れば、S.index(c)/2で入れ替える場所が判断できます。cは東西南北のE,W,S,Nのいずれかです。
 さらに、要素を入れ替えのみでは十分ではなく、各軸の軸方向にどちらの面(1or6, 2or5, 3or4)が来るか考える必要があります。ここで、要素入れ替え後、南に転がしたときはx軸の面、北に転がしたときはz軸の面、西に転がしたときはz軸の面、東に転がしたときはy軸の面の裏表が必ず入れ替わるという法則に気がつけば、S.index(c)/2+S.index(c)%2で入替える要素を指定できます。コード中ではi=S.index(c)/2で置き換えてます。面の裏表の入替え自体は7から今の面の数を引けば、1なら6、2なら5、3なら…と求まります。

個人的にこのコードのポイントと思うところは[x軸,z軸,y軸]の順番と文字列"SNWE"の順番です。

1
0
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
0