開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- プログラミング言語: 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 "負でない数値を入力してください" if num < 0
return 'zero' if num == 0
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']]
result = ""
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
if write > 0
result += ones[write - 1]
end
return result
end
[0, 9, 10, 11, 17, 32, 88, 99, 100, 101, 234, 3211,
999999, 1000000000000].each do |num|
puts "#{num}: #{english_number num}"
end
入出力結果(Terminal)
$ ./sample.rb 0: zero 9: nine 10: ten 11: eleven 17: seventeen 32: thirty-two 88: eighty-eight 99: ninety-nine 100: one hundred 101: one hundred one 234: two hundred thirty-four 3211: three thousand, two hundred eleven 999999: nine hundred ninety-nine thousand, nine hundred ninety-nine 1000000000000: one trillion $
ちなみにJavaScriptの場合。
コード(BBEdit)
var englishNumber = function( n ) {
if( n !== 0 && !n ) {
return "NaN";
}
if( n < 0 ) {
return "自然数を入力してください";
}
if ( n === 0 ) {
return 'zero';
}
var ones = ["one", "two", "three", "four", "five", "six", "seven",
"eight", "nine"],
tens_place = ["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']],
result = "",
left = n,
write, other, 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 = englishNumber( 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 += tens_place[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;
},
nums = [0, 9, 10, 11, 17, 32, 88, 99, 100, 101, 234, 3211,
999999, 1000000000000],
result = "",
i, max;
for (i = 0, max = nums.length; i < max; i += 1) {
result += nums[i] + ": " + englishNumber( nums[i] ) + "\n";
}
$('#pre0').text(result);
好きな数の英語版を調べる。
上記のHTMLとJavaScriptのソース
<p>好きな数の英語版を調べる。</p> <label>自然数: <input id="t0" type="text" value="1000000000000" size="15" onkeyup="p(parseInt(this.value, 10))" style="text-align:right"/></label> <span id="english_num"></span>
var englishNumber = function( n ) {
if( n !== 0 && !n ) {
return "NaN";
}
if( n < 0 ) {
return "自然数を入力してください";
}
if ( n === 0 ) {
return 'zero';
}
var ones = ["one", "two", "three", "four", "five", "six", "seven",
"eight", "nine"],
tens_place = ["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']],
result = "",
left = n,
write, other, 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 = englishNumber( 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 += tens_place[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;
},
p = function( n ) {
$('#english_num').text(englishNumber(n));
};
// 初期設定
p(1000000000000);
pythonの場合。
sample.py
コード(BBEdit)
#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-
def englishNumber(num):
if num < 0:
return "負でない数値を入力してください"
if num == 0:
return 'zero'
ones = ["one", "two", "three", "four", "five", "six", "seven",
"eight", "nine"]
tens_place = ["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']]
result = ""
left = num
while len(others) > 0:
other = others.pop()
write = left // (10 ** other[0])
left = left - write * (10 ** other[0])
if write > 0:
pre = englishNumber(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 += tens_place[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
for n in [0, 9, 10, 11, 17, 32, 88, 99, 100, 101, 234, 3211,
999999, 1000000000000]:
print("{0}: {1}".format(n, englishNumber(n)))
入出力結果(Terminal)
$ ./sample.py 0: zero 9: nine 10: ten 11: eleven 17: seventeen 32: thirty-two 88: eighty-eight 99: ninety-nine 100: one hundred 101: one hundred one 234: two hundred thirty-four 3211: three thousand, two hundred eleven 999999: nine hundred ninety-nine thousand, nine hundred ninety-nine 1000000000000: one trillion $
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 english_number {
my $num = shift;
return "負でない数値を入力してください" if $num < 0;
return 'zero' if $num == 0;
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 $result = "";
my $left = $num;
while (@others > 0){
my $other = pop @others;
my $write = floor($left / (10 ** $other->[0]));
$left = $left - $write * (10 ** $other->[0]);
if ($write > 0) {
my $pre = english_number($write);
$result = $result . $pre . ' ' . $other->[1];
if ($left > 0){
if ($other->[1] ne 'hundred'){
$result .= ', ';
}else{
$result .= ' ';
}
}
}
}
my $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;
if ($write > 0) {
$result .= $ones[$write - 1]
}
$result;
}
for ((0, 9, 10, 11, 17, 32, 88, 99, 100, 101, 234, 3211,
999999, 1000000000000)) {
print "$_: ", english_number( $_ ), "\n";
}
入出力結果(Terminal)
$ ./sample.pl 0: zero 9: nine 10: ten 11: eleven 17: seventeen 32: thirty-two 88: eighty-eight 99: ninety-nine 100: one hundred 101: one hundred one 234: two hundred thirty-four 3211: three thousand, two hundred eleven 999999: nine hundred ninety-nine thousand, nine hundred ninety-nine 1000000000000: one trillion $
0 コメント:
コメントを投稿