2013年1月31日木曜日

開発環境

『初めてのプログラミング 第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 "自然数(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 コメント:

コメントを投稿