【问题标题】:Assign integer to multiple characters in a string将整数分配给字符串中的多个字符
【发布时间】:2014-03-06 23:35:26
【问题描述】:

我正在尝试为字符串中的多个字符分配一个整数。

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]

【问题讨论】:

  • 为什么这个ch.ord - 'A'.ord + 1 计算?为什么ABCDE 是 12345?基于什么逻辑你正在做字符到整数映射?
  • 抱歉,这可能有点断章取义。这个想法是将字母表中的相应数字分配给一个字母。这就是为什么 ABCDE 是 12345。
  • 12345可以翻译成ABCDE,LCDE,AWDE。哪一个是对的?这个问题的答案是:我们不知道。您的编码有缺陷:不是prefix-free
  • @p11y:所以你是说如果我不使用无前缀,我将无法向后转换它?
  • 这正是问题所在。

标签: ruby string integer ord


【解决方案1】:

这里是使用更多 Rubyish 方式的技巧:

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

您首先需要从gsub(pattern) {|match| block } → new_str 了解#gsub 的魔力。

块形式中,将当前匹配字符串作为参数传入,变量如$1$2$,$& , and$'` 将被适当设置。块返回的值将被替换为每次调用的匹配项。

【讨论】:

  • 也很酷 - 非常感谢分享,在研究#gsub 魔法时我绝对会听取您的建议。
【解决方案2】:

将新数组中的每个字符串转换为一个字符数组,然后将每个字符转换回它们在字母表中的位置,就像你正在做的那样,然后将它们连接成一个字符串

@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"]

【讨论】:

  • 非常感谢 - 这太棒了,而且效果很好。还要仔细看看它才能理解它。最好的,罗伯
  • @user3215611 请接受我的回答,如果它对你有用,请点赞
  • 网站不允许我,因为我没有“15 声望”
猜你喜欢
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多