k3cの日記: コーディング 2
bravoさんがExcelの列番(A~IV)を0~255の数字に変換するPerlスクリプトを書いておられた。
で、これだと列番が3桁(AAAとか)になったときに機能しないので、別のラクダを連れてきたら、それを蛇にすり替えたり、紅い石に変えたりするヒトが現れた。
例題としてなかなか面白いのではないかと思うので、ワタシが元のbravoさんのコードをどのように変えたかをメモしておこうと思う。
(1) 内部コードの統一は徹底的にやる
内部的に小文字に統一して処理するなら、引数を読み込んだ時点で全部まとめて小文字にすればよろしい。その方が関数呼び出しの回数が少なくて済むし、それ以降は大文字小文字とか気にせずに済み、結果的に可読性も向上する。
(2) 難しい処理は人間がやるように書く
アルファベットはAからZまであるので26進数だとか考えていきなりうまく処理しようとすると混乱する。というか絶対うまくいかない。そういうときはまず慣れた10進数で考える。
例えば15という文字列を数字として読むとき、ヒトは頭の中で
・最初の1を見る→1をカウント
・次に5を見る→さっきの1は桁を繰り上げて(10倍して)、5を足す
というように(瞬時に)処理している。26進数も同じようにやればコーディングしやすいはずだ。
例えば、IVという列番を数字に直すとき、ヒトはどう処理するか。
・まずIを見て、9に置き換える
・次にVが来るので、9を26倍する(=234)
・Vを22に変換して足す(=256)
・1を引いて0起点にする(=255)
というふうに処理するはずだ。…よね?
なので、reverseせずにそのままforeachに食わせればよい。要は、
・次の文字があるなら、それまでの数字を26倍
・次の文字を数字に置換して加える
という処理を、文字がなくなるまでやればよろしい。最後に1を引けば終了。というか1を引くのは最後にしなさい。(←たぶんこれがいちばん肝心)10進数と違うことをやろうとすると間違いの元になる。
(3) 宵越しの金は持たない
これは好みの問題。return文は可読性のために明示するが、何を返すかはその行で記述してしまえばよい。
という感じであのコードになったわけだ。なので、Python版のコードでまたループの中にc.lowerが復活しているのは、はっきり言って心外だ(わら
ところで、Ruby版は…なんだこりゃ…呪文か?上の(2)がないのだな…文法に人間が合わせてしまっている…まあポリシーの違いと言ってしまえばそれまでだが。
で、せっかくみんな一生懸命書いているのだが、実はExcelの列番はIV(=255)までしかないので、bravoさんオリジナルのコードで十分機能するのだった(爆
終了。
うはははは (スコア:1)
いやはや (スコア:1)