問題はこちら->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").