2013年1月13日日曜日

ACM/ICPCを解くの巻その3~携帯メッセージ~

こんにちは,今回問題はこちらです.

携帯の入力を実装しろってことですね.
今はスマホでフリック操作だから関係ねえよ!と思ったあなた,私もです.

この手の問題はとりあえず辞書が必要ですね.
作ります.


one   = ['.',',','!','?',' ']
two   = ['a','b','c']
three = ['d','e','f']
four  = ['g','h','i']
five  = ['j','k','l']
six   = ['m','n','o']
seven = ['p','q','r','s']
eight = ['t','u','v']
nine  = ['w','x','y','z']
dict = [one,two,three,four,five,six,seven,eight,nine]

こんな感じでしょうか.
次はメインの変換関数です.引数は1行分の数字の列にしました.

流れとしては

for 数字 in 数字列:
  数字が"0"じゃないなら
    辞書から数字の部分を取り出す.
    数字が連続した回数(count)を辞書の長さで割った余りの位置にあるアルファベットを取り出す.
    この文字を仮のアルファベットにする.
    countを1増やす
  数字が"0"なら
    仮のアルファベットを確定して返り値用の文字列の最後に追加する.
    仮のアルファベットをリセットする.
    countもリセットする.

全部終わったら,返り値用の文字列を返す.
こういきます. 詳しくはコードをみてください.

特に難しくもない課題かなあとおもいました.


余談ですが,今回までのような,上からデータを処理していくような問題は,for文で回してindexの値を使うよりも,while文とdeque()を使った方が簡単なんじゃないかと思いました.

ACM/ICPCを解くの巻その2~大賀家の資産~

今回のはこれです。
なんか難しそうですね~(笑)

話によると資産管理をしたいので,いくつかの方法で運用した場合の結果から一番成績がいいものを選びたいらしい,なるほど

ちなみに入力データは
入力はいくつかのデータセットが並んだものである.全体としては以下 のような形式になる.

データセット数(=m)
データセット1の記述
データセット2の記述
...
データセットmの記述
「データセット数」mは100を越えないものとする. 各「データセット」の記述は以下の形式をしている.
初期運用資金量
運用年数
運用方法の種類数(=n)
運用方法1の記述
運用方法2の記述
...
運用方法nの記述
「初期運用資金量」,「運用年数」,「運用方法の種類数」nはいずれも正整数で, 資金量は1億を,運用年数は10を,種類数は100を越えることはない.
各「運用方法」の記述は以下の形式をしている.
単利・複利の別 年利率 毎年の手数料
と書いてある.
最初見た感想は「うわメンドクサソウ.」

私は何を考えたのか「クラス作ってやればいける!」と考えました.
  1. データセットの数でインスタンス作成
  2. それに順々に初期値資金,運用年数を突っ込む
  3. 運用方法の種類でリストかなんかを作って,そこに運用方法を格納
  4. 全部の運用方法を試して保存し,最大を出力
まあ案の定めんどくさかったですが,できました. 詳しくは私のgithubをごらんください.


完成した後に思いついてしまったのですが,これ別にクラスとかいらなかったんじゃないか?
必要なのは,引数に運用方法,初期資金,運用年数,手数料をもって,戻り値に結果の資金を返す関数だけでよかったんじゃない?
なので修正したコードを書いています.近日公開です.

最後に今回から文章の句読点を,.にしました.論文もこの形式なので合わせました.