開発環境
- OS X Lion - Apple(OS)
- Dart SDK (開発環境)
- Dart (プログラミング言語)
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の13章(新しいクラスの作成と既存クラスの変更), 13.1(練習問題)、組み込みクラスの拡張をDartで解いてみる。
その他参考書籍
- What is Dart? [Kindle版] (O'Reilly Media) Kathy Walrath Seth Ladd (著) このブログでの感想
クラス(定義、インスタンス)
コード
sample.dart
import 'dart:math' as math;
class MyInt{
int num;
MyInt(this.num);
int factorial(){
if(num < 0){
throw '負の数の階乗は求められない。';
}
if (num <= 1){
return 1;
}
return num * new MyInt(num - 1).factorial();
}
String _replicate(int n, String s){
return new List.filled(n, s).join();
}
String toRoman(){
String result = "";
Map<int,String> num_roman = {1000: 'M',
100: {5:'D', 1:'C'},
10: {5: 'L', 1:'X'},
1: {5: 'V', 1: 'I'}};
var keys = num_roman.keys.toList();
keys.sort((a, b) => b - a);
var k = keys.removeAt(0);
var n = num ~/ k;
num %= k;
var c = num_roman[k];
var pre_c = c;
result += _replicate(n, c);
for(k in keys){
c = num_roman[k];
var roman_five = c[5];
var roman_one = c[1];
n = num ~/ k;
num %= k;
if(n==9){
result += roman_one + pre_c;
} else if(n == 4){
result += roman_one + roman_five;
} else {
result += _replicate(n ~/ 5, roman_five);
result += _replicate(n % 5, roman_one);
}
pre_c = roman_one;
}
return result;
}
}
class MyList{
List a;
MyList(this.a);
List shuffle(){
return _recursiveShuffle (a, []);
}
List _recursiveShuffle(List unshuffled_list, List shuffled_list){
var a = unshuffled_list.length;
if(a == 0){
return shuffled_list;
}
var random = new math.Random();
var r = random.nextInt(a);
shuffled_list.add(unshuffled_list[r]);
var tmp = unshuffled_list.sublist(0, r);
tmp.addAll(unshuffled_list.sublist(r + 1));
return _recursiveShuffle(tmp, shuffled_list);
}
}
void main(){
var n = 1294;
print(new MyList(([1, 2, 3, 4, 5, 6, 7, 8, 9, 10].
map((x) => x.toString())).
toList()).shuffle());
print('10! = ${new MyInt(10).factorial()}');
print('${n}: ${new MyInt(n).toRoman()}');
}
入出力結果
[3, 7, 10, 2, 9, 1, 4, 5, 8, 6] 10! = 3628800 1294: MCCXCIV
0 コメント:
コメントを投稿