Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-05-27

DylanでL-99 (P08 連続して現われる要素を圧縮)

| 14:29 | DylanでL-99 (P08 連続して現われる要素を圧縮) - わだばLisperになる を含むブックマーク はてなブックマーク - DylanでL-99 (P08 連続して現われる要素を圧縮) - わだばLisperになる

Dylanにはdequeというコレクションクラスがあり、前後どちらの方向からも追加できるので、それを使って、蓄積して、最後に型変換してみました。

#(a:, a:, a:, a:, b:, c:, a:, a:, d:, e:, e:, e:, e:).compress
//==> #(#"a", #"b", #"c", #"a", #"d", #"e")

#[a:, a:, a:, a:, b:, c:, a:, a:, d:, e:, e:, e:, e:].compress
//==> #[#"a", #"b", #"c", #"a", #"d", #"e"]

"aaaabcaadeeee".compress
//==> "abcade"

// Code
module: l99-08

define generic compress 
    (sequence :: <sequence>)
 => (result :: <sequence>);

define method compress 
    (sequence :: <sequence>)
 => (result :: <sequence>)
  let result = make(<deque>);
  for (elt in sequence)
    if (result.empty? | elt ~= result.last)
      push-last(result, elt)
    end if
  finally
    as(select (sequence by instance?)
         <list> => <list>;
         <string> => <string>;
         <vector> => <vector>;
       end select, result)
  end for
end method compress;

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20080527