challenge 文字列の均等分割

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

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

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

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

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

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

Posted feedbacks - Java

Javaで書いてみました。 一応String::lengthを使わないことだけ意識しました。

 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 java.io.IOException;
import java.io.StringReader;

public class Divid {

    public static void main(String[] args) throws IOException{
        int[] n = new int[Integer.parseInt(args[0])];
        String target = args[1];
        for (int i = 0; i < n.length; i++) {
            n[i] = 0;
        }
        int turn = 0;
        StringReader reader = new StringReader(target);
        while(reader.read() != -1){
            n[turn++]++;
            if (turn == n.length)
                turn = 0;
        }
        String v[] = new String[n.length];
        int pos = 0;
        for (int i = 0; i < n.length; i++) {
            v[i] = target.substring(pos, (pos = (pos + n[i])));
            System.out.println(v[i]);
        }
    }
}

先に何文字で分割するかを計算させてから文字分割しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;
public class Divide {
    public static void main(String[] args) {
        String sample = "ゆめよりもはかなき世のなかをなげきわびつゝあかしくらすほどに四月十よひにもなりぬれば木のしたくらがりもてゆく";
        System.out.println(Arrays.toString(devide(sample, 4)));
        System.out.println(Arrays.toString(devide(sample, 5)));
        System.out.println(Arrays.toString(devide(sample, 6)));
    }
    public static String[] devide(String s, int r) {
        int[] x = new int[r];
        for (int i = 0, j = 0; i < s.length(); i++, j++) {
            if (j >= x.length) j = 0;
            x[j]++;
        }
        List<String> list = new ArrayList<String>(r);
        for (int i = 0; i < x.length; i++) {
            list.add(s.substring(0, x[i]));
            s = s.substring(x[i]);
        }
        return list.toArray(new String[0]);
    }
}

すばらしい! ありがとうございます。


Index

Feed

Other

Link

Pathtraq

loading...