Как выполнить обратную операцию в Ruby с использованием одной переменной без использования каких-либо встроенных функций

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]

Это эффективно для больших наборов данных? Как массив из миллионов чисел, в котором вы бы полностью перевернули набор символов в книге?

(n - 1).downto(0) { |i| str << str[i] }
Aleksei Matiushkin 01.05.2018 18:51

если я печатаю значение str, наконец, он печатает первую строку, а также вторую обратную строку в сочетании, как karthik reddy karthik reddyydder kihtrak

shashi 01.05.2018 18:55

прямо сейчас вы не меняете строку, а добавляете обратную версию, вместо этого попробуйте что-нибудь вроде: s.length.-(1).downto(0) { |i| s << s.slice!(i)}. String#slice! изменит исходную строку, удалив «фрагмент», тогда мы просто добавим его в конец строки. Что касается эффективности, встроенный в reverse был бы более эффективным.

engineersmnky 01.05.2018 18:55

@engineersmnky ❤ .-(1).

Aleksei Matiushkin 01.05.2018 19:05

В вашем коде используется не менее 6 встроенных функций, но в строке темы написано, что вам не разрешено их использовать.

Jörg W Mittag 01.05.2018 19:22

В Ruby все является вызовом метода, поэтому здесь не может быть и речи о том, чтобы не использовать вызовы методов. Что разрешено вашим конкретным определением?

tadman 01.05.2018 23:15
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
6
64
3

Ответы 3

Я бы сказал, что наиболее эффективным способом должно быть что-то вроде:

> str = "karhik reddy"
> (n = str.length).times { |i| str[i...i], str[n..n] = str[n-1], '' }
> str
#⇒ "ydder kihrak"

К сожалению, здесь используются 4 «встроенные функции», которые, согласно OP, не разрешены.

Jörg W Mittag 01.05.2018 19:21

@ JörgWMittag Я взял на себя смелость полагаться на то, какие встроенные функции были представлены в исходном коде. Я понял, что встроенный reverse и его семейство недопустимы, а [], []=, length и times разрешены, иначе мы напишем расширение c, напрямую связанное с памятью.

Aleksei Matiushkin 01.05.2018 19:29

Если вы хотите сделать этот стиль пещерного человека без «встроенных функций», самое близкое, что вы можете сделать, это:

def primitive_reverse(str)
  out = ''
  i = 0

  while (i < str.length)
    i += 1
    out << str[-i]
  end

  out
end

Если технически String#<<, String#[] и String#length - это все методы, но без этого вы не сможете это сделать.

«Стиль пещерного человека»? Любить это. (Для дополнительной меры, возможно, вам следует использовать петлю for.)

Cary Swoveland 02.05.2018 01:25

@CarySwoveland Я сопротивлялся этому побуждению, потому что у Руби аллергия на for, и это казалось неуместным.

tadman 02.05.2018 01:44

Вы пропустили Integer#<, Integer#+ и Integer#-@, которые также используются в вашем коде ;-)

Jörg W Mittag 05.05.2018 18:47

@ JörgWMittag Еще больше хороших примеров того, как это невозможно без лучшего определения «встроенных методов».

tadman 05.05.2018 18:51

Всего 3 метода:

"karhik reddy".each_char.inject(&:prepend)

4! Вы неявно отправляете Symbol#to_proc ;-)

Jörg W Mittag 05.05.2018 18:48

Другие вопросы по теме