今回のGoogle DevFest 2010 の参加証をもらうためにはGoogleからのQuizに正解する必要が
あり、その中の何問かはプログラムを組んで解答します。僕はPerlを使って解答しました。
25日の締切を過ぎたので自分の解答を貼ります。まず「漢字変換マシン」の解答。
Googleからのhttpリクエストに対して正しいレスポンスを返す問題です。
漢字変換マシン
数字を漢数字に変換するアプリケーションを作ってください。
http://[あなたのアプリケーションのURL]?n=[数字] にアクセスすると、 text/plain でその数字を漢数字に変換した結果を返すウェブサーバを作ってください。 ただし、漢字はすべて以下の表の通りにアルファベットに変換して出力してください。
零 → A 一 → T 二 → Y 三 → C
四 → L 五 → S 六 → R 七 → Z
八 → N 九 → U 十 → P 百 → X
千 → B 万 → D 億 → M 兆 → Q
注意:
- 「千万」「千億」「千兆」の前に「一」がつかないようにしてください。
- 入力は負でない整数で、大きさは高々9999兆9999億9999万9999までです。
- 標準のポート番号80番のみ扱えます。
解答:
#!/usr/bin/perl
use strict;
use CGI;
my $query = new CGI;
# 入力値を16桁ゼロパディングに変換
my $numstr = sprintf("%016d",$query->param('n'));
# 出力文字列
my $ansstr = "";
# 一万ごとの桁「兆」「億」「万」「(空)」
my @man_keta = ('Q','M','D','');
# 「千」「百」「十」「(空)」
my @keta = ('B', 'X', 'P','');
# 「零」「一」「二」「三」「四」「五」「六」「七」「八」「九」
my @kazu = ('A','T', 'Y', 'C', 'L', 'S', 'R', 'Z', 'N', 'U');
for (my $i = 0; $i < 4; $i++) {
# 4桁(一万)ずつの処理
my $substr = "";
for (my $j = 0; $j < 4; $j++) {
# 1桁ずつの処理
my $k = substr($numstr, $i*4+$j,1);
if ($k ne '0') {
# 数字が0でなければ文字を出力
if ($k eq '1' && $j ne '3') {
# 「一千」「一百」「一十」を避ける
$substr .= $keta[$j];
} else {
# 数字と位取りを連結
$substr .= $kazu[$k] . $keta[$j];
}
}
}
if ($substr ne ''){
# 4桁のうちに数字があれば「兆」「億」「万」を連結
$ansstr .= $substr . $man_keta[$i];
}
}
if ($ansstr eq '') {
# 出力される文字がなければ「零」
$ansstr = 'A';
}
# 出力文字列
print "Content-Type: text/plain\n";
print "\n";
print $ansstr."\n";
動作の例: