3

文字列内の複数の文字に整数を割り当てようとしています。

def userinput(input)
  @user = input.upcase.delete('^A-Z').chars.each_slice(5).map(&:join)
end

=> userinput("This is test to convert multiple characters in a string")
=> ["THISI","STEST","TOCON", "VERTM", "ULTIP", "LECHA", "RACTE", "RSINA", "STRIN", "G"]

この配列を取得した後、文字列内の各文字に整数を割り当てたいので、次のようなことを試しました...

=> @user.map {|ch| ch.ord - 'A'.ord + 1}

残念ながら、最初の文字に対応するアルファベットの整数しか取得できません。

=> [20, 19, 20, 22, 21, 12, 18, 18, 19, 7]

出力が次のようになるように、各文字列の残りの 4 文字を割り当てる方法について誰かがヒントを教えていただければ幸いです。

=> ["ABCDE", "ABCDE"]
=> [12345, 12345]
4

2 に答える 2

1

新しい配列の各文字列を文字の配列に変換してから、各文字をアルファベットの位置に変換してから、それらを文字列に連結します

@user = ["THISI","STEST","TOCON", "VERTM", "ULTIP", "LECHA", "RACTE", "RSINA", "STRIN", "G"]
@user.map(&:chars).map do |arr| 
  arr.inject("") do |str,ch| 
    str << (ch.ord - 'A'.ord + 1).to_s 
  end
end
 => ["2089199", "192051920", "201531514", "225182013", "211220916", "125381", "1813205", "18199141", "192018914", "7"]
于 2014-02-09T19:21:54.347 に答える
0

よりRubyらしい方法で行うトリックは次のとおりです。

@user = ["THISI","STEST","TOCON"]
@user.map { |s| s.gsub(/[a-z]/i) { |m| m.ord - 'A'.ord + 1 } }
# => ["2089199", "192051920", "201531514"]

#gsub最初にfromの魔法を調べる必要がありますgsub(pattern) {|match| block } → new_str

ブロック形式では、現在の一致文字列がパラメータとして渡され$1、 、$2$,$& $'`などの変数が, and適切に設定されます。ブロックによって返された値は、各呼び出しの一致に置き換えられます。

于 2014-02-09T19:28:22.363 に答える