2013年10月11日金曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の9章(自作メソッドの書き方), 9.5(練習問題)、モダンなローマ数字をDartで解いてみる。

その他参考書籍

モダンなローマ数字

コード

sample.dart

String replicate(int n, String s){
  return new List.filled(n, s).join();
}

String romanNumeral(int nums){
  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 = nums ~/ k;
  nums %= 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 = nums ~/ k;
    nums %= 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;
}

void main() {
  print(romanNumeral(4));
  print(romanNumeral(9));
  for(var i = 1010; i < 1021; i += 1){
    print('${i}: ${romanNumeral(i)}');
  }
}

入出力結果

IV
IX
1010: MX
1011: MXI
1012: MXII
1013: MXIII
1014: MXIV
1015: MXV
1016: MXVI
1017: MXVII
1018: MXVIII
1019: MXIX
1020: MXX

0 コメント:

コメントを投稿