Comment detail

文字列の均等分割 (Nested Flatten)

行数以外は数値を使ってません。 もっとよく考えればきれいに書けるかも。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
(defun divid-1 (string n)
  (loop
     with list = (coerce string 'list)
     with list2 = (nthcdr n list)
     for slow on list
     for fast = list2 then (or (nthcdr n fast) list2)
     if (eq list2 fast) collect slow))

(defun divid-2 (string n)
  (loop with list = (divid-1 string n)
     with last = (last list)
     for sublist on (cdr list)
     while (car last)
     do (mapl (lambda (l) (pop (car l))) sublist)
     finally (return (mapcar #'ldiff list (cdr list)))))

(defun divid (string n)
  (mapcar (lambda (l) (format nil "~{~C~}" l)) (divid-2 string n)))
だいたいこんな処理になってます。

divid-1: 分割すべき位置を近似的に見つける
"ゆめよりもはかなき世のなかを...", 4
->
("ゆめよりもはかなき世のなかを..." "をなげきわびつゝあかしくらす..."
 "すほどに四月十よひにもなりぬ..." "ぬれば木のしたくらがりもてゆく"
 "ゆく")

divid-2: 末尾が空になるまでひとつずつずらす
   ("ゆめよりも..." "をなげきわ..." "すほどに四..." "ぬれば木の..." "ゆく")
-> ("ゆめよりも..." "なげきわ..." "ほどに四..." "れば木の..." "く")
-> ("ゆめよりも..." "なげきわ..." "どに四..." "ば木の..." "")

divid: 重複部分を削る
("ゆめよりもはかなき世のなかをなげき..." "なげきわびつゝあかしくらすほどに四..."
 "どに四月十よひにもなりぬれば木のし..." "ば木のしたくらがりもてゆく" "")
-> 
("ゆめよりもはかなき世のなかを" "なげきわびつゝあかしくらすほ"
 "どに四月十よひにもなりぬれ" "ば木のしたくらがりもてゆく")

Index

Feed

Other

Link

Pathtraq

loading...