#! /usr/local/bin/perl ## --------------------------------------------------------- ## 入力されたローマ数字をアラビア(インド?)数字に変換 ## --- 入力されたローマ数字の適切性は判断しません (^_^; ## --------------------------------------------------------- ## num_rom2ara の部分が本体で、それより前についてるのは付録 $|=1; print '>'; while(<>) { s/[ \t\r\n]+//g; if(/^$/) { last; } $ret = &num_rom2ara($_); print "$ret\n>"; } exit; ## ==== ここからが本体 ==== sub num_rom2ara { ## BUGS ... 3999 以下の数字にしか対応してない (^_^; ## というか 5000 以上の文字は知らないから‥ local($rom) = @_; local($ara, $a); $rom =~ y/a-z/A-Z/; ## 先に例外処理をしてしまってから‥ $a = ( $rom =~ s/CM//g ); $ara += 900 * $a; $a = ( $rom =~ s/CD//g ); $ara += 400 * $a; $a = ( $rom =~ s/XC//g ); $ara += 90 * $a; $a = ( $rom =~ s/XL//g ); $ara += 40 * $a; $a = ( $rom =~ s/IX//g ); $ara += 9 * $a; $a = ( $rom =~ s/IV//g ); $ara += 4 * $a; ## あとは要素の数をひたすら足していくだけ $a = ( $rom =~ s/M//g ); $ara += 1000 * $a; $a = ( $rom =~ s/D//g ); $ara += 500 * $a; $a = ( $rom =~ s/C//g ); $ara += 100 * $a; $a = ( $rom =~ s/L//g ); $ara += 50 * $a; $a = ( $rom =~ s/X//g ); $ara += 10 * $a; $a = ( $rom =~ s/V//g ); $ara += 5 * $a; $a = ( $rom =~ s/I//g ); $ara += 1 * $a; ## 結果を返す return $ara; }