2013年3月9日土曜日

開発環境

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

その他参考書籍

「壁にビールが99本」

コード(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

n = 99
m = english_number n
puts "#{m.capitalize} bottles of beer on the wall, #{m} bottles of beer!"
(n - 1).downto(2) do |i|
    m = english_number i
    puts "Take one down, pass it around, #{m} bottles of beer on the wall!"
    puts "#{m.capitalize} bottles of beer on the wall, #{m} bottles of beer!"
end
m = english_number 1
puts "Take one down, pass it around, #{m} bottle of beer on the wall!"
puts "#{m.capitalize} bottle of beer on the wall, #{m} bottle of beer!"
puts "Take one down, pass it around, no more bottles of beer on the wall!"

入出力結果(Terminal)

$ ./sample.rb
Ninety-nine bottles of beer on the wall, ninety-nine bottles of beer!
Take one down, pass it around, ninety-eight bottles of beer on the wall!
Ninety-eight bottles of beer on the wall, ninety-eight bottles of beer!
Take one down, pass it around, ninety-seven bottles of beer on the wall!
Ninety-seven bottles of beer on the wall, ninety-seven bottles of beer!
Take one down, pass it around, ninety-six bottles of beer on the wall!
Ninety-six bottles of beer on the wall, ninety-six bottles of beer!
Take one down, pass it around, ninety-five bottles of beer on the wall!
Ninety-five bottles of beer on the wall, ninety-five bottles of beer!
Take one down, pass it around, ninety-four bottles of beer on the wall!
Ninety-four bottles of beer on the wall, ninety-four bottles of beer!
Take one down, pass it around, ninety-three bottles of beer on the wall!
Ninety-three bottles of beer on the wall, ninety-three bottles of beer!
Take one down, pass it around, ninety-two bottles of beer on the wall!
Ninety-two bottles of beer on the wall, ninety-two bottles of beer!
Take one down, pass it around, ninety-one bottles of beer on the wall!
Ninety-one bottles of beer on the wall, ninety-one bottles of beer!
Take one down, pass it around, ninety bottles of beer on the wall!
Ninety bottles of beer on the wall, ninety bottles of beer!
Take one down, pass it around, eighty-nine bottles of beer on the wall!
Eighty-nine bottles of beer on the wall, eighty-nine bottles of beer!
Take one down, pass it around, eighty-eight bottles of beer on the wall!
Eighty-eight bottles of beer on the wall, eighty-eight bottles of beer!
Take one down, pass it around, eighty-seven bottles of beer on the wall!
Eighty-seven bottles of beer on the wall, eighty-seven bottles of beer!
Take one down, pass it around, eighty-six bottles of beer on the wall!
Eighty-six bottles of beer on the wall, eighty-six bottles of beer!
Take one down, pass it around, eighty-five bottles of beer on the wall!
Eighty-five bottles of beer on the wall, eighty-five bottles of beer!
Take one down, pass it around, eighty-four bottles of beer on the wall!
Eighty-four bottles of beer on the wall, eighty-four bottles of beer!
Take one down, pass it around, eighty-three bottles of beer on the wall!
Eighty-three bottles of beer on the wall, eighty-three bottles of beer!
Take one down, pass it around, eighty-two bottles of beer on the wall!
Eighty-two bottles of beer on the wall, eighty-two bottles of beer!
Take one down, pass it around, eighty-one bottles of beer on the wall!
Eighty-one bottles of beer on the wall, eighty-one bottles of beer!
Take one down, pass it around, eighty bottles of beer on the wall!
Eighty bottles of beer on the wall, eighty bottles of beer!
Take one down, pass it around, seventy-nine bottles of beer on the wall!
Seventy-nine bottles of beer on the wall, seventy-nine bottles of beer!
Take one down, pass it around, seventy-eight bottles of beer on the wall!
Seventy-eight bottles of beer on the wall, seventy-eight bottles of beer!
Take one down, pass it around, seventy-seven bottles of beer on the wall!
Seventy-seven bottles of beer on the wall, seventy-seven bottles of beer!
Take one down, pass it around, seventy-six bottles of beer on the wall!
Seventy-six bottles of beer on the wall, seventy-six bottles of beer!
Take one down, pass it around, seventy-five bottles of beer on the wall!
Seventy-five bottles of beer on the wall, seventy-five bottles of beer!
Take one down, pass it around, seventy-four bottles of beer on the wall!
Seventy-four bottles of beer on the wall, seventy-four bottles of beer!
Take one down, pass it around, seventy-three bottles of beer on the wall!
Seventy-three bottles of beer on the wall, seventy-three bottles of beer!
Take one down, pass it around, seventy-two bottles of beer on the wall!
Seventy-two bottles of beer on the wall, seventy-two bottles of beer!
Take one down, pass it around, seventy-one bottles of beer on the wall!
Seventy-one bottles of beer on the wall, seventy-one bottles of beer!
Take one down, pass it around, seventy bottles of beer on the wall!
Seventy bottles of beer on the wall, seventy bottles of beer!
Take one down, pass it around, sixty-nine bottles of beer on the wall!
Sixty-nine bottles of beer on the wall, sixty-nine bottles of beer!
Take one down, pass it around, sixty-eight bottles of beer on the wall!
Sixty-eight bottles of beer on the wall, sixty-eight bottles of beer!
Take one down, pass it around, sixty-seven bottles of beer on the wall!
Sixty-seven bottles of beer on the wall, sixty-seven bottles of beer!
Take one down, pass it around, sixty-six bottles of beer on the wall!
Sixty-six bottles of beer on the wall, sixty-six bottles of beer!
Take one down, pass it around, sixty-five bottles of beer on the wall!
Sixty-five bottles of beer on the wall, sixty-five bottles of beer!
Take one down, pass it around, sixty-four bottles of beer on the wall!
Sixty-four bottles of beer on the wall, sixty-four bottles of beer!
Take one down, pass it around, sixty-three bottles of beer on the wall!
Sixty-three bottles of beer on the wall, sixty-three bottles of beer!
Take one down, pass it around, sixty-two bottles of beer on the wall!
Sixty-two bottles of beer on the wall, sixty-two bottles of beer!
Take one down, pass it around, sixty-one bottles of beer on the wall!
Sixty-one bottles of beer on the wall, sixty-one bottles of beer!
Take one down, pass it around, sixty bottles of beer on the wall!
Sixty bottles of beer on the wall, sixty bottles of beer!
Take one down, pass it around, fifty-nine bottles of beer on the wall!
Fifty-nine bottles of beer on the wall, fifty-nine bottles of beer!
Take one down, pass it around, fifty-eight bottles of beer on the wall!
Fifty-eight bottles of beer on the wall, fifty-eight bottles of beer!
Take one down, pass it around, fifty-seven bottles of beer on the wall!
Fifty-seven bottles of beer on the wall, fifty-seven bottles of beer!
Take one down, pass it around, fifty-six bottles of beer on the wall!
Fifty-six bottles of beer on the wall, fifty-six bottles of beer!
Take one down, pass it around, fifty-five bottles of beer on the wall!
Fifty-five bottles of beer on the wall, fifty-five bottles of beer!
Take one down, pass it around, fifty-four bottles of beer on the wall!
Fifty-four bottles of beer on the wall, fifty-four bottles of beer!
Take one down, pass it around, fifty-three bottles of beer on the wall!
Fifty-three bottles of beer on the wall, fifty-three bottles of beer!
Take one down, pass it around, fifty-two bottles of beer on the wall!
Fifty-two bottles of beer on the wall, fifty-two bottles of beer!
Take one down, pass it around, fifty-one bottles of beer on the wall!
Fifty-one bottles of beer on the wall, fifty-one bottles of beer!
Take one down, pass it around, fifty bottles of beer on the wall!
Fifty bottles of beer on the wall, fifty bottles of beer!
Take one down, pass it around, forty-nine bottles of beer on the wall!
Forty-nine bottles of beer on the wall, forty-nine bottles of beer!
Take one down, pass it around, forty-eight bottles of beer on the wall!
Forty-eight bottles of beer on the wall, forty-eight bottles of beer!
Take one down, pass it around, forty-seven bottles of beer on the wall!
Forty-seven bottles of beer on the wall, forty-seven bottles of beer!
Take one down, pass it around, forty-six bottles of beer on the wall!
Forty-six bottles of beer on the wall, forty-six bottles of beer!
Take one down, pass it around, forty-five bottles of beer on the wall!
Forty-five bottles of beer on the wall, forty-five bottles of beer!
Take one down, pass it around, forty-four bottles of beer on the wall!
Forty-four bottles of beer on the wall, forty-four bottles of beer!
Take one down, pass it around, forty-three bottles of beer on the wall!
Forty-three bottles of beer on the wall, forty-three bottles of beer!
Take one down, pass it around, forty-two bottles of beer on the wall!
Forty-two bottles of beer on the wall, forty-two bottles of beer!
Take one down, pass it around, forty-one bottles of beer on the wall!
Forty-one bottles of beer on the wall, forty-one bottles of beer!
Take one down, pass it around, forty bottles of beer on the wall!
Forty bottles of beer on the wall, forty bottles of beer!
Take one down, pass it around, thirty-nine bottles of beer on the wall!
Thirty-nine bottles of beer on the wall, thirty-nine bottles of beer!
Take one down, pass it around, thirty-eight bottles of beer on the wall!
Thirty-eight bottles of beer on the wall, thirty-eight bottles of beer!
Take one down, pass it around, thirty-seven bottles of beer on the wall!
Thirty-seven bottles of beer on the wall, thirty-seven bottles of beer!
Take one down, pass it around, thirty-six bottles of beer on the wall!
Thirty-six bottles of beer on the wall, thirty-six bottles of beer!
Take one down, pass it around, thirty-five bottles of beer on the wall!
Thirty-five bottles of beer on the wall, thirty-five bottles of beer!
Take one down, pass it around, thirty-four bottles of beer on the wall!
Thirty-four bottles of beer on the wall, thirty-four bottles of beer!
Take one down, pass it around, thirty-three bottles of beer on the wall!
Thirty-three bottles of beer on the wall, thirty-three bottles of beer!
Take one down, pass it around, thirty-two bottles of beer on the wall!
Thirty-two bottles of beer on the wall, thirty-two bottles of beer!
Take one down, pass it around, thirty-one bottles of beer on the wall!
Thirty-one bottles of beer on the wall, thirty-one bottles of beer!
Take one down, pass it around, thirty bottles of beer on the wall!
Thirty bottles of beer on the wall, thirty bottles of beer!
Take one down, pass it around, twenty-nine bottles of beer on the wall!
Twenty-nine bottles of beer on the wall, twenty-nine bottles of beer!
Take one down, pass it around, twenty-eight bottles of beer on the wall!
Twenty-eight bottles of beer on the wall, twenty-eight bottles of beer!
Take one down, pass it around, twenty-seven bottles of beer on the wall!
Twenty-seven bottles of beer on the wall, twenty-seven bottles of beer!
Take one down, pass it around, twenty-six bottles of beer on the wall!
Twenty-six bottles of beer on the wall, twenty-six bottles of beer!
Take one down, pass it around, twenty-five bottles of beer on the wall!
Twenty-five bottles of beer on the wall, twenty-five bottles of beer!
Take one down, pass it around, twenty-four bottles of beer on the wall!
Twenty-four bottles of beer on the wall, twenty-four bottles of beer!
Take one down, pass it around, twenty-three bottles of beer on the wall!
Twenty-three bottles of beer on the wall, twenty-three bottles of beer!
Take one down, pass it around, twenty-two bottles of beer on the wall!
Twenty-two bottles of beer on the wall, twenty-two bottles of beer!
Take one down, pass it around, twenty-one bottles of beer on the wall!
Twenty-one bottles of beer on the wall, twenty-one bottles of beer!
Take one down, pass it around, twenty bottles of beer on the wall!
Twenty bottles of beer on the wall, twenty bottles of beer!
Take one down, pass it around, nineteen bottles of beer on the wall!
Nineteen bottles of beer on the wall, nineteen bottles of beer!
Take one down, pass it around, eighteen bottles of beer on the wall!
Eighteen bottles of beer on the wall, eighteen bottles of beer!
Take one down, pass it around, seventeen bottles of beer on the wall!
Seventeen bottles of beer on the wall, seventeen bottles of beer!
Take one down, pass it around, sixteen bottles of beer on the wall!
Sixteen bottles of beer on the wall, sixteen bottles of beer!
Take one down, pass it around, fifteen bottles of beer on the wall!
Fifteen bottles of beer on the wall, fifteen bottles of beer!
Take one down, pass it around, fourteen bottles of beer on the wall!
Fourteen bottles of beer on the wall, fourteen bottles of beer!
Take one down, pass it around, thirteen bottles of beer on the wall!
Thirteen bottles of beer on the wall, thirteen bottles of beer!
Take one down, pass it around, twelve bottles of beer on the wall!
Twelve bottles of beer on the wall, twelve bottles of beer!
Take one down, pass it around, eleven bottles of beer on the wall!
Eleven bottles of beer on the wall, eleven bottles of beer!
Take one down, pass it around, ten bottles of beer on the wall!
Ten bottles of beer on the wall, ten bottles of beer!
Take one down, pass it around, nine bottles of beer on the wall!
Nine bottles of beer on the wall, nine bottles of beer!
Take one down, pass it around, eight bottles of beer on the wall!
Eight bottles of beer on the wall, eight bottles of beer!
Take one down, pass it around, seven bottles of beer on the wall!
Seven bottles of beer on the wall, seven bottles of beer!
Take one down, pass it around, six bottles of beer on the wall!
Six bottles of beer on the wall, six bottles of beer!
Take one down, pass it around, five bottles of beer on the wall!
Five bottles of beer on the wall, five bottles of beer!
Take one down, pass it around, four bottles of beer on the wall!
Four bottles of beer on the wall, four bottles of beer!
Take one down, pass it around, three bottles of beer on the wall!
Three bottles of beer on the wall, three bottles of beer!
Take one down, pass it around, two bottles of beer on the wall!
Two bottles of beer on the wall, two bottles of beer!
Take one down, pass it around, one bottle of beer on the wall!
One bottle of beer on the wall, one bottle of beer!
Take one down, pass it around, no more bottles of beer on the wall!
$

ちなみに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;
},
    capitalize = function( s ) {
        return s[0].toUpperCase() + s.slice(1).toLowerCase();  
    },
    n = 99,
    m = englishNumber(n),
    result = capitalize( m ) + " bottles of beer on the wall, " + m + " bottles of beer!\n",
    i, min;
