パスワードを忘れた? アカウント作成
452612 journal

k3cの日記: コーディング 2

日記 by k3c

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さんオリジナルのコードで十分機能するのだった(爆

終了。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

犯人はmoriwaka -- Anonymous Coward

読み込み中...