【Ruby】Leet文字列の解き方いろいろ
Leet文字列とは
leet(リート、1337、l33t)は、主に英語圏においてインターネット上で使われるアルファベットの表記法である。
たとえば、「Warez」という語を leet で表記すると、「W@rez」や「W4r3z」などとなるように、一部のアルファベットを形の似たアラビア数字や記号などに変化させる。
なんかギャル文字(今は知らないですが)に通じるところがあるのかしら?と思いました笑
練習問題
問題
Leet と呼ばれるインターネットスラングがあります。
Leet ではいくつかのアルファベットをよく似た形の他の文字に置き換えて表記します。 Leet の置き換え規則はたくさんありますが、ここでは次の置き換え規則のみを考えましょう。
置き換え前→置き換え後
A→4
E→3
G→6
I→1
O→0
S→5
Z→2
文字列が入力(標準入力)されるので、これを Leet に変換して出力するプログラムを書いてください。
入力例1
PAIZA
出力例1
P4124
trメソッドを使う
str = gets.chomp
puts str.tr('AEGIOSZ', '4361052')
使い方は文字列のインスタンス.tr("変換したい文字", "置き換え文字")
のように使い、それぞれインデックス位置の一致する文字に置き換えられます。
trメソッドを知っていないと使えないですが、これが一番シンプルですね。
後述のgsubメソッドよりも高速という記事も見つけました。
gsubメソッドを使う(正規表現を使う)
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
Discussion