str = "karhik reddy"
n= str.length
for i in n.downto(0) do // reverse iteration of ruby
str += str[i].to_s
end
puts str[-n..-1]
Это эффективно для больших наборов данных? Как массив из миллионов чисел, в котором вы бы полностью перевернули набор символов в книге?
если я печатаю значение str, наконец, он печатает первую строку, а также вторую обратную строку в сочетании, как karthik reddy karthik reddyydder kihtrak
прямо сейчас вы не меняете строку, а добавляете обратную версию, вместо этого попробуйте что-нибудь вроде: s.length.-(1).downto(0) { |i| s << s.slice!(i)}
. String#slice!
изменит исходную строку, удалив «фрагмент», тогда мы просто добавим его в конец строки. Что касается эффективности, встроенный в reverse
был бы более эффективным.
@engineersmnky ❤ .-(1)
.
В вашем коде используется не менее 6 встроенных функций, но в строке темы написано, что вам не разрешено их использовать.
В Ruby все является вызовом метода, поэтому здесь не может быть и речи о том, чтобы не использовать вызовы методов. Что разрешено вашим конкретным определением?
Я бы сказал, что наиболее эффективным способом должно быть что-то вроде:
> str = "karhik reddy"
> (n = str.length).times { |i| str[i...i], str[n..n] = str[n-1], '' }
> str
#⇒ "ydder kihrak"
К сожалению, здесь используются 4 «встроенные функции», которые, согласно OP, не разрешены.
@ JörgWMittag Я взял на себя смелость полагаться на то, какие встроенные функции были представлены в исходном коде. Я понял, что встроенный reverse
и его семейство недопустимы, а []
, []=
, length
и times
разрешены, иначе мы напишем расширение c, напрямую связанное с памятью.
Если вы хотите сделать этот стиль пещерного человека без «встроенных функций», самое близкое, что вы можете сделать, это:
def primitive_reverse(str)
out = ''
i = 0
while (i < str.length)
i += 1
out << str[-i]
end
out
end
Если технически String#<<
, String#[]
и String#length
- это все методы, но без этого вы не сможете это сделать.
«Стиль пещерного человека»? Любить это. (Для дополнительной меры, возможно, вам следует использовать петлю for
.)
@CarySwoveland Я сопротивлялся этому побуждению, потому что у Руби аллергия на for
, и это казалось неуместным.
Вы пропустили Integer#<
, Integer#+
и Integer#-@
, которые также используются в вашем коде ;-)
@ JörgWMittag Еще больше хороших примеров того, как это невозможно без лучшего определения «встроенных методов».
Всего 3 метода:
"karhik reddy".each_char.inject(&:prepend)
4! Вы неявно отправляете Symbol#to_proc
;-)
(n - 1).downto(0) { |i| str << str[i] }