おひさしぶりです。


Rubyで数字をローマ数字で表示してください。

参考:http://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%9E%E6%95%B0%E5%AD%97

例:
1 => I
4 => IV
15 => XV

◎この質問は、プログラムの書き方がわからないのではなく「こんな書き方もできる」の募集です。
◎面白いプログラム、とても短いプログラム、トリッキーなもや勉強になるものは喜ばしいです。
◎Rubyがダメな人はRuby以外でも可

回答の条件
  • 1人2回まで
  • 登録:2007/08/23 14:14:05
  • 終了:2007/08/30 14:15:54

回答(3件)

id:wm5775 No.1

wm5775回答回数351ベストアンサー獲得回数42007/08/23 15:44:41

ポイント27pt

#質問の意図と違っていたらすみません。

こちらにそのものズバリの例題が載ってました。

Dive Into Python

Dive Into Python

  • 作者: Mark Pilgrim
  • 出版社/メーカー: A-Press
  • メディア: ペーパーバック

#test firstやunit testの例題で出ていたと思います。

id:nisyu

回答ありがとうございます。

意図が伝わりにくい出題ですみませんが(汗

プログラムそのもので回答(いろいろな解案)を希望しています。

引き続き、よろしくお願いいたします。

2007/08/23 17:45:26
id:GEN111 No.2

GEN111回答回数472ベストアンサー獲得回数582007/08/24 13:09:02

ポイント27pt

出来栄えにあまり自信はないけど JavaScript で。

フォントの都合上 3999 までにしました。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
  <head>
    <script type="text/javascript">
      function a2r() {
        rnumerals1 = ['I', 'X', 'C', 'M'] ;
        rnumerals5 = ['V', 'L', 'D']

        d = document.exForm.digits.value ;

        if (isNaN(d) || d <= 0 || d > 3999 || d.indexOf('.') > 0) {
          document.getElementById('result').innerHTML = 'アラビア数字で 1~3999 までの自然数を入力してください。' ;
          return ;
        }

        romanNum = '' ;
        for (n = 0; n < d.length; ++n) {
          an = d.charAt(n) ;
          if (an == 4 || an == 9) {
            romanNum += rnumerals1[d.length - n - 1] + ((an == 4) ? rnumerals5[d.length - n - 1] : rnumerals1[d.length - n]) ;
          }
          else {
            if (an >= 5) {
              romanNum += rnumerals5[d.length - n - 1] ;
              an -= 5 ;
            }
            for (m = 0; m < an; ++m) {
              romanNum += rnumerals1[d.length - n - 1] ;
            }
          }
        }

        document.getElementById('result').innerHTML = romanNum ;
      }
    </script>
  </head>

  <body>
    <form name="exForm">
      <div>
        <div id="result"> </div>
        <input type="text" name="digits" /><input type="submit" onclick="a2r(); return false;" value="変換" />
      </div>
    </form>
  </body>
</html>
id:nisyu

試しました。正しく出ているようです。

これでできるんですねぇ。

まだ自分で書いてないんで(汗)すけど、もっと長くなるかと思っていたので驚きました。

ありがとうございます。

引き続き、別のやり方やもっと短くなるものなど募集〜

2007/08/24 20:25:47
id:GEN111 No.3

GEN111回答回数472ベストアンサー獲得回数582007/08/24 21:03:34

ポイント26pt

Ruby は分からないので PHP で。

最初に全体をIXCMに変換してから 4、5、9 を変換。

<?php
$d = $_POST['digits'] ;
if (!ctype_digit($d) || $d < 1 || $d > 3999) $result = 'アラビア数字で 1~3999 までの自然数を入力してください。' ;
else {
  $rnumerals1 = array('I', 'X', 'C', 'M') ;
  $rnumerals5 = array('V', 'L', 'D') ;

  $l = strlen($d)-1 ;
  $result = preg_replace('/(\d)/e', 'str_repeat($rnumerals1[$l--], $1)', $d) ;
  $result = preg_replace('/((\w)(\2{8}|\2{4}|\2{3}))/e',
                         '(strlen("$1") != 5 ? "$2" : "").(strlen("$1") == 9 ? $rnumerals1[array_search("$2", $rnumerals1)+1] : $rnumerals5[array_search("$2", $rnumerals1)])',
                         $result) ;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
  <head>
  </head>

  <body>
    <form action="./<?php echo basename(__FILE__) ?>" method="post">
      <div>
        <div><?php echo $result ; ?></div>
        <input type="text" name="digits" value="" /><input type="submit" value="変換" />
      </div>
    </form>
  </bdoy>
</html>
id:nisyu

ありがとうございます。

こちらのほうがすっきりしてる気がしますね。

2007/08/27 15:25:27

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません