問題はこちら
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"
の順番です。