#:g1: [P-99]P09

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

comments powered by Disqus