challenge 整数の漢数字表記

キーボードから正の整数を入力すると、それを漢数字で表示するプログラムを作ってください☆ 例えば「1732050807568877」なら「千七百三十二兆 五百八億 七百五十六万 八千八百七十七」といった感じです☆ 「一七三二兆 〇五〇八億 〇七五六万 八八七七」ではダメですよ^^;

このお題は匿名での投稿です。 与えられる整数の範囲は一京未満(10000000000000000未満)としたいと思います。 ご投稿ありがとうございます。

2年前のLL Day&Nightの「キミならどう書く」で、 これ専用のCPANモジュールが作られていたような記憶があるので 勝手にPerlからの挑戦状とみなしておきます(笑)

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");
}

そのモジュールの作者ざんす。
1
2
% perl -CIO -MLingua::JA::Numbers -le 'print num2ja(1234567890)'
十二億三千四百五十六万七千八百九十

Index

Feed

Other

Link

Pathtraq

loading...