オフラインリアルタイムどう書くE12の解答

問題はこちら->http://mtsmfm.github.io/2017/03/04/doukaku-e12.html


P/2のリストの括弧内の数字は、テトロミノの最上部からその列のブロックの上端と下端までの距離。
基本的には計算の問題です。
落とすテトロミノと積まれているテトロミノが接する条件を求める必要があります。
積まれているテトロミノの高さと落とすテトロミノの下端の値を足して
最大になる列で接します。(che/5)。
その最大値から落とすテトロミノの各列の上端の値を引くと各列の高さがでますので、
それを初期値が空の新しいリストに追加していきます。
ただしテトロミノが落ちる列より前は、既存の列の場合は元のリストの値、新しい列は0を
新しいリストに追加します。
最後に新しいリストをreverseして元のリストの残りの部分とappendでつなぎます。(cal/6)

```Prolog
%SWI-Prolog version 7.4.2,7.6.4
%start.
%:-initialization(start).  %ideone

p('I',[(0,4)]).
p('L',[(0,3),(2,3)]).
p('O',[(0,2),(0,2)]).
p('S',[(1,2),(0,2),(0,1)]).
p('T',[(0,1),(0,2),(0,1)]).

che(_,MV,_,[],MV).
che(_,MV,[],[(_,H1)|T1],R):-(H1>MV->MV1=H1;MV1=MV),che(_,MV1,[],T1,R).  %新しい列
che(0,MV,[H|T],[(_,H1)|T1],R):-N is H+H1,(N>MV->MV1=N;MV1=MV),che(0,MV1,T,T1,R).
che(X,MV,[_|T],PL,R):-X1 is X-1,che(X1,MV,T,PL,R).   %テトロミノが落ちる列より前

cal(_,_,L,[],R1,R):-reverse(R1,R2),append(R2,L,R).
cal(0,MV,[],[(H1,_)|T1],R1,R):-N is MV-H1,cal(0,MV,[],T1,[N|R1],R).   %新しい列
cal(0,MV,[_|T],[(H1,_)|T1],R1,R):-N is MV-H1,cal(0,MV,T,T1,[N|R1],R).
cal(X,MV,[],PL,R1,R):-X1 is X-1,cal(X1,MV,[],PL,[0|R1],R).   %新しい列でテトロミノが落ちる列より前。 
cal(X,MV,[H|T],PL,R1,R):-X1 is X-1,cal(X1,MV,T,PL,[H|R1],R). %テトロミノが落ちる列より前。

pos(L,M,PL,R):-che(M,0,L,PL,MV),cal(M,MV,L,PL,[],R).

solve([],L,L):-!.
solve([H1,H2|T],L,R):-p(H2,PL),pos(L,H1,PL,L1),solve(T,L1,R).

disp(M,N):-atom_number(N,N1),(M==N1->Str=" pass ";Str=" no  "),write(Str),writeln(M).

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

sp([],_,L,L).
sp([H|T],LN1,L1,R):-atom_codes(H,[HN]),
     (HN>57->(number_codes(N,LN1),append(L1,[N],L2),append(L2,[H],L),LN=[]);
     (append(LN1,[HN],LN),L=L1)),sp(T,LN,L,R).

pre([]).
pre([_,B,N|T]):-
    atom_chars(B,L),sp(L,[],[],L1),solve(L1,[],R),max_list(R,M),disp(M,N),pre(T).

str("0       1O3L0I0T        5
1       0I      4
2       0I0I    8
3       0I1I2I3I4I      4
4       0S0I    5
5       0I0S    6
6       2S0T2O3I        8
7       4O4T1T0S4L1L3L  10
8       0S2S4S6S8S10S12S14S     16
9       14S12S10S8S6S4S2S0S     2
10      5I2O10I0O4L10T9T11L8I2I10I12O7L12T12T12S11T9O10O13I12O10O7I9I7O0S1O2S0L1L       23
11      9T14L10L8T4I1T3S5I8T12O3S7L9O7L14T2I7O3S6S2L0L13T10O4I9T7L8S0I12O9S11L11T14T    27
12      9S9S7O11O16I2T9O12L10T9O0O13I9O1I2T14S7O9S11T5L7I14T13O0T12I3S10L10O7I15I6S2L12S8I16I3L 23
13      11T13I16S15T7O10L12S1I5I8S5I13I15O8S9I1T12I1S5S0L14I12L16T2S2S8L2S14L16O4I13L15L13S11S9T13S9S3L6O       22
14      12L10S7I5L14T12S9L1T14I0I5L1T2O18T9L0I15I16L10S1O15I0L17O5L18T4I18L7L7I13I3I12I2S3T5T3S16L14S14O11O15T14S       17
15      0S18S2S19I14T7L14L2L6I9I0L4I5L13L15I8S8T2I5I7O18T3S1T7I2L8O0S20T9I14T5L5I1T4L9O8T19T5S12O16T19L4O10O10T14L      24
16      7T5L6S4S8T6S10I19O20L14I18L21S7I11S11O1L13T20O9I7L2T8L2S20L3O14L9T17I8L8S14I6T2O11T21O18O6T15T1S3L6O19S18O20S19O16T6S14T        26
17      18S2I4S16L13S17I21O8I17T8I14O12T20I20S19S16S13T12T20I22I15O2I2I8I2S18I9I9T6O13O13L17I2L20L2L4I9I19O11T3S10O2S18T12I5O11S19O21S6I17T17S  26
18      11L5S0T22S18O13T2O22S15I12I21T16I3I1I22L11L11L22O13S24S15L13T15S19L10O15T7S24T19L0T13O11I12T13S4I24L15O3S19O10L19O0S20L7O11L21I22S18T19T23O8I22S24L0S   21
19      7L7I11T7S18O17L8S15L9I3O24S3O1O5O14L9T13S2O25S22T10T8L24S18S13T1O1L6I10I4S13O3S7L10T1T4L17S20I18O15S25S23S21I19T6O24S9L2O2O15L12L8L8O18I18L0T5O 31
20      999I999I999I999I999I999I999I999I999I999I999I    44").
```