for (i = n - 1, min = 2; i >= min; i -= 1) {
    m = englishNumber( i );
    result += "Take one down, pass it around, " + m +
         " bottles of beer on the wall!\n" + capitalize( m ) +
         " bottles of beer on the wall, " + m +
         " bottles of beer!\n";
}
m = englishNumber( 1 );
result += "Take one down, pass it around, " + m + " bottle of beer on the wall!\n" +
    capitalize( m ) + " bottle of beer on the wall, " + m + " bottle of beer!\n" +
    "Take one down, pass it around, no more bottles of beer on the wall!";
$('#pre0').text(result);



好きな本数で。



上記のHTML, JavaScriptのソース

<p>好きな本数で。</p>
<label>n: <input id="t0" type="text" value="" 
size="4" maxlength="4" onkeyup="p(this.value)" style="text-align:right"/>本</label>
<pre id="pre1"></pre>

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 ) {
        var n = parseInt(n, 10),
            m = englishNumber(n),
            result = m + " bottles of beer on the wall, " + m + " bottles of beer!\n",
            i, max;
        for (i = n - 1, min = 2; i >= min; i -= 1) {
            m = englishNumber( i );
            result += "Take one down, pass it around, " + m +
                " bottles of beer on the wall!\n" + m +
                " bottles of beer on the wall, " + m +
                " bottles of beer!\n";
        }
        m = englishNumber( 1 );
        result += "Take one down, pass it around, " + m + " bottle of beer on the wall!\n" +
            m + " bottle of beer on the wall, " + m + " bottle of beer!\n" +
            "Take one down, pass it around, no more bottles of beer on the wall!";
        $('#pre1').text(result);
    };

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

