人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

おひさしぶりです。

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以外でも可

●質問者: taka4
●カテゴリ:コンピュータ インターネット
✍キーワード:IV Ruby ダメ トリッキー プログラム
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● wm5775
●27ポイント

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

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

Dive Into Python

Dive Into Python

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

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

◎質問者からの返答

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

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

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

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


2 ● GEN111
●27ポイント

出来栄えにあまり自信はないけど 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>
◎質問者からの返答

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

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

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

ありがとうございます。

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


3 ● GEN111
●26ポイント

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>
◎質問者からの返答

ありがとうございます。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