challenge 文字列の均等分割

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

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

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

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

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

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

Posted feedbacks - D

D に移植してみました。文字列の長さと分割数次第ではひどく時間がかかります。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import std.stdio;
import std.regexp;
import std.string;

string[] divid(uint n, string s){
    string[] ret;
    for(uint i;; i++){
        auto pat = "^" ~ format("(.{%d,%d})", i, i + 1).repeat(n) ~ "$";
        if(auto m = search(s, pat)){
            for(uint j = 1; j <= n; j++){
                ret ~= m.match(j);  // ret ~= m[j];
            }
            break;
        }
    }
    return ret;
}

void main(){
    auto sample = "ゆめよりもはかなき世のなかをなげきわびつゝあかしくらすほどに四月十よひにもなりぬれば木のしたくらがりもてゆく";
    writefln(divid(4, sample).join("\n"));
    writefln("----");
    writefln(divid(5, sample).join("\n"));
    writefln("----");
    writefln(divid(6, sample).join("\n"));
}

Index

Feed

Other

Link

Pathtraq

loading...