開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- Script言語:Ruby
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 10章(章全部で復習), 10.5(練習問題の続き)拡張 english_number を解いてみる。
その他参考書籍
- 『プログラミング言語 Ruby』David Flanagan, まつもと ゆきひろ 著 、卜部 昌平 監訳、長尾 高弘 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-394-4)
- Rubyクックブック ―エキスパートのための応用レシピ集
拡張 english_number
コード(BBEdit)
sample.rb
#!/usr/bin/env ruby1.9
#-*- coding: utf-8 -*-
def english_number num
return "自然数(0を含む)を入力してください" if num < 0
return 'zero' if num == 0
result = ""
ones = %w[one two three four five six seven eight nine]
tens_place = %w[eleven twelve thirteen fourteen fifteen
sixteen seventeen eighteen nineteen]
tens = %w[ten twenty thirty forty fifty sixty seventy eighty ninety]
others = [
[2, 'hundred'],
[3, 'thousand'],
[6, 'million'],
[9, 'billion'],
[12, 'trillion'],
[15, 'quandrillion'],
[18, 'quintillion'],
[21, 'sextillion'],
[24, 'septillion']]
left = num
while others.length > 0
other = others.pop
write = left / (10 ** other[0])
left = left - write * (10 ** other[0])
if write > 0
pre = english_number write
result = result + pre + ' ' + other[1]
if left > 0
if other[1] != 'hundred'
result += ', '
else
result += ' '
end
end
end
end
write = left / 10
left = left - write * 10
if write > 0
if (write == 1) and (left > 0)
result += tens_place[left - 1]
left = 0
else
result += tens[write - 1]
result += '-' if left > 0
end
end
write = left
left = 0
result += ones[write - 1] if write > 0
result
end
puts english_number 123123123
入出力結果(Terminal)
$ ./sample.rb one hundred twenty-three million, one hundred twenty-three thousand, one hundred twenty-three $
ちなみにJavaScriptの場合。
コード(BBEdit)
function nToEnglishNumber(n) {
if (typeof(n) !== "number") {
throw "NaN";
}
if ( !(n > 0) ) {
throw {
type: "エラー",
message: "自然数を入力してください"
};
}
if (n === 0){
return "zero";
}
var result = "",
ones = ["one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"],
teenagers = ["eleven", "twelve", "thirteen", "fourteen", "fifteen",
"sixteen", "seventeen", "eighteen", "nineteen"],
tens = ["ten", "twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety"],
others = [ [2, 'hundred'], [3, 'thousand'], [6, 'million'], [9, 'billion'],
[12, 'trillion'], [15, 'quandrillion'], [18, 'quintillion'],
[21, 'sextillion'], [24, 'septillion']],
left = n,
other,
write,
pre;
while (others.length > 0) {
other = others.pop();
write = Math.floor( left / Math.pow(10, other[0]));
left = left - write * (Math.pow(10, other[0]));
if (write > 0) {
pre = nToEnglishNumber(write);
result = result + pre + ' ' + other[1];
if (left > 0){
if(other[1] !== "hundred"){
result += ", ";
} else {
result += " ";
}
}
}
}
write = Math.floor(left / 10);
left = left - write * 10;
if (write > 0) {
if ((write === 1) && (left > 0)){
result += teenagers[left - 1];
left = 0;
} else {
result += tens[write - 1];
if (left > 0){
result += "-";
}
}
}
write = left;
left = 0;
if (write > 0){
result += ones[write - 1];
}
return result;
}
var n = parseInt($('#natural_number').val());
$('#pre0').text(nToEnglishNumber(n));
pythonの場合。
sample.py
コード(BBEdit)
#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-
def nToEnglishNumber(n):
if n < 0:
return "自然数を入力してください"
if n == 0:
return 'zero'
result = ""
ones = ["one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"]
teenagers = ["eleven", "twelve", "thirteen", "fourteen", "fifteen",
"sixteen", "seventeen", "eighteen", "nineteen"]
tens = ["ten", "twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety"]
others = [ [2, 'hundred'], [3, 'thousand'], [6, 'million'], [9, 'billion'],
[12, 'trillion'], [15, 'quandrillion'], [18, 'quintillion'],
[21, 'sextillion'], [24, 'septillion']]
left = n
while len(others) > 0:
other = others.pop()
write = left // (10 ** other[0])
left = left - write * (10 ** other[0])
if write > 0:
pre = nToEnglishNumber(write)
result = result + pre + ' ' + other[1]
if left > 0:
if other[1] != 'hundred':
result += ", "
else:
result += ' '
write = left // 10
left = left - write * 10
if write > 0:
if write == 1 and left > 0:
result += teenagers[left - 1]
left = 0
else:
result += tens[write - 1]
if left > 0:
result += '-'
write = left
left = 0
if write > 0:
result += ones[write - 1]
return result
print(nToEnglishNumber(123123123))
入出力結果(Terminal)
$ ./sample.py one hundred twenty-three million, one hundred twenty-three thousand, one hundred twenty-three $
perlの場合。
sample.pl
コード(BBEdit)
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.016;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
use POSIX;
sub nToEnglishNumber {
my $n = shift;
if ($n < 0) {
return "自然数を指定してください";
}
if ($n == 0) {
return 'zero';
}
my $result = "";
my @ones = qw(one two three four five six seven eight nine);
my @tens_place = qw(eleven twelve thirteen fourteen fifteen
sixteen seventeen eighteen nineteen);
my @tens = qw(ten twenty thirty forty fifty sixty seventy eighty ninety);
my @others = ([2, 'hundred'], [3, 'thousand'], [6, 'million'], [9, 'billion'],
[12, 'trillion'], [15, 'quandrillion'], [18, 'quintillion'],
[21, 'sextillion'], [24, 'septillion']);
my $left = $n;
my $write;
while (@others ) {
my $other = pop @others;
$write = floor( $left / (10 ** $other->[0]) );
$left = $left - $write * (10 ** $other->[0]);
if ($write > 0) {
my $pre = nToEnglishNumber( $write );
$result = $result . $pre . " " . $other->[1];
if ($left > 0) {
if ($other->[1] ne 'hundred') {
$result .= ", ";
} else {
$result .= " ";
}
}
}
}
$write = floor($left / 10);
$left = $left - $write * 10;
if ($write > 0) {
if (($write == 1) and ($left > 0)) {
$result .= $tens_place[$left - 1];
$left = 0;
} else {
$result .= $tens[$write - 1];
$result .= '-' if $left > 0;
}
}
$write = $left;
$left = 0;
$result .= $ones[$write - 1] if $write > 0;
$result;
}
print nToEnglishNumber(123123123) . "\n";
入出力結果(Terminal)
$ ./sample.pl one hundred twenty-three million, one hundred twenty-three thousand, one hundred twenty-three $
0 コメント:
コメントを投稿