オフラインどう書く第18回参考問題解答


同じ出題者の第17回問題
　問題はこちら->http://nabetani.sakura.ne.jp/hena/ord17foldcut/
　私の解答はこちら->https://qiita.com/smallbigcats/items/79e3b7e94f56c4076371
の類題です。

問題はこちら->http://nabetani.sakura.ne.jp/hena/ord18mafovafo/　

折る手順に従って考えるのと折り終わりから逆方向に考えるのと二通りの解き方をしました。
順方向
最初の左端の位置を追跡し、左右どちらにあるか（左を0右を1とする）と折り方で、
展開後(=最初）の左端付近の折り目の状態が決まります。
後は既存の折り目の間に、順に一定のパターンで折り目が付いてゆきます。
　最初の左端の折った後の位置(x)
　　　U->反対側に移動
　　　Z,S,J->左側
　　　L->右側
　折り目
　　　 U-> 
　　　　　xが右側（左）にあれば左端付近に[m,m]（[V,V]）の折り目が新しくできる。
　　　　　その後は右に向かって既存の折り目の間に、[m,m]->[V,V]->[m,m]..のように
　　　　　左側と逆向きの折り目が二つづつできる。
　　　 Z,S->　　　　　　　　　　　　　　
　　　　　Z(S)なら左端付近に[m,V]（[V,m]）の新しい折り目ができ、
　　　　　既存の折り目の間にも同じパターンの折り目ができる。
　　　 L,J->
　　　　　xが右側(左)なら左端付近に[m]（[V]）ができ既存の折り目の間に
　　　　　[m]->[V]->[m]..のように左側と逆向きの折り目ができる

fold0/5でそれぞれの折り方による新しい折り目を求めています。
Xは元のxを、Yは新しいxを示します。
fold2/4とfold3/4で元の折り目の間に新しい折り目を入れてつないでいます。
fold2がZ,Sに対応、fold3がU,L,Jに対応しています。
fold/3のpat/2で折り目の向きを逆にしています。

```Prolog
%SWI-Prolog 7.4.2,7.6.4   
% :-initialization(start).  %ideone
%start.
     
pt([m,m],['V','V']).
pt([m],['V']).

fold([],_,R,R):-!.
fold([H|T],X,L,R):-fold0(H,X,L,Y,L1),fold(T,Y,L1,R).

fold0('U',X,L,Y,R):-Y is 1-X,(X=:=1->A=[m,m];A=['V','V']),!,fold3(A,L,[],R).    
fold0(S,X,L,X,R):-(S=='Z'->A=[m,'V'];S=='S'->A=['V',m]),!,fold2(A,L,[],R).
fold0(S,X,L,Y,R):-(S=='L'->Y=1;Y=0),(X=:=1->A=[m];A=['V']),fold3(A,L,[],R).   

fold2(X,[],L,R):-append(L,X,R).
fold2(X,[H|T],L,R):-append(X,[H],Y),append(L,Y,L1),fold2(X,T,L1,R).

fold3(X,[],L,R):-append(L,X,R).
fold3(X,[H|T],L,R):-append(X,[H],Y),append(L,Y,L1),(pt(X,X1);pt(X1,X)),fold3(X1,T,L1,R).

solve(L,R):-fold(L,0,[],R1),atomics_to_string(R1,R).

start:-str(S),split_string(S,"\s\n","\s",L),pre(L),!.

pre([]).
pre([_,B,C|T]):-atom_chars(B,L),solve(L,R),disp(R,C),pre(T).

disp(R,C):-(R==C->Str=" yes ";Str=" no  "),write(Str),writeln(R).

str("0  JZ      mVVmV
1       J       V
2       L       V
3       Z       mV
4       U       VV
5       S       Vm
6       JL      VVm
7       JS      VmVVm
8       JU      VVVmm
9       LU      mmVVV
10      SL      VVmmV
11      SS      VmVVmmVm
12      SU      VVVmmmVV
13      SZ      mVVmVmmV
14      UL      mVVVm
15      UU      mmVVVVmm
16      UZ      mVVmVVmV
17      ZJ      VmmVV
18      ZS      VmmVmVVm
19      ZZ      mVmmVVmV
20      JJJ     VVmVVmm
21      JJZ     mVVmVVmVmmV
22      JSJ     VVmmVVmVVmm
23      JSS     VmVVmmVmVVmVVmmVm
24      JUS     VmVVmVVmVVmmVmmVm
25      JUU     mmVVVVmmVVVmmmmVV
26      JUZ     mVVmVVmVVmVmmVmmV
27      LJJ     VmmVVVm
28      LLS     VmmVmVVmVVm
29      LLU     mmmVVVmmVVV
30      LLZ     mVmmVVmVVmV
31      LSU     mmVVVmmmVVVVmmmVV
32      LSZ     mVVmVmmVVmVVmVmmV
33      LZL     mmVVmVVmmVV
34      LZS     VmmVmVVmVVmmVmVVm
35      LZU     mmmVVVmmVVVmmmVVV
36      SJL     VVmVVmmmVVm
37      SLU     mmVVVVmmmVVmmmVVV
38      SLZ     mVVmVVmVmmVmmVVmV
39      SSU     VVVmmmVVVmmVVVmmmmVVVmmmVV
40      SUJ     mVVVmVVmmmVmmVVVm
41      SUS     VmVVmVVmVVmmVmmVmmVmVVmVVm
42      SZZ     mVmmVVmVVmVmmVVmVmmVmmVVmV
43      UJJ     VmmVVVmVVmm
44      ULU     mmmVVVmmVVVVmmmVV
45      ULZ     mVmmVVmVVmVVmVmmV
46      UUU     VVmmmmVVVmmVVVVmmVVVmmmmVV
47      ZJU     VVVmmmVVmmmVVVVmm
48      ZLS     VmVVmmVmmVmVVmVVm
49      ZSJ     VVmmVmmVVmmVVVmmV
50      ZUJ     mVVVmmVmmmVVmVVVm
51      JJLJ    mVVVmmVVmVVmmmV
52      JLJJ    VmmVVVmVVmmmVVm
53      JLJL    VmmVVVmVVmmmVVm
54      LJJL    VVmmVmmVVVmVVmm
55      LLJJ    VmmmVVmVVmmVVVm
56      SZUS    VmVVmVVmmVmmVmmVmVVmVVmVVmVVmmVmmVmmVmVVmVVmVVmmVmmVmmVmVVmVVmmVmmVmmVmVVmVVmVVm
57      ULLS    VmmVmmVmVVmVVmmVmVVmVVmVVmmVmmVmVVm
58      JJJJZJ  VmmVVVmmVVmVVmmVVmmmVVmVVmmVVVmmVVmmVmmVVmmmVVmVVmmVVVmmVVmVVmmVVmmmVVmmVmmVVVmmVVmmVmmVVmmmVVm
59      JULLLJ  mmVmmVVmmmVVmVVVmmVmmVVVmmVVmVVVmmVmmVVmmmVVmVVVmmVmmVVVmmVVmVVmmmVmmVVmmmVVmVVmmmVmmVVVmmVVmVV
60      LJJJUL  mVVVmVVmmmVVmVVVmmVmmmVmmVVVmVVmmmVmmVVVmmVmmmVVmVVVmVVmmmVVmVVVmmVmmmVVmVVVmVVmmmVmmVVVmmVmmmV
61      LJSJJL  VVmVVmmVVVmmVmmmVVmVVmmmVVmmVmmVVVmVVmmmVVmmVmmVVVmVVmmVVVmmVmmmVVmVVmmVVVmmVmmVVVmVVmmmVVmmVmm
62      LZLLLJ  mmVmmVVmmmVVmVVmmmVmmVVVmmVVmVVVmmVmmVVmmmVVmVVVmmVmmVVVmmVVmVVmmmVmmVVmmmVVmVVVmmVmmVVVmmVVmVV
63      SJJJJL  VVmVVmmVVVmmVmmVVVmVVmmmVVmmVmmVVVmVVmmVVVmmVmmmVVmVVmmmVVmmVmmmVVmVVmmVVVmmVmmVVVmVVmmmVVmmVmm
64      ZLJLJL  VmmVVVmmVmmmVVmVVmmVVVmVVmmmVVmmVmmVVVmmVmmmVVmmVmmVVVmVVmmmVVmVVmmVVVmmVmmmVVmVVmmVVVmVVmmmVVm").
```

逆向き
ある程度展開したところから更に展開したら、折り重なったそれぞれの部分が
　A:表面に見えた折り目と山・谷、左・右とも逆（反転）
　B:表面に見えた折り目と同じ　　　　　
になるとすると
左端と右端の折り目の変化も考えて左からたどると、　
　L->A：谷：B
　J->B：谷：A
　Z->B：山：A：谷：B
　S->B：谷：A：山：B
　U->A：谷：B：谷：A
となります。　
expa/3で展開した部分を上の規則に沿って左からつないでいます。
rev/2では折り目を反転させます。
foldlは畳み込みを行う組み込みの術語です。

```Prolog

%:-initialization(start).  %ideone
%start.
     
cha(X,Y):-X==m->Y='V';Y=m.

rev(L,L2):-maplist(cha,L,L1),reverse(L1,L2).

expa('L',L,R):-rev(L,L2),append(L2,['V'|L],R).
expa('J',L,R):-rev(L,L2),append(L,['V'|L2],R).
expa('Z',L,R):-rev(L,L2),append(L,[m|L2],R1),append(R1,['V'|L],R).
expa('S',L,R):-rev(L,L2),append(L,['V'|L2],R1),append(R1,[m|L],R).
expa('U',L,R):-rev(L,L2),append(L2,['V'|L],R1),append(R1,['V'|L2],R).

solve(L,R):-foldl(expa,L,[],R1),atomics_to_string(R1,R).  %kumikomi no foldl

start:-str(S),split_string(S,"\s\n","\s",L),pre(L),!.

pre([]).
pre([_,B,C|T]):-atom_chars(B,L),reverse(L,L1),solve(L1,R),disp(R,C),pre(T).

disp(R,C):-(R==C->Str=" yes ";Str=" no  "),write(Str),writeln(R).

```
同じ出題者のCodeIQ:55「外周の折り目」という類題があります。
問題と解答例はこちら
　https://sw-logic.com/Portfolio/Programing/CodeIQ/3064.php
テストケースが少ないので、私は挑戦しませんでしたが、
興味がおありの方は挑戦されてはいかがでしょうか。