開発環境
- 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 コメント:
コメントを投稿