2012年11月18日日曜日

開発環境

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

その他参考書籍

拡張 english_number

コード(TextWrangler)

sample.rb

#!/usr/bin/env ruby1.9
# -*- coding: utf-8 -*-

def english_number number
  num_string = ""
  ones_place = %w[one two three
                four five six
                seven eight nine]
  tens_place = %w[ten twenty thirty
                  forty fifty sixty
                  seventy eighty ninety]
  teenagers = %w[eleven twelve thirteen
                 fourteen fifteen sixteen
                 seventeen eighteen nineteen]
  others = [[2,  'hundred'],
            [3,  'thousand'],
            [6,  'million'],
            [9,  'billion'],
            [12,  'trillion']]
  left = number
  while others.length > 0
    other = others.pop
    write = left / (10 ** other[0])
    left -= write * (10 ** other[0])
    if write > 0
      pre = english_number write
      num_string = num_string + pre + ' ' + other[1]
      if left > 0
        num_string += ' '
      end
    end
  end
  write = left / 10
  left = left - write * 10
  if write > 0
    if (write == 1) and (left > 0)
      num_string += teenagers[left - 1]
      left = 0
    else
      num_string += tens_place[write - 1]
    end
    num_string += '-' if left > 0
  end
  write = left
  left = 0
  num_string += ones_place[write - 1] if write > 0
  num_string
end

(1..100).each do |number|
  puts "#{number}: #{english_number number}"
end
num = 1111111111111
puts "#{num}: #{english_number num}"

入出力結果(Terminal)

$ ./sample.rb
1: one
2: two
3: three
4: four
5: five
6: six
7: seven
8: eight
9: nine
10: ten
11: eleven
12: twelve
13: thirteen
14: fourteen
15: fifteen
16: sixteen
17: seventeen
18: eighteen
19: nineteen
20: twenty
21: twenty-one
22: twenty-two
23: twenty-three
24: twenty-four
25: twenty-five
26: twenty-six
27: twenty-seven
28: twenty-eight
29: twenty-nine
30: thirty
31: thirty-one
32: thirty-two
33: thirty-three
34: thirty-four
35: thirty-five
36: thirty-six
37: thirty-seven
38: thirty-eight
39: thirty-nine
40: forty
41: forty-one
42: forty-two
43: forty-three
44: forty-four
45: forty-five
46: forty-six
47: forty-seven
48: forty-eight
49: forty-nine
50: fifty
51: fifty-one
52: fifty-two
53: fifty-three
54: fifty-four
55: fifty-five
56: fifty-six
57: fifty-seven
58: fifty-eight
59: fifty-nine
60: sixty
61: sixty-one
62: sixty-two
63: sixty-three
64: sixty-four
65: sixty-five
66: sixty-six
67: sixty-seven
68: sixty-eight
69: sixty-nine
70: seventy
71: seventy-one
72: seventy-two
73: seventy-three
74: seventy-four
75: seventy-five
76: seventy-six
77: seventy-seven
78: seventy-eight
79: seventy-nine
80: eighty
81: eighty-one
82: eighty-two
83: eighty-three
84: eighty-four
85: eighty-five
86: eighty-six
87: eighty-seven
88: eighty-eight
89: eighty-nine
90: ninety
91: ninety-one
92: ninety-two
93: ninety-three
94: ninety-four
95: ninety-five
96: ninety-six
97: ninety-seven
98: ninety-eight
99: ninety-nine
100: one hundred
1111111111111: one trillion one hundred eleven billion one hundred eleven million one hundred eleven thousand one hundred eleven
$

入出力結果の先頭に戻る

ちなみにJavaScriptの場合。

コード(TextWrangler)

var others;
function english_number(number){
  var num_string = "";
  var ones_place = ['one', 'two', 'three',
                'four', 'five', 'six',
                'seven', 'eight', 'nine'];
  var tens_place = ['ten', 'twenty', 'thirty',
                'forty', 'fifty', 'sixty',
                'seventy', 'eighty', 'ninety'];
  var teenagers = ['eleven', 'twelve', 'thirteen',
                'fourteen', 'fifteen', 'sixteen',
                'seventeen', 'eighteen', 'nineteen'];
  var others = [[2,  'hundred'],
            [3,  'thousand'],
            [6,  'million'],
            [9,  'billion'],
            [12,  'trillion']];
  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);
      num_string = num_string + pre + ' ' + other[1];
      if(left > 0){
        num_string += ' ';
      }
    }
  }
  write = Math.floor(left / 10);
  left = left - write * 10;
  if(write > 0){
    if((write == 1) && (left > 0)){
      num_string += teenagers[left - 1];
      left = 0;
    }else{
      num_string += tens_place[write - 1];
    }
    if(left > 0) num_string += '-';
  }
  write = left;
  left = 0;
  if(write > 0) num_string += ones_place[write - 1];
  return num_string;
}
var number = parseInt($('#t0').val());
var result = english_number(number);
$('#pre0').text(result);


