#:g1: dylanでL-99 (P11 ランレングス圧縮 その2)

Posted 2008-06-17 07:18:00 GMT

-(http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html)
CLのsubseqに相当するものがないか探したのですが見付からず。それらしきものの実装では、copy-sequenceして切り出していたので真似してみました。これで良いのでしょうか…。
また、良く考えると、文字列の圧縮表現は変かなあと思いはじめました(;´Д`)普通にリストにした方が良いかも。

format-out("%=\n",
           #(a:, a:, a:, a:, b:, c:, c:, a:, a:, d:, e:, e:, e:, e:).encode-modified);
//=> #(#(4, #"a"), #"b", #(2, #"c"), #(2, #"a"), #"d", #(4, #"e"))

format-out("%=\n", #[a:, a:, a:, a:, b:, c:, c:, a:, a:, d:, e:, e:, e:, e:].encode-modified); //=> #[#(4, #"a"), #"b", #(2, #"c"), #(2, #"a"), #"d", #(4, #"e")]

format-out("%=\n", "aaaabccaadeeee".encode-modified); //=> "4a;b;2c;2a;d;4e"

// Code: define generic single? (sequence :: <sequence>) => (result :: <boolean>);

define method single? (sequence :: <sequence>) => (result :: <boolean>) ~sequence.empty? & copy-sequence(sequence, start: 1).empty? end method single?;

define generic encode-modified (sequence :: <sequence>) => (result :: <sequence>);

define method encode-modified (sequence :: <list>) => (result :: <list>) as(<list>, next-method()) end method encode-modified;

define method encode-modified (sequence :: <vector>) => (result :: <vector>) as(<vector>, next-method()) end method encode-modified;

define method encode-modified (sequence :: <string>) => (result :: <string>) join(map(method(x) if (x.single?) x else format-to-string("%d%s", x.size, x.first) end if end, sequence.pack1), ";") end method encode-modified;

define method encode-modified (sequence :: <sequence>) => (result :: <sequence>) map(method(x) if (x.single?) x.first else list(x.size, x.first) end if end, sequence.pack1) end method encode-modified;

comments powered by Disqus