LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-23

問題はこちら->https://qiita.com/Nabetani/items/ebd8a56b41711ba459f9

g/3で新しいカウントを求めそれをltos/3で文字列にしてつなげているだけです。
Prolog向きかと思って解いてみましたが、どの言語でも容易に書けるのかな。

%swi-prolog version 7.4.2
%start.
%:-initialization(start).    %ideone

g(o,[_,_,O],L):-O=:=3->L=[0,0,0];L=[0,0,O].
g(s,[S,B,O],L):-S1 is S+1,(S1=:=3->(O1 is O+1,g(o,[0,0,O1],L));L=[S1,B,O]).
g(b,[S,B,O],L):-B1 is B+1,(B1=:=4->L=[0,0,O];L=[S,B1,O]).
g(h,[_,_,O],[0,0,O]).
g(p,[_,_,O],L):-O1 is O+1,g(o,[0,0,O1],L).
g(f,[S,B,O],[Y,B,O]):-S=2->Y=S;Y is S+1.

ltos(SR,L,S):-
     maplist(number_chars,L,[[X],[Y],[Z]]),atom_string([X,Y,Z],S1),
     (SR==""->S=S1;concat_atom([SR,S1],",",S)).

solve([],_,S,S).
solve([H|T],L,SR,R):-
     g(H,L,L1),L1=[St,B,O],ltos(SR,[O,St,B],S),solve(T,L1,S,R).

start:-str(S),split_string(S,"\n","",L),maplist(split,L,L1),go(L1),!.

split(S,L):-split_string(S,"\s","\s",L).

go([]).
go([[A,_,Q]|T]):-atom_chars(A,SL),solve(SL,[0,0,0],"",S),disp(S,Q),go(T).

disp(S,Q):-
     atom_string(S,S1),
     (Q==S1->Str=" pass ";Str=" fail  "),write(Str),writeln(S1-Q).

str("s -> 010
sss -> 010,020,100
bbbb -> 001,002,003,000
ssbbbb -> 010,020,021,022,023,000
hsbhfhbh -> 000,010,011,000,010,000,001,000
psbpfpbp -> 100,110,111,200,210,000,001,100
ppp -> 100,200,000
ffffs -> 010,020,020,020,100
ssspfffs -> 010,020,100,200,210,220,220,000
bbbsfbppp -> 001,002,003,013,023,000,100,200,000
sssbbbbsbhsbppp -> 010,020,100,101,102,103,100,110,111,100,110,111,200,000,100
ssffpffssp -> 010,020,020,020,100,110,120,200,210,000").

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