in reply to 99 Problems in Perl6
How embarrassing. My first version of problem 9 (packing lists into sublists) had a bug. Here's a cleaner version which actually works. I know the bug in problem 9. Can you spot it?
sub pack (@array) returns Array { my @unpacked = @array; my (@list, @packed); while @unpacked { @list.push(@unpacked.shift) while !@list || @list[0] eq @unpac +ked[0]; @packed.push([@list]); @list = (); } return @packed; } pack(<a a a a b c c a a d e e e e>).perl.say;
And for the Lisp weenies who claim Lisp is so much better, here's one way to do it in Lisp (can you make it shorter?):
(defun pack (lista) (if (eql lista nil) nil (cons (pega lista) (pack (tira lista))) ) ) (defun pega (lista) (cond ((eql lista nil) nil) ((eql (cdr lista) nil) lista) ((equal (car lista) (cadr lista)) (cons (car lista) (pega (cdr lista)))) (t (list (car lista))) ) ) (defun tira (lista) (cond ((eql lista nil) nil) ((eql (cdr lista) nil) nil) ((equal (car lista) (cadr lista)) (tira (cdr lista))) (t (cdr lista)) ) )
But the Prolog folks still have a neat solution:
pack([],[]). pack([X|Xs],[Z|Zs]) :- transfer(X,Xs,Ys,Z), pack(Ys,Zs). transfer(X,[],[],[X]). transfer(X,[Y|Ys],[Y|Ys],[X]) :- X \= Y. transfer(X,[X|Xs],Ys,[X|Zs]) :- transfer(X,Xs,Ys,Zs).
And Haskell still makes us all look like chumps:
group (x:xs) = let (first,rest) = span (==x) xs in (x:first) : group rest group [] = []
Cheers,
Ovid
New address of my CGI Course.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: 99 Problems in Perl6 (Lisp, Prolog, Haskell)
by TimToady (Parson) on Dec 15, 2006 at 23:02 UTC | |
by Ovid (Cardinal) on Dec 15, 2006 at 23:12 UTC | |
by TimToady (Parson) on Dec 15, 2006 at 23:39 UTC | |
|
Re^2: 99 Problems in Perl6 (Lisp, Prolog, Haskell)
by Anonymous Monk on Jun 30, 2009 at 18:26 UTC |