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