今回も同じ出題者のどう書くとCodeIQの似た問題です。
まずどう書くの「さいころを転がす」です。
問題はこちら->http://nabetani.sakura.ne.jp/hena/ord12rotdice/
想定解は論理的に解く方法かもしれませんが、prologらしいパターンマッチで解いてみました。
底面は無視して[[,北側面,],[西側面,上面,東側面],[,南側面,]]のリストを作り、
回転による変化をシュミレートします。
%SWI-Prolog version 7.4.2
%start.
%:- initialization(start). %ideone
move('E',[[_,A,_],[B,C,_],[_,E,_]],[[_,A,_],[F,B,C],[_,E,_]],B):-F is 7-C.
move('S',[[_,A,_],[B,C,D],[_,_,_]],[[_,F,_],[B,A,D],[_,C,_]],A):-F is 7-C.
move('W',[[_,A,_],[_,C,D],[_,E,_]],[[_,A,_],[C,D,F],[_,E,_]],D):-F is 7-C.
move('N',[[_,_,_],[B,C,D],[_,E,_]],[[_,C,_],[B,E,D],[_,F,_]],E):-F is 7-C.
solve([X],L,[C,1]):-move(X,[[_,2,_],[3,1,4],[_,5,_]],L,C).
solve([H|T],L,R):-solve(T,L1,R1),move(H,L1,L,Y),R=[Y|R1].
start:-str(S),split_string(S,"\s\n","\s",L),pre(L).
pre([]).
pre([_,B,Q|T]):-
atom_chars(B,L),reverse(L,L1),solve(L1,_,R2),reverse(R2,R1),
atomics_to_string(R1,R),disp(R,Q),pre(T).
disp(R,A):-(A==R->Str=" pass ";Str=" fail "),write(Str),writeln(R).
str("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").
次にCodeIQの「カラフルな八面体を転がそう」です。
問題はこちら->http://nabetani.sakura.ne.jp/codeiq/octaheroll/octahedron.html
テストケース->http://nabetani.sakura.ne.jp/codeiq/octaheroll/
同様な方法で解きました。
中央のリストの中央の要素が上面です。上面と底面は同じ色なので底面は省きました。
模型を作らずに頭の中で位置の変化を考えましたので結構苦労しました。
これも課題データの答えがありませんが、サンプルのデータが結構ありますので
だいしょうぶでしょう。
%SWI-Prolog version 7.4.2
%start.
%:- initialization(start). %ideone
move('2',[[A,B,C],[_,D,_],[C,B,A]],[[A,B,D],[_,C,_],[D,B,A]]).
move('T',[[A,B,C],[_,D,_],[C,B,A]],[[D,B,C],[_,A,_],[C,B,D]]).
move('6',[[A,B,C],[_,D,_],[C,B,A]],[[A,D,C],[_,B,_],[C,D,A]]).
move('8',F,T):-move('2',T,F).
move('4',F,T):-move('T',T,F).
move('D',F,T):-move('6',T,F).
solve(L,R):-reverse(L,L1),solve(L1,_,R1),reverse(R1,R),!.
solve([],[['B','R','G'],[_,'Y',_],['G','R','B']],['Y']).
solve([H|T],L,R):-solve(T,L1,R1),move(H,L1,L),L=[_,[_,Y,_],_],R=[Y|R1].
start:-str1(S1),split_string(S1,"\s\n","\s",L),str2(S2),
split_string(S2,"\s\n","\s",L1),pre(L,L1),!.
pre([],_):-!.
pre([B|T],[A|AT]):-
atom_chars(B,L),solve(L,R),disp(R,A),pre(T,AT).
disp(R,A):-
atomics_to_string(R,"",S),(A=="?"->writeln(S);
((S==A->Str=" pass ";Str=" fail "),write(Str),writeln(S))).
str1("6
2
T
6D
2D
24
T4
68
T8
686
T86
246
T82
TD6
682
282D
2468
T428
TD64
T8T8
286D2
2DT82
TDT42
68642
68T46D
T46824
2D2828
24T46D2
682D242
28T464T8
T42DTD28T
TDT4T86D2D
2D686D682D2
64682868T824
T8246D6828282
68682D642D64TD
T46868T42D282D2
TD282428T82428T4
2DTDT8T4T42428TD6
64TDT4TD64242D682D
T8T8T8T42DT46D2D282
2D2D6D2424TD2D68646D
6DT828TD242D282DT468T
6D286468TD2D2D2DT4T4T4
6D64TDT46D686828T824TD6
242DT4686D6828T424T86824
2D6DT4646DT4TDTD28T428682
TDT4T42D6DT4T8T4T464TDT8TD
6468TD2D242DT4246D6D286868T
T464TD68T428286424TD2D2D2428
68TDTD2464642DTD686468T42464TD2D2464686868T8T82D242468T8TD2D2D242DTDT8TD2DTD28T8").
str2("YR
YG
YB
YRY
YGR
YGB
YBY
YRG
YBG
YRGY
YBGR
YGBR
YBGB
YBRB
YRGR
YGYGR
YGBRY
YBYGY
YBRBY
YBGYB
YGYRYG
YGRBYB
YBRYRG
YRGYBR
YRGBGYG
YBYRGRB
YGRYRYR
YGBGBRBY
YRGRYGBY
YGYBYRBRG
YBYGRBGYGR
YBRYRYGBGYB
YGRGYRYRGRYG
YRBYGYGBYRBRY
YBGBYRYRGRGRGR
YRGYRYGYBRGRYRG
YBYRGYRBRYGRGRYG
YBRGRGYRYGRGYRYGY
YGRBGRYGYGYRGYGRBR
YRBRYBYBRBYGBYRYBYR
YBGYBGYBYGRBRGRYGRGR
YGRYGYGRBGRGYBGBYGRYR
YRYBGBGYRBGRYGYGRBRGYB
YRYGYRBYGRBYRBYRBGBGBGB
YRYRBRYBYRYRGYRYRBYBRBGB
YGBYRGRYBRBRYRYGYRGRYBRBG
YGRGRBRGBRBGBGRBGYGRGYGBYB
YBRYRYRGBGBYBYRBRBRGBGRBYRG
YRBYGRBYRBGRYBYGBRBRBYBRYBRG
YBYRBRYRGBGRGRGYBRYRGBRGBRYBY
?").