開発環境
- 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 number
return "0以上の数値を入力してください" if number < 0
return "zero" if number == 0
num_string = ""
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 = number
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
num_string = num_string + pre + ' ' + other[1]
if left > 0
num_string = num_string + ' '
end
end
end
write = left / 10
left = left - write * 10
if write > 0
if (write == 1) and (left > 0)
num_string = num_string + tens_place[left - 1]
left = 0
else
num_string = num_string + tens[write - 1]
if left > 0
num_string = num_string + '-'
end
end
end
write = left
left = 0
if write > 0
num_string = num_string + ones[write - 1]
end
return "zero" if num_string == ""
num_string
end
[1111, 1111111, 1111110, 9999999999].each do |number|
puts "#{number}: #{english_number number}"
end
入出力結果(Terminal)
$ ./sample.rb 1111: one thousand one hundred eleven 1111111: one million one hundred eleven thousand one hundred eleven 1111110: one million one hundred eleven thousand one hundred ten 9999999999: nine billion nine hundred ninety-nine million nine hundred ninety-nine thousand nine hundred ninety-nine $
ちなみにJavaScriptの場合。
コード(BBEdit)
function english_number(number){
if(number < 0) return "0以上の値を指定してください。";
if(number === 0) return "zero";
var result = "";
var ones = ['one', 'two', 'three', 'four','five',
'six', 'seven', 'eight', 'nine'];
var tens_place = ['eleven', 'twelve', 'thirteen', 'fourteen',
'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'];
var tens = ['ten', 'twenty', 'thirty', 'forty', 'fifty',
'sixty', 'seventy', 'eighty', 'ninety'];
var others = [
[2, 'hundred'],
[3, 'thousand'],
[6, 'million'],
[9, 'billion'],
[12, 'trillion'],
[15, 'quandrillion'],
[18, 'quintillion'],
[21, 'sextillion'],
[24, 'septillion']];
var left = number;
while(others.length > 0){
var other = others.pop();
var write = Math.floor(left / (Math.pow(10, other[0])));
left = left - write * Math.pow(10, other[0]);
if(write > 0){
var pre = english_number(write);
result = result + pre + " " + other[1];
if(left > 0){
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;
}
var num = parseInt($('#t0').val());
$('#pre0').text(english_number(num));
pythonの場合。
sample.py
コード(BBEdit)
#!/usr/bin/env python3.3
# -*- coding: utf-8 -*-
def english_number(number):
if number < 0: return "0以上の数値を入力してください"
if number == 0: return "zero"
num_string = ""
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']]
left = number
while len(others) > 0:
other = others.pop()
write = left // (10 ** other[0])
left = left - write * (10 ** other[0])
if write > 0:
pre = english_number(write)
num_string = num_string + pre + ' ' + other[1]
if left > 0:
num_string = num_string + ' '
write = left // 10
left = left - write * 10
if write > 0:
if write == 1 and left > 0:
num_string = num_string + tens_place[left - 1]
left = 0
else:
num_string = num_string + tens[write - 1]
if left > 0:
num_string = num_string + '-'
write = left
left = 0
if write > 0:
num_string = num_string + ones[write - 1]
return num_string
for number in [1111, 1111111, 1111110, 9999999999]:
print("{0}: {1}".format(number, english_number(number)))
入出力結果(Terminal)
$ ./sample.py 1111: one thousand one hundred eleven 1111111: one million one hundred eleven thousand one hundred eleven 1111110: one million one hundred eleven thousand one hundred ten 9999999999: nine billion nine hundred ninety-nine million nine hundred ninety-nine thousand nine hundred ninety-nine $
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 $number = shift;
return "0以上の値を指定してください。" if $number < 0;
return "zero" if $number == 0;
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 = $number;
while(scalar @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){
$result .= ' ';
}
}
}
my $write = 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;
$result .= $ones[$write - 1] if $write > 0;
$result;
}
print map{"$_: " . english_number($_) . "\n"} (1111, 1111111, 1111110, 9999999999);;
入出力結果(Terminal)
$ ./sample.pl 1111: one thousand one hundred eleven 1111111: one million one hundred eleven thousand one hundred eleven 1111110: one million one hundred eleven thousand one hundred ten 9999999999: nine billion nine hundred ninety nine million nine hundred ninety nine thousand nine hundred ninety nine $
0 コメント:
コメントを投稿