開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- プログラミング言語: Ruby
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 13章(新しいクラスの作成と既存クラスの変更), 13.1(練習問題)組み込みクラスの拡張 を解いてみる。
その他参考書籍
- 『プログラミング言語 Ruby』David Flanagan, まつもと ゆきひろ 著 、卜部 昌平 監訳、長尾 高弘 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-394-4)
- Rubyクックブック ―エキスパートのための応用レシピ集
組み込みクラスの拡張
コード(BBEdit)
sample.rb
#!/usr/bin/env ruby1.9
#-*- coding: utf-8 -*-
class Array
def shuffle
some_array = self
result = []
a = some_array[0..some_array.length - 1]
while a.length > 0
r = rand a.length
result.push a[r]
a.delete_at r
end
result
end
end
class Integer
@@facs = {0 => 1,1 => 1}
@@romans = {}
def factorial
n = self
return "負の数" if n < 0
return @@facs[n] if @@facs[n]
@@facs[n] = n * ( n - 1 ).factorial
end
def to_roman
n = self
return @@romans[n] if @@romans[n]
result = 'M' * (n / 1000)
n = n % 1000
h = n / 100
n = n % 100
t = n / 10
n = n % 10
o = n
if h == 9
result += 'CM'
elsif h == 4
result += 'CD'
else
result += 'D' * (h / 5)
result += 'C' * (h % 5)
end
if t == 9
result += 'XC'
elsif t == 4
result += 'XL'
else
result += 'L' * (t / 5)
result += 'X' * (t % 5)
end
if o == 9
result += 'IX'
elsif o == 4
result += 'IV'
else
result += 'V' * (o / 5)
result += 'I' * (o % 5)
end
@@romans[n] = result
end
end
a = [1,2,3,4,5,'A','B','C','D','E','a','b','c','d','e']
5.times do
shuffled_a = a.shuffle
puts "シャッフル前: #{a.join " "}"
puts "シャッフル後: #{shuffled_a.join " "}"
end
n = 10
puts "#{n}! = #{n.factorial}"
puts 4.to_roman
puts 1234.to_roman
入出力結果(Terminal)
$ ./sample.rb シャッフル前: 1 2 3 4 5 A B C D E a b c d e シャッフル後: 3 c 4 5 b 2 A 1 d e D B a C E シャッフル前: 1 2 3 4 5 A B C D E a b c d e シャッフル後: 4 D C 3 b 1 E c d A B e 5 2 a シャッフル前: 1 2 3 4 5 A B C D E a b c d e シャッフル後: a D 5 e 2 d b c 4 1 C 3 B A E シャッフル前: 1 2 3 4 5 A B C D E a b c d e シャッフル後: C a 3 d 4 2 D e B 1 A b c 5 E シャッフル前: 1 2 3 4 5 A B C D E a b c d e シャッフル後: D B e 3 c 4 2 C 5 d 1 E a A b 10! = 3628800 IV MCCXXXIV $
ちなみにJavaScriptの場合。
コード(BBEdit)
Array.prototype.shuffle = function( ) {
var a = this.valueOf().slice(0),
result = [],
r;
while ( a.length > 0 ) {
r = Math.floor(Math.random() * a.length);
result.push(a[r]);
a.splice(r, 1);
}
return result;
};
Number.prototype.facs = {0:1, 1:1};
Number.prototype.factorial = function( ) {
var n = this.valueOf();
if((n).facs[n]) {
return (n).facs[n];
}
(n).facs[n] = n * (n - 1).factorial();
return (n).facs[n];
};
Number.prototype.to_roman = function ( ) {
var n = this.valueOf(),
result = new Array(Math.floor(n / 1000) + 1).join('M'),
h, t, o;
n %= 1000;
h = Math.floor( n / 100);
n %= 100;
t = Math.floor(n / 10);
n %= 10;
o = n;
switch ( h ) {
case 9:
result += 'CM';
break;
case 4:
result += 'CD';
break;
default:
result += new Array(Math.floor(h / 5) + 1).join('D');
result += new Array(h % 5 + 1).join('C');
}
switch ( t ) {
case 9:
result += 'XC';
break;
case 4:
result += 'XL';
break;
default:
result += new Array(Math.floor( t / 5) + 1).join('L');
result += new Array(Math.floor( t % 5 ) + 1).join('X');
}
switch ( o ) {
case 9:
result += 'IX';
break;
case 4:
result += 'IV';
break;
default:
result += new Array(Math.floor( o / 5 ) + 1).join('V');
result += new Array(Math.floor( o % 5 ) + 1).join('I');
}
return result;
};
var a = [1,2,3,4,5,'A','B','C','D','E','a','b','c','d','e'],
shuffled_a = a.shuffle(),
n = 10,
result = "シャッフル前: " + a.join(" ") + "\n" +
"シャッフル後: " + shuffled_a.join(" ") + "\n" +
n + "! = " + n.factorial() + "\n" +
(4).to_roman() + "\n" +
(1234).to_roman() + "\n";
$('#pre0').text(result);
0 コメント:
コメントを投稿