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