このディレクトリの索引

#  

Best Cow Line(POJ3617)

# # N文字の文字列Sが与えられ、N文字の文字列Tを作ります。 # はじめはTは長さ0の文字列で、次のいずれかの操作が行えます。 # ・Sの先頭を一文字削除し、Tの末尾に追加する # ・Sの末尾を一文字削除し、Tの末尾に追加する # 辞書順比較でできるだけ小さくなるようにTを作ってください。 # # 制約 # ・1 =< N =< 2000 # ・文字列Sに含まれるのはローマ字の大文字のみ # 'N文字の文字列Sが与えられ、N文字の文字列Tを作ります。はじめはTは長さ0の文字列で、次のいずれかの操作が行えます。・Sの先頭を一文字削除し、Tの末尾に追加する ・Sの末尾を一文字削除し、Tの末尾に追加する 辞書順比較でできるだけ小さくなるようにTを作る'(S,T) :- poj3617(S,T). poj3617(S,T) :- 'Sを文字リストL1に変換'(S,L1), 'リストL1を反転して後ろから見たリストL2を作る'(L1,L2), 'L1,L2から辞書順リストL3を生成'(L1,L2,L3), '文字リストL3からTを生成'(T,L3). 'Sを文字リストL1に変換'(S,L1) :- atom_chars(S,L1). 'リストL1を反転して後ろから見たリストL2を作る'(L1,L2) :- reverse(L1,L2). 'L1,L2から辞書順リストL3を生成'([],[],[]). 'L1,L2から辞書順リストL3を生成'([A|R1],[B|R2],[A|R3]) :- [A|R1] @=< [B|R2], リストの最終要素を削除([B|R2],R22), 'L1,L2から辞書順リストL3を生成'(R1,R22,R3). 'L1,L2から辞書順リストL3を生成'([A|R1],[B|R2],[B|R3]) :- [A|R1] @> [B|R2], リストの最終要素を削除([A|R1],R11), 'L1,L2から辞書順リストL3を生成'(R11,R2,R3). リストの最終要素を削除(A,B) :- append(B,[_],A). '文字リストL3からTを生成'(T,L3) :- atom_chars(T,L3). %

問題点 ・・・ Sから最初空のTに段々文字を移していく雰囲気が全くない。 % さらに言うと、長い問題文をそのまま順にPrologコードに落としていく % 雰囲気もない。最低のコードだ。