簡體   English   中英

在ruby中用整數遞增字符串

[英]Incrementing string by integer in ruby

假設字符串是"abc"而用戶輸入是3則輸出變為"def"

應該通過用戶輸入將每個字符增加為整數值。

我寫了一個代碼,但它給出了一個錯誤。 有沒有其他方法可以做到這一點?

#!/usr/bin/ruby -w

puts "Enter the value of n";
$n=gets;
s = String.new("abc");
s.split("").each do |i|
    $j = 0;
    x = i;
    begin
         x.next;
         $j = $j + 1;
    end while $j < $n

    puts x;
end

您的代碼中需要添加幾項內容:

  • 而不是String.new ,你可以簡單地在引號中添加你的字符串。
  • str.split("")可以是str.chars
  • $j = $j + 1可以是$j += 1
  • 如果你在$j$n之間進行比較,那么<<應該是<
  • 你不需要; 除非你在一行寫作。
  • begin; end while begin; end while可以while; end while; end

我想這可能是這樣的:

n = gets.to_i
s = 'abc'
s.split('').each do |i|
  j = 0
  x = i
  while j < n
    x = x.next
    j += 1
  end
  puts x
end

但是你可以在字符串中的每個字符串上使用String#ord來返回它的序數,添加用戶輸入,然后使用String#chr獲取該數字的ASCII字符:

# With n being the user's input as integer, in this case 3.
p 'abc'.chars.map { |char| (char.ord + n).chr }.join 
# "def"

添加了n = gets.to_in = gets.to_i的評論中所述。

如果要尋找Caesar Cipher實現:

def foo(string, n)
  lower = ('a'..'z').to_a.join
  upper = ('A'..'Z').to_a.join
  string.tr(lower + upper, lower[n..-1] + lower[0...n] + upper[n..-1] + upper[0...n])
end

p foo('XYZ', 1) # "YZA"
p foo('ABC', 1) # "BCD"
p foo('ABC', 3) # "DEF"

比較慢,但......

你可以使用trrotate 假設您想要一個圓形映射,即'z' => 'a'表示+1地圖。

def caesar str, n
  str.tr 'a-z', [*'a'..'z'].rotate(n).join
end

caesar 'abc', 3 #=> 'def'
caesar 'xyz', 3 #=> 'abc'

有關這些方法的信息,請參閱文檔

如果所有字符都是小寫的ASCII字母:

def caesar(str, n)
  base = 'a'.ord
  str.gsub(/./) { |c| (base + (c.ord+n-base) % 26).chr }
end

str = "abcxyza"
caesar(str,  1) #=> "bcdyzab"
caesar(str,  2) #=> "cdezabc"
caesar(str, 25) #=> "zabwxyz"
caesar(str, 26) #=> "abcxyza"

如果所有字符都是ASCII字母:

def caesar(str, n)
  str.gsub(/./) do |c|
    base = (c==c.upcase ? 'A' : 'a').ord
    (base + (c.ord+n-base) % 26).chr
  end
end

str = "AbcDefXyZa"
caesar(str,  1) #=> "BcdEfgYzAb"
caesar(str,  2) #=> "CdeFghZaBc"
caesar(str, 25) #=> "ZabCdeWxYz"
caesar(str, 26) #=> "AbcDefXyZa"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM