challenge 文字列の均等分割

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

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

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

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

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

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

Posted feedbacks - Perl

divid(4, "Perlわかるひとには長いよって思われそうだし、Perlわかんないひとには読めねえよって思われそうだけどいいんだ。ってこれ半角混ぜるとぐじゃぐじゃになるな")
 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
27
28
29
30
31
32
33
34
35
36
use strict;
use warnings;
use utf8;
binmode(STDOUT, ":utf8");

sub divid {
    my $line = shift @_;
    my $str = shift @_;
    my @table;
    my @str_array = split //, $str;
    push @table, [] for 1..$line;
    
    while (@str_array) {
        for (@table) {
            push @$_, (shift @str_array);
        }
    }
    
    for (@table) {
        @$_ = grep { defined $_ } @$_;
    }
    
    @str_array = split //, $str;
    
    for my $array_ref (@table) {
        for (@$array_ref) {
            $_ = shift @str_array;
        }
    }
    
    for (@table) {
        print "\"", join('', grep { defined $_ } @$_), "\"", "\n";
    }
}

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

予め行数分の長さの配列を作っておいて、文字数をカウントしながらぐるぐるまわしてみた。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
use utf8;
binmode(STDOUT, ":utf8");
sub divid {
  my ($num, $text) = @_;
  my @chars = split //, $text;
  my @length = (0) x $num;
  for (@chars) {unshift @length, pop(@length)+1;}

  map {print join '', splice(@chars, 0, $_), "\n"} @length;

}

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

Index

Feed

Other

Link

Pathtraq

loading...