Squeak Smalltalk でシーザー暗号を簡単に


有名なところでは(で、それがデマであることは作者によって明らかにされているところではありますが(^_^;))'HAL' -> 'IBM' となるところのアレ。ふつうに一点の曇りもない読んだそのまんまの手続き的に書くと、

'HAL' collect: [:each | (each asciiValue + 1) asCharacter]   "=> 'IBM' "


…です(ただし、$z は考慮せず)が、これを読み下しやすさを多少犠牲にしても良いのでもっとこう簡単に書けないものかと常々(嘘)思っていたところ、つい先ほど良いのを思いついたのでメモ。

('HAL' asByteArray + 1) asString   "=> 'IBM' "


Squeak Smalltalk において配列への「 + 数値 」というメッセージ送信は、各要素と引数の数値との和を要素とする配列を返す、という振る舞いを利用しています。

#(1 2 3 4) + 1   "=> #(2 3 4 5) "


どーしてもアルファベティカルに考えなきゃならないときなどに便利なので重宝しそうです。w



追記
読み手無視の、もっと凶悪なのを思いついたのでこっちもメモ。

'', (ByteArray new, 'HAL' + 1)   "=> 'IBM' "


バイト配列のリテラルのある GNU Smalltalk とか VisualWorks だともっと短くできるかなぁ…と思ったのですが、これらには肝心の Array>>#+ がありませんでした。ちぇっ。