名古屋で数学するプログラマ(仮)

@antimon2 が趣味兼一部本職の数学で何かするときのブログ。

平成変換チェッカースクリプト組んでみた

一昨日の続き。

平成変換チェック

平成変換の結果をチェックするスクリプトを Ruby で書いてみました。
スクリプト本体は gist に上げてあります。最後に埋め込みます。

使い方

prompt$ ./heisei_henkan_check.rb [year] < textfile

または

prompt$ ./heisei_henkan_check.rb [year] textfile

  • 平成変換の結果を表す 1 行のテキストファイルを、標準入力(リダイレクト)または引数で指定してください。
    正しい変換になっているかチェックします。
  • 引数 [year](整数 > 0)を指定すると、指定した年の西暦年から平成年への平成変換としてチェックします。年は西暦でも平成年でもOK。
    省略可能、省略すると年のチェックを行いません(西暦年から対応する平成年への平成変換でなくてもチェックエラーに成りません)。

例:

prompt$ cat 3to7.txt
[3]->[9]->[8]1->6(4)1->6[21]->(64)41->(841)->[2]9->(49)->7


prompt$ ./heisei_henkan_check.rb < 3to7.txt
OK: 9 step(s).


prompt$ cat 1991.txt
19(9)1->19[31]->[19](9)61->(36)1(36)1->6(16)1->(64)1->(81)->(9)->3


prompt$ ./heisei_henkan_check.rb 1991 1991.txt
OK: 8 step(s).


prompt$ ./heisei_henkan_check.rb 1991 1991.txt
OK: 8 step(s).

チェック内容

以下をチェックします。

  • 文字種チェック。
    数字、「[」「]」「(」「)」「-」「>」以外の文字が含まれていたらエラーとなります。
  • ネストチェック。
    「[ ]」や「( )」のネスト(入れ子)があるとエラーとなります。
    • 例:[9(9)]←×
  • 平方根チェック。
    「( )」で括られた中身が平方数出ない場合エラーとなります。
    • 例:7(18)8←×
  • [0x], [1], (0x), (1) チェック。
    これらの禁止事項に該当する場合もエラーとなります。
  • 書式チェック。
    各ステップが正しい平成変換の書式になっていない(カッコの対応、「>」の単独混入等)場合にエラーとなります。
    特に一番最後の項は数字以外の文字が含まれていたらエラーとなります。
  • ステップチェック。
    前の数と後の数が正しい変換になっていない場合にエラーとなります。
    • 例:[12]->1444←×
  • 指定年チェック。
    引数 year を指定した場合、最初の数が指定した西暦年、最後の数が対応する平成年になっていないとエラーとなります。
    • 例:[13]->(16)9->(49)->7 ← year 引数を指定した場合は×
    • ※ 逆に year 引数を指定しなければ、年の対応とは無関係な変換の途中経過の確認ができます。
  • ステップ数チェック。
    エラーがなければ、ステップ数を結果として出力します。
スクリプト本体

難しいことしてないので Ruby 1.8.7/1.9.x/2.0.0 どれでも動きます。

おまけ。ユニットテスト(TestCase)。
標準ライブラリの test/unit を使用しているので、やはり Ruby 1.8.7/1.9.x/2.0.0 どれでも動作。

注意事項?

あくまで、「平成変換の結果をチェックするスクリプト」であり、平成変換の解答を探索するものではありません。
さすがにそこまでのネタばらしはやりません(^-^)

ただ、このチェックスクリプトを見るだけで、この『平成変換』の問題を考えるにあたって、気にしなきゃならないことの一つに気付くでしょう。
Ruby の Fixnum→Bignum 自動拡張って便利ですね。あ、これ独り言です。

Let's enjoy 平成変換 life!