Comment detail

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

最初に,行数分の文字ずつ(例えば,4分割なら4文字ずつ)与えられた文字列を走査し,[14, 14, 13, 13] のような各行の文字数からなる配列を作ります.次に,配列を走査しつ つ,この文字数ずつ文字列をとって配列の中身を置き換え,出力とします.

% ./divid.rb
divid 4:
["ゆめよりもはかなき世のなかを",
 "なげきわびつゝあかしくらすほ",
 "どに四月十よひにもなりぬれ",
 "ば木のしたくらがりもてゆく"]

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

divid 6:
["ゆめよりもはかなき",
 "世のなかをなげきわ",
 "びつゝあかしくらす",
 "ほどに四月十よひに",
 "もなりぬれば木のし",
 "たくらがりもてゆく"]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
require 'pp'
$KCODE='EUC'

class String
  def divid(lines)
    out, x, y = [0] * lines, split(''), nil
    y.times {|i| out[i] += 1 } while (y = x.slice!(0, lines).size) > 0

    rest = self
    out.map! do |len|
      _, ret, rest = *rest.match(/(.{#{len}})(.*)/)
      ret
    end
  end
end

sample = "ゆめよりもはかなき世のなかをなげきわびつゝあかしくらすほどに四月十よひにもなりぬれば木のしたくらがりもてゆく"
(4..6).to_a.each do |i|
  puts "divid #{i}:"
  pp sample.divid(i)
  puts
end

Index

Feed

Other

Link

Pathtraq

loading...