【问题标题】:Removing specific items from a string after transforming it an array将字符串转换为数组后从字符串中删除特定项目
【发布时间】:2021-03-31 00:37:27
【问题描述】:

所以我在下面所做的是从用户那里获取一个数字并将字母表中的字母转换为该特定数字。例如,当 str = "aby" 且 num = 3 时,输出将为 "deb"。它只适用于字母。但是会有标点符号、空格等,如果我输入“A by 3”。作为字符串,我遇到诸如 Nomethod 错误之类的错误。(输出应为:“D eb 3。”)如何移动字母并同时保持其他字母不变?

ps:请不要为此编写新代码。我只是想解决我自己的代码问题。谢谢。

puts "Please type a number: "
num = gets.chomp.to_i  

alp = ("a".."z").to_a  

# This is the erroneous part :
str = "aby".split("")

number_conv = str.map { |a| alp.index(a) + num}

letter_conv = number_conv.map do |e|
  if e + num < 26 
    alp[e]
  else   
    e = (e + num) % 26
    alp[e - num]
  end
end

p letter_conv.join

【问题讨论】:

    标签: arrays ruby enumerable nomethoderror


    【解决方案1】:

    包装您的代码以将字符转换为函数。转移时添加条件以忽略特殊字符。

    在正文中,用空格分割句子并将每个单词传递给上述函数。

    def shift mystr, num
      ignore = %w{( ) ? ,}  # put all the characters you want to ignore here.
      alp = ("a".."z").to_a
    
      str = mystr.split("")
      
      number_conv = str.map { |a| ignore.include?(a) ? a : alp.index(a) + num}
    
      letter_conv = number_conv.map do |e|
        if ignore.include?(e)
          e
        elsif e + num < 26
          alp[e]
        else
          e = (e + num) % 26
          alp[e - num]
        end
      end
      letter_conv.join
    end
    
    puts "Please type a number: "
    num = gets.chomp.to_i
    puts "Please type a string: "
    str = gets.chomp
    puts str.split.map {|i| shift i, num}.join(" ")
    

    【讨论】:

    • 我确实理解 def 背后的逻辑,但是当 str = A bc 和 num = 2 时,我到达了“Bcd”而不是“B cd”。它以某种方式删除了空格。这是为什么? (我在忽略数组中添加了空格字符。)
    • 顺便说一句,我在最后一行将 join(" ") 更改为 join("") 。否则,它会在每个字母后添加空格。
    • @elixir 对不起,我忘了复制函数letter_conv.join的最后一行。已编辑。您必须恢复您的 join("") 更改。这是保留空格的原因。
    • 因此, letter_conv.join 将数组转换为字符串,最后的 join(" ") 用空格分隔单词。我说对了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多