LoginSignup
0
0

More than 5 years have passed since last update.

オフラインどう書く過去問(第12回)、CodeIQカラフルな八面体を転がそう

Last updated at Posted at 2019-01-20

今回も同じ出題者のどう書くと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
?").
0
0
0

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