セットプチフォッカ

勉強したアウトプット、ときどきフォッカチオ作っていました

雑なプログラミング問題(LEET変換プログラム)

ネットで見かけたプログラミング問題をRubyで解いてみました。簡単なテストコードも作ったので、みなさんも是非解いてみてください。

問題

Leet - Wikipediaとは、一部のアルファベットを一定のルールに基づき、数値や記号に変換して表す遊び、仕組みです。 ここでは、以下の変換ルールが適用されています。

  • a/A = 4
  • b/B = 8
  • e/E = 3
  • l/L = 1
  • o/O = 0
  • s/S = 5
  • t/T = 7
  • z/Z = 2

例えば、文字列I am a studentI 4m 4 57ud3n7に置き換えられます。
変換対象の文字列:original_stringが与えられるので、それをleet文字列に変換した結果を返す関数leetifyを作成してください。

# 出力例
leetify('I am a student') # I 4m 4 57ud3n7
leetify('do re mi fa so ra si do') # d0 r3 mi f4 50 r4 5i d0
leetify('Dairantou smash brothers') # D4ir4n70u 5m45h 8r07h3r5

テストコード

gist.github.com

回答

ハッシュテーブルを利用して変換します。

gist.github.com

解説

すごい短いので解説することもないですが...

今回は文字列をString#charsを利用して一文字ずつ配列に分解し、ハッシュテーブルを利用することで変換しています。
ハッシュテーブルに値がない場合は文字列そのままを返す必要があるのですが、これは短絡評価を利用することで短く表記しています。

3項演算子を使って書いてみると以下のような感じです。

def leetify(original_string)
  string.chars.map { |s| LEET_TABLE[s] ? LEET_TABLE[s] : s }
end

ちなみに、すべてハッシュテーブルの中に値があることがわかっている場合は以下のように書けます。

def leetify(original_string)
  string.chars.map(&LEET_TABLE)
end

この記法はHash#to_proc (Ruby 3.0.0 リファレンスマニュアル)を利用したものです。


おしまい