【Ruby】Leet文字列の解き方いろいろ


Leet文字列とは

leet(リート、1337、l33t)は、主に英語圏においてインターネット上で使われるアルファベットの表記法である。
たとえば、「Warez」という語を leet で表記すると、「W@rez」や「W4r3z」などとなるように、一部のアルファベットを形の似たアラビア数字や記号などに変化させる。

https://ja.wikipedia.org/wiki/Leet

なんかギャル文字(今は知らないですが)に通じるところがあるのかしら?と思いました笑

練習問題

問題

Leet と呼ばれるインターネットスラングがあります。
Leet ではいくつかのアルファベットをよく似た形の他の文字に置き換えて表記します。 Leet の置き換え規則はたくさんありますが、ここでは次の置き換え規則のみを考えましょう。
置き換え前→置き換え後
A→4
E→3
G→6
I→1
O→0
S→5
Z→2
文字列が入力(標準入力)されるので、これを Leet に変換して出力するプログラムを書いてください。

入力例1
PAIZA

出力例1
P4124

trメソッドを使う

https://docs.ruby-lang.org/ja/latest/method/String/i/tr.html

str = gets.chomp
puts str.tr('AEGIOSZ', '4361052')

使い方は文字列のインスタンス.tr("変換したい文字", "置き換え文字")のように使い、それぞれインデックス位置の一致する文字に置き換えられます。
trメソッドを知っていないと使えないですが、これが一番シンプルですね。
後述のgsubメソッドよりも高速という記事も見つけました。

gsubメソッドを使う(正規表現を使う)

https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html

LEET_TABLE = {
  "A" => "4",
  'E' => '3',
  'G' => '6',
  'I' => '1',
  'O' => '0',
  'S' => '5',
  'Z' => '2'
}

def leet(str)
  str.gsub(/[AGIOSZ]/, LEET_TABLE)
end

str = gets.chomp
puts leet(str)

正規表現を使う場合は、文字列.gsub(/正規表現/, 正規表現に該当した箇所を置換した後の文字列)のとおり使います。
正規表現を使わない場合は文字列.gsub(置換したい文字列, 置換後の文字列)のように使えるようですが、今回の場合はどのように使えば良いのか・・・?ちょっと試してみましたがうまくいきませんでした😵
ちなみに、subメソッドは初めにマッチした部分のみ置換されるようです。

力技でやる

メソッドを使わなくたってできます!
複雑だしすごく長くなりました笑

str= gets.split('').map(&:chomp)
leet =''
str.each do |i|
  case i
  when 'A'
    leet << '4'
  when 'E'
    leet << '3'
  when 'G'
    leet << '6'
  when 'I'
    leet << '1'
  when 'O'
    leet << '0'
  when 'S'
    leet << '5'
  when 'Z'
    leet << '2'
  else
    leet << i
  end
end
puts leet