Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2912

マルチスケールシミュレーション特論: roman numerals

$
0
0

はじめに

今回は課題としてアラビア数字からローマ数字に変換するという課題が出たので、その課題を解いてみる事にする

解答

プログラム

  • 正直全く良い方法分からない、、、、、
num=ARGV[0]defdivide_num(num)ans_list,count=[],0whilenum>0tmp=num%10ans_list.push(tmp*(10**count))num=num/10count=count+1endreturnans_list.reverseendans_list,count=divide_num(num.to_i),0defnum_to_roman_hundred(num)ifnum==900print"CM"elsifnum<=800&&num>=500num=num-500ifnum!=0print"D"+"C"*(num/100)elseprint"D"endelsifnum==400print"CD"elsifnum<=300&&num>=100num=num-100ifnum!=0print"C"+"C"*(num/100)elseprint"C"endendenddefnum_to_roman_ten(num)ifnum==90print"XC"elsifnum<=80&&num>=50num=num-50ifnum!=0print"L"+"X"*(num/10)elseprint"L"endelsifnum==40print"XL"elsifnum<=30&&num>=10num=num-10ifnum!=0print"X"+"X"*(num/10)elseprint"X"endendenddefnum_to_roman(num)roman_first=['I','II','III','IV','V','VI','VII','VIII','IX','X']ifnum>=1000tmp=num/1000x="M"*tmpprintxelsifnum<=900&&num>=100num_to_roman_hundred(num)elsifnum<=90&&num>=10num_to_roman_ten(num)elsifnum<=10&&num>=1printroman_first[num-1]endendforiinans_listdonum_to_roman(i)endprint"\n"

自分で書いてて思います。頭悪い実装です(笑)

(深夜にやっていて頭回ってないという言い訳をしときます(笑))

個別の関数毎の説明

  • divide_num 関数の中で受けとった数字を分解

  • num_to_roman_hundred, num_to_roman_ten はそれぞれの桁数に合わせてローマ数字に変換を行う

  • num_to_roman で全ての数字をローマ数字に変換

答え合わせ

では作成したプログラムが正しいかどうかの答え合わせをしましょう!!

  • 以下のようなプログラム(a.sh)を作成します

    for i in$(seq 1 3999);do
      ruby a.rb $i# a.rb はソースコードの名前なので何でもいいですdone
  • bash a.sh > tmp.txt

  • エクセルから 3999 までのローマ数字を作成(1 分以内で可能)し、tmp2.txt として保存

  • diff tmp.txt tmp2.txt

何も出力されなければ成功!!

逆に出力されたら失敗してます。。。

GitHub

以下の URL に全てのプログラムと txt file を置いておきます。


  • source ~/Downloads/git/grad_members_20f/members/taiseiyo/memos/roman.org

Viewing all articles
Browse latest Browse all 2912

Trending Articles