我有一根绳子。我要把其他的台词都颠倒过来。如果计数为2,则应显示:
"Hola mi amigo \nogima im aloH"如果计数为3,则应显示:
"Hola mi amigo \nogima im aloH \nHola mi amigo"诸若此类。在其他每个"\n"之间执行字符串修改的最短方式是什么?
我的预感是用正则表达式。除了regex解,还有什么非正则解吗?我想看看两者的比较。
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发布于 2016-06-08 17:32:48
如果在实现中没有任何限制,那么尝试如下所示:
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发布于 2016-06-08 18:43:28
解决方案1
我感到惊讶的是,没有其他人提出与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解决方案2
我突然想到,也许OP实际上是在寻找一种递归解决方案,正如他们在标题中所写的:
def hola(str, count)
return "" if count <= 0
str + "\n" + hola(str.reverse, count - 1).chomp
end输出与上述相同。很明显,它不那么有效,但除此之外,我更喜欢它。
发布于 2016-06-08 17:59:01
只是出于好奇:
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的学分),可以提前准备反向字符串。
https://stackoverflow.com/questions/37709094
复制相似问题