pythonの場合。

sample.py

コード(TextWrangler)

#!//usr//bin//env python3.3
#-*- coding: utf-8 -*-

def english_number(number):
    num_string = ""
    ones_place = ['one', 'two', 'three',
                  'four', 'five', 'six',
                  'seven', 'eight', 'nine']
    tens_place = ['ten', 'twenty', 'thirty',
                  'forty', 'fifty', 'sixty',
                  'seventy', 'eighty', 'ninety']
    teenagers = ['eleven', 'twelve', 'thirteen',
                  'fourteen', 'fifteen', 'sixteen',
                  'seventeen', 'eighteen', 'nineteen']
    others = [[2,  'hundred'],
              [3,  'thousand'],
              [6,  'million'],
              [9,  'billion'],
              [12,  'trillion']]
    left = number
    while others:
      other = others.pop()
      write = left // (10 ** other[0])
      left -= write * (10 ** other[0])
      if write > 0:
        pre = english_number(write)
        num_string = num_string + pre + ' ' + other[1]
        if left > 0:
          num_string += ' '
    
    write = left // 10
    left = left - write * 10
    if write > 0:
      if (write == 1) and (left > 0):
        num_string += teenagers[left - 1]
        left = 0
      else:
        num_string += tens_place[write - 1]
      
      if left > 0: num_string += '-'
    
    write = left
    left = 0
    if write > 0: num_string += ones_place[write - 1]
    return num_string

for number in range(1,101):
    print("{0}: {1}".format(number, english_number(number)))

num = 123456789
print("{0}: {1}".format(num, english_number(num)))

入出力結果(Terminal)

$ ./sample.py
1: one
2: two
3: three
4: four
5: five
6: six
7: seven
8: eight
9: nine
10: ten
11: eleven
12: twelve
13: thirteen
14: fourteen
15: fifteen
16: sixteen
17: seventeen
18: eighteen
19: nineteen
20: twenty
21: twenty-one
22: twenty-two
23: twenty-three
24: twenty-four
25: twenty-five
26: twenty-six
27: twenty-seven
28: twenty-eight
29: twenty-nine
30: thirty
31: thirty-one
32: thirty-two
33: thirty-three
34: thirty-four
35: thirty-five
36: thirty-six
37: thirty-seven
38: thirty-eight
39: thirty-nine
40: forty
41: forty-one
42: forty-two
43: forty-three
44: forty-four
45: forty-five
46: forty-six
47: forty-seven
48: forty-eight
49: forty-nine
50: fifty
51: fifty-one
52: fifty-two
53: fifty-three
54: fifty-four
55: fifty-five
56: fifty-six
57: fifty-seven
58: fifty-eight
59: fifty-nine
60: sixty
61: sixty-one
62: sixty-two
63: sixty-three
64: sixty-four
65: sixty-five
66: sixty-six
67: sixty-seven
68: sixty-eight
69: sixty-nine
70: seventy
71: seventy-one
72: seventy-two
73: seventy-three
74: seventy-four
75: seventy-five
76: seventy-six
77: seventy-seven
78: seventy-eight
79: seventy-nine
80: eighty
81: eighty-one
82: eighty-two
83: eighty-three
84: eighty-four
85: eighty-five
86: eighty-six
87: eighty-seven
88: eighty-eight
89: eighty-nine
90: ninety
91: ninety-one
92: ninety-two
93: ninety-three
94: ninety-four
95: ninety-five
96: ninety-six
97: ninety-seven
98: ninety-eight
99: ninety-nine
100: one hundred
123456789: one hundred twenty-three million four hundred fifty-six thousand seven hundred eighty-nine
$

入出力結果の先頭に戻る

0 コメント:

コメントを投稿