2013年1月23日水曜日

開発環境

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

その他参考書籍

モダンなローマ数字

コード(BBEdit)

sample.rb

#!/usr/bin/env ruby1.9
#-*- coding: utf-8 -*-

def roman_numeral n
  roman = 'M' * (n / 1000)
  n = n % 1000
  h = n / 100
  n = n % 100
  t = n / 10
  o = n % 10
  if h != 9 and h != 4
    roman += 'D' * (h / 5)
    roman += 'C' * (h % 5)
  elsif h != 9
    roman += 'CD'
  else
    roman += 'CM'
  end
  if t != 9 and h != 4
    roman += 'L' * (h / 5)
    roman += 'X' * (h % 5)
  elsif t != 9
    roman += 'XL'
  else
    roman += 'XC'
  end
  if o != 9 and o != 4
    roman += 'V' * (o / 5)
    roman += 'I' * (o % 5)
  elsif o != 9
    roman += 'IV'
  else
    roman += 'IX'
  end
  roman
end

[4,42,458,4569].each do |n|
  puts "#{n}: #{roman_numeral n}"
end

入出力結果(Terminal)

$ ./sample.rb
4: IV
42: II
458: CDXLVIII
4569: MMMMDLIX
$

ちなみにJavaScriptの場合。

コード(BBEdit)

function repeat_string(s, n){
    var result = "";
 for(var i = 0; i < n; i++){
  result += s;
 }
 return result;
};
var roman_numeral = function(n){
 var roman = repeat_string('M', Math.floor(n / 1000));
 n = Math.floor(n % 1000);
 var h = Math.floor(n / 100);
 n = Math.floor(n % 100);
 var t = Math.floor( n / 10);
 var o = Math.floor(n % 10);
 if(h !== 9 && h !== 4){
  roman += repeat_string('D', Math.floor(h / 5));
  roman += repeat_string('C', Math.floor(h % 5));
 } else if(h !== 9){
  roman += 'CD';
 } else {
  roman += 'CM';
 }
 if(t !== 9 && t !== 4){
  roman += repeat_string('L', Math.floor(t / 5));
  roman += repeat_string('X', Math.floor(t % 5));
 } else if (t !== 9){
  roman += 'XL';
 } else {
  roman += 'XC';
 }
 if( o !== 9 && o !== 4){
  roman += repeat_string('V', Math.floor( o / 5));
  roman += repeat_string('I', Math.floor(o % 5));
 } else if ( o !== 9 ){
  roman += 'IV';
 } else {
  roman += 'IX';
 }
 return roman;
}
var n = parseInt($('#number').val(), 10);
$('#pre0').text(roman_numeral(n));





pythonの場合。

sample.py

コード(BBEdit)

#!////usr////bin////env python3.3
# -*- coding: utf-8 -*-

def roman_numeral(n):
    roman = 'M' * (n // 1000)
    n %= 1000
    h = n // 100
    n %= 100
    t = n // 10
    o = n % 10
    if h != 9 and h != 4:
     roman += 'D' * (h // 5)
     roman += 'C' * (h % 5)
    elif h != 9:
     roman += 'CD'
    else:
     roman += 'CM'
    if t != 9 and h != 4:
     roman += 'L' * (t // 5)
     roman += 'X' * (t % 5)
    elif t != 9:
     roman += 'XL'
    else:
     roman += 'XC'
    if o != 9 and o != 4:
     roman += 'V' * (o // 5)
     roman += 'I' * (o % 5)
    elif o != 9:
     roman += 'IV'
    else:
     roman += 'IX'
    return roman

for n in [4,42,458,4569]:
 print("{0}: {1}".format(n, roman_numeral(n)))

入出力結果(Terminal)

$ ./sample.py
4: IV
42: XXXXII
458: CDXLVIII
4569: MMMMDLXIX
$

perlの場合。

sample.pl

コード(BBEdit)

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.016;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
use POSIX;

sub roman_numeral{
 my $n = shift;
 my $roman = 'M' x floor( $n / 1000 );
 $n %= 1000;
 my $h = floor($n / 100);
 $n %= 100;
 my $t = floor($n / 10);
 my $o = $n % 10;
 if ($h != 9 && $h != 4) {
  $roman .= 'D' x floor($h / 5);
  $roman .= 'C' x floor($h % 5);
 } elsif ($h != 9){
  $roman .= 'CD';
 } else {
  $roman .= 'CM';
 }
 if ($t != 9 && $t != 4) {
  $roman .= 'L' x floor($t / 5);
  $roman .= 'X' x floor($t % 5);
 } elsif ($t != 9) {
  $roman .= 'XL';
 } else {
  $roman .= 'XC';
 }
 if ($o != 9 && $o != 4) {
  $roman .= 'V' x floor($o / 5);
  $roman .= 'I' x floor($o % 5);
 } elsif ($o != 9) {
  $roman .= 'IV';
 } else {
  $roman .= 'IX';
 }
 $roman;
}

for(4, 42, 458, 4569){
 print $_ . ": " . roman_numeral($_) . "\n";
}

入出力結果(Terminal)

$ ./sample.pl
4: IV
42: XLII
458: CDLVIII
4569: MMMMDLXIX
$

0 コメント:

コメントを投稿