2013年10月23日水曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の13章(新しいクラスの作成と既存クラスの変更), 13.1(練習問題)、組み込みクラスの拡張をDartで解いてみる。

その他参考書籍

クラス(定義、インスタンス)

コード

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 コメント:

コメントを投稿