2013年3月8日金曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 10章(章全部で復習), 10.5(練習問題の続き)拡張 english_number を解いてみる。

その他参考書籍

拡張 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 コメント:

コメントを投稿