n = 5
m = englishNumber( n )
print("{0} bottles of beer on the wall, {1} bottles of beer!".format( m.capitalize(), m ))
for i in range(n - 1, 1, -1):
    m = englishNumber( i )
    print("Take one down, pass it around, {0} bottles of beer on the wall!".format(m))
    print("{0} bottles of beer on the wall, {1} bottles of beer!".format(m.capitalize(), m))
m = englishNumber( 1 )
print("Take one down, pass it around, {0} bottle of beer on the wall!".format(m))
print("{0} bottle of beer on the wall, {1} bottle of beer!".format(m.capitalize(), m))
print("Take one down, pass it around, no more bottles of beer on the wall!")

入出力結果(Terminal)

$ ./sample.py
Five bottles of beer on the wall, five bottles of beer!
Take one down, pass it around, four bottles of beer on the wall!
Four bottles of beer on the wall, four bottles of beer!
Take one down, pass it around, three bottles of beer on the wall!
Three bottles of beer on the wall, three bottles of beer!
Take one down, pass it around, two bottles of beer on the wall!
Two bottles of beer on the wall, two bottles of beer!
Take one down, pass it around, one bottle of beer on the wall!
One bottle of beer on the wall, one bottle of beer!
Take one down, pass it around, no more bottles of beer on the wall!
$

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;
}

