整数の漢数字表記
Posted feedbacks - Perl
初の1番乗り? きれいなコードではないですが... > perl suuzi.pl 1732050807568877 千七百三十二兆五百八億七百五十六万八千八百七十七
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 | #!/usr/bin/perl
my $num = $ARGV[0];
my @name0 = ('', qw(一 二 三 四 五 六 七 八 九));
my @name1 = ('', qw(十 百 千));
my @name2 = ('', qw(万 億 兆));
my $i = 0;
my $j = 0;
my $res = '';
while($num =~ s/(\d)$//) {
my $d = $1;
if($d > 1) {
$res = $name0[$d] . $name1[$i] . $res;
}
elsif($d == 1 and $i != 0) {
$res = $name1[$i] . $res;
}
$i++;
if($i % 4 == 0) {
$j++;
$i = 0;
$res = $name2[$j] . $res if($num ne '');
}
}
print $res, "\n";
|
バグがありました(汗 1の位の1の処理条件が抜けていました. シャワー浴びていたときにふと気づきましたが,手遅れ. というわけで一番乗りは無かったことにしていただけないでしょうか...(恥
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 | #!/usr/bin/perl
my $num = $ARGV[0];
my @name0 = ('', qw(一 二 三 四 五 六 七 八 九));
my @name1 = ('', qw(十 百 千));
my @name2 = ('', qw(万 億 兆));
my $i = 0;
my $j = 0;
my $res = '';
while($num =~ s/(\d)$//) {
my $d = $1;
if($d > 1) {
$res = $name0[$d] . $name1[$i] . $res;
}
elsif($d == 1 and $i != 0) {
$res = $name1[$i] . $res;
}
elsif($d == 1 and $i == 0) {
$res = $name0[$d] . $res;
}
$i++;
if($i % 4 == 0) {
$j++;
$i = 0;
$res = $name2[$j] . $res if($num ne '');
}
}
print $res, "\n";
|
うーん、全然スマートにならなかった・・・
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | use strict;
use warnings;
use bigint;
use Test::Simple tests => 12;
my %kanji_of =
(1 => '一', 2 => '二', 3 => '三', 4 => '四', 5 => '五',
6 => '六', 7 => '七', 8 => '八', 9 => '九' );
my @keta = ('千','百','十','');
my @big_keta = ('', '万','億','兆');
sub to_kanji{
my $num = shift;
$num = '0'.$num until (length($num) % 4 == 0);
my @list = grep {defined $_} ( $num =~ m/(\d{4})?(\d{4})?(\d{4})?(\d{4})$/ );
my $ret = append_man_oku_tyo( map {to_kanji_sub($_)} @list );
return $ret;
}
sub append_man_oku_tyo{
my @list = @_;
my $i = 0;
my $str = join ' ', grep {$_}
reverse map {$_ . ($_? $big_keta[$i++]:($i++,'')) }
reverse @list;
return $str;
}
#4桁の数字を漢字に変換
sub to_kanji_sub{
my @num = split //, shift;
return join '', map {
$num[$_] ? ( $_ != 3 && $num[$_] == 1 ? '': $kanji_of{$num[$_]}).$keta[$_] :''
} 0..3;
}
#テストコード
do_test();
sub do_test{
ok(to_kanji(1) eq '一',"1 ok");
ok(to_kanji(1234) eq '千二百三十四',"1234 ok");
ok(to_kanji(4321) eq '四千三百二十一', "4321 ok");
ok(to_kanji(100) eq '百', "100 ok");
ok(to_kanji(1000) eq '千', "1000 ok");
ok(to_kanji(1001) eq '千一', "1001 ok");
ok(to_kanji(1021) eq '千二十一', "1021 ok ");
ok(to_kanji(12345) eq '一万 二千三百四十五', "12345 ok");
ok(to_kanji(10000) eq '一万' ,"10000 w");
ok(to_kanji(1_0000_0000_0000) eq '一兆', "1_0000_0000_0000 ok");
ok(to_kanji(1_2345_6789) eq '一億 二千三百四十五万 六千七百八十九', "1234567879 ok");
ok(to_kanji(1732050807568877) eq '千七百三十二兆 五百八億 七百五十六万 八千八百七十七', "1732050807568877 ok");
}
|




にしお
#3394()
Rating0/0=0.00
このお題は匿名での投稿です。 与えられる整数の範囲は一京未満(10000000000000000未満)としたいと思います。 ご投稿ありがとうございます。
2年前のLL Day&Nightの「キミならどう書く」で、 これ専用のCPANモジュールが作られていたような記憶があるので 勝手にPerlからの挑戦状とみなしておきます(笑)
[ reply ]