Posted 2010-05-30 21:51:43 GMT
今日は、P09です。
P09 (**) Pack consecutive duplicates of list elements into sublists.
If a list contains repeated elements they should be placed in separate sublists. Example:
?- pack([a,a,a,a,b,c,c,a,a,d,e,e,e,e],X).
X = [[a,a,a,a],[b],[c,c],[a,a],[d],[e,e,e,e]]
難易度★★
同じ要素が続く場合は、リストに括れというお題です。
散々考えたのですが、少しも分からなかったので、答えを暗記
transfer(X,[],[],[X]).
transfer(X,[Y|Ys],[Y|Ys],[X]) :- X \= Y.
transfer(X,[X|Xs],Ys,[X|Zs]) :- transfer(X,Xs,Ys,Zs). pack([],[]).
pack([X|Xs],[Z|Zs]) :- transfer(X,Xs,Ys,Z), pack(Ys,Zs).
うーん、transferという発想がでてくるようになるまでには、かなり長い道程な気がしています。
transferの動作は、
?- transfer(1,[1,1,1,1,2,3,4],X,Y).
X = [2, 3, 4],
Y = [1, 1, 1, 1, 1] ;
false.
というところ
今現在の自分のtransferの解釈を書いてみたいと思いますが、
transfer(A,B,C,D).
で、AとBは、入力側でAは先頭要素、Bは残りのリスト。
CとDは回答側で先頭以外のリスト、Dは同じ要素を集めておくところ、なのかなと思っています。
引数が4つ必要な理由がまだ納得できていないのですが、
3つだと、
tran(X,[],[X]).
tran(X,[Y|_],[X]) :- X \= Y.
tran(X,[Y|Xs],[X|Zs]) :- tran(X,Xs,Zs). ?- tran(1,[1,1,1,1,2,3,4],X).
X = [1, 1, 1, 1, 1]
のようになるので4つ必要なのでしょう…。
■
HTML generated by 3bmd in LispWorks 7.0.0