我有一个字符串。我需要让其他所有行都反转。如果count为2,则应显示:
"Hola mi amigo \nogima im aloH"
如果count为3,则应显示:
"Hola mi amigo \nogima im aloH \nHola mi amigo"
等等。在每个其他"\n"
之间执行字符串修改的最短方法是什么?
我的预感是使用正则表达式。除了正则表达式解决方案,还有任何非正则表达式解决方案吗?我想看到两者进行比较。
def hola(count)
if COUNT IS LESS THAN 2
return false
elsif ODD
(("Hola mi amigo ")*((count-1)/2) + "\n") * count
elsif EVEN
(("Hola mi amigo ")*(count/2) + "\n") * count
end
end
答案 0 :(得分:4)
如果实施中没有限制,那么尝试这样的事情:
string = "Hola mi amigo"
reversed_string = string.reverse
count.times.map { |i| i.odd? ? reversed_string : string }.join "\n"
times.map
将创建一个枚举器。下一个块将检查当前索引是奇数还是偶数;在第一种情况下,它将反转字符串,并返回它。最后,所有字符串都与join
(带换行符)连接在一起。
此外,这是另一个(也可能是效率较低的)递归解决方案:
def hola(count)
if count == 0
''
elsif count.even?
"Hola mi amigo".reverse + "\n" + hola(count - 1)
else
"Hola mi amigo" + "\n" + hola(count - 1)
end
end
答案 1 :(得分:4)
我很惊讶没有人提出Enumerable#cycle
的解决方案(也许@CarySwoveland正在休假):
def hola(str, count)
[ str, str.reverse ].cycle.take(count).join("\n")
end
puts hola("Hola mi amigo", 1)
# => Hola mi amigo
puts hola("Hola mi amigo", 2)
# => Hola mi amigo
# ogima im aloH
puts hola("Hola mi amigo", 3)
# => Hola mi amigo
# ogima im aloH
# Hola mi amigo
puts hola("Hola mi amigo", 8)
# => Hola mi amigo
# ogima im aloH
# Hola mi amigo
# ogima im aloH
# Hola mi amigo
# ogima im aloH
# Hola mi amigo
# ogima im aloH
我想到OP可能正在寻找递归解决方案,正如他们在标题中所写:
def hola(str, count)
return "" if count <= 0
str + "\n" + hola(str.reverse, count - 1).chomp
end
输出与上述相同。显然它不那么有效,但我更喜欢它。
答案 2 :(得分:1)
出于好奇:
str = '¡Hola mi amigo!'
([str, str.reverse] * (count / 2 + 1)).take(count).join $/
([str] * count).map.with_index { |s, i| i.even? ? s : s.reverse }.join $/
([str] * count).each.with_index.with_object("") do |(s, i), acc|
acc << (i.even? ? s : s.reverse) << $/
end.strip
为了使其更加健壮(Cary的信用),可以提前准备反向字符串。
答案 3 :(得分:1)
def alternate(str, count)
(("%s\n%s\n" % [str, str.reverse])*(count/2) << str*(count % 2)).chomp
end
str = "Hola mi amigo"
puts alternate(str, 4)
Hola mi amigo
ogima im aloH
Hola mi amigo
ogima im aloH
puts alternate(str, 5)
Hola mi amigo
ogima im aloH
Hola mi amigo
ogima im aloH
Hola mi amigo
答案 4 :(得分:0)
我对Ruby没有特别的经验,但是从一些轻微的搜索中,我会在你的elsif语句中使用.reverse方法和for循环。它不应该太难拼凑起来。
可以在这里找到一些.reverse文档:
http://www.informit.com/articles/article.aspx?p=2314083&seqNum=29