開発環境
- 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 コメント:
コメントを投稿