1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?