my $n = 5;
my $m = english_number $n;
print ucfirst $m, " bottles of beer on the wall, $m bottles of beer!\n";
for(reverse (1..($n - 1))) {
    $m = english_number $_;
    print "Take one down, pass it around, $m bottles of beer on the wall!\n";
    print ucfirst $m, " bottles of beer on the wall, $m bottles of beer!\n";
}
$m = english_number 1;
print "Take one down, pass it around, $m bottle of beer on the wall!\n";
print ucfirst $m, " bottle of beer on the wall, $m bottle of beer!\n";
print "Take one down, pass it around, no more bottles of beer on the wall!\n";

入出力結果(Terminal)

$ ./sample.pl
Five bottles of beer on the wall, five bottles of beer!
Take one down, pass it around, four bottles of beer on the wall!
Four bottles of beer on the wall, four bottles of beer!
Take one down, pass it around, three bottles of beer on the wall!
Three bottles of beer on the wall, three bottles of beer!
Take one down, pass it around, two bottles of beer on the wall!
Two bottles of beer on the wall, two bottles of beer!
Take one down, pass it around, one bottles of beer on the wall!
One bottles of beer on the wall, one bottles of beer!
Take one down, pass it around, one bottle of beer on the wall!
One bottle of beer on the wall, one bottle of beer!
Take one down, pass it around, no more bottles of beer on the wall!
$

0 コメント:

コメントを投稿