2012年12月25日火曜日

開発環境

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

コメントを投稿