challenge 文字列の均等分割

一行の文字列を指定した数の行にできるだけ文字数が均等になるように分割してください.
ただし,除算や剰余算を使わないで書いてみてください.

sample = "ゆめよりもはかなき世のなかをなげきわびつゝあかしくらすほどに四月十よひにもなりぬれば木のしたくらがりもてゆく"

divid 4 sample =>
 "ゆめよりもはかなき世のなかを"
 "なげきわびつゝあかしくらすほ"
 "どに四月十よひにもなりぬれ"
 "ば木のしたくらがりもてゆく"

divid 5 sample => 
 "ゆめよりもはかなき世の"
 "なかをなげきわびつゝあ"
 "かしくらすほどに四月十"
 "よひにもなりぬれば木の"
 "したくらがりもてゆく"

divid 6 sample => 
 "ゆめよりもはかなき"
 "世のなかをなげきわ"
 "びつゝあかしくらす"
 "ほどに四月十よひに"
 "もなりぬれば木のし"
 "たくらがりもてゆく"

この問題は、除算だけでははく算術演算とか、文字列の長さをstrlenの類いで測るとかをしなくても、多分書けるのではないかと思います。

Posted feedbacks - Common Lisp

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

 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)))

Index

Feed

Other

Link

Pathtraq

loading...