Вот несколько моментов, которые следует учитывать при разработке вашего решения.
Если бы ваша строка была:
str = "ca9t00456"
желаемое возвращаемое значение было бы:
"ca9t00457"
(Обратите внимание, что решение OP вернуло бы неверный результат ("cat10"
) для этой строки. Вопрос Codewars не говорит о том, что единственными цифрами в строке являются те, которые находятся в конце; он упоминает только «число» в конце строка ".)
Разумным первым шагом было бы разделить строку на две части:
n = str.index(/\d+\z/)
#=> 4
prefix = str[0, n]
#=> "ca9t"
suffix = str[n..-1]
#=> "00456"
См. String # index . Регулярное выражение /\d+\z/
, читает, "соответствует одной или нескольким (+
) цифрам (\d
), за которыми следует конец строки (\z
). Ди git '9'
пропускается, потому что за ним не следует ди git и он не находится в конце строки. См. Также См. String # [] .
Возвращаемая строка будет начинаться с (значения, хранящегося в) prefix
, поэтому мы можем отложить это в сторону и сосредоточиться на изменении suffix
.
Один из подходов был бы:
((suffix.to_i) + 1).to_s
#=> "457"
, но тогда мы должны были бы добавить правильное число ведущих нулей. Здесь это будет то же самое, что и число ведущих нулей в suffix
(2), но если бы suffix
было, например, 00999
, это было бы только одно (01000
). Это может быть сделано, но это грязно.
Более простой способ - использовать метод String # su cc, как @steenslag предлагает в комментариях.
new_suffix = suffix.succ
#=> "00457"
"00999".succ
#=> "01000"
Теперь нам нужно только объединить prefix
и new_suffix
.
Обратите внимание, что произойдет, если мы выполним succ
для всей строки:
"ca9t0456".succ
#=> "ca9t0457" correct
"ca9t0999".succ
#=> "ca9t1000" correct
"ca9t9999".succ
#=> "ca9u0000" incorrect
Как видите, есть проблема с третьим примером. Вот почему я решил разделить строку на две части в качестве первого шага.
Вам нужно исследовать три других случая. Первый - когда префикс является пустой строкой:
str = "00456"
, второй - когда суффикс является пустой строкой:
str = "ca9t"
, а третий - когда строка пуста:
str = ""
Вы можете проверить, работают ли предыдущие вычисления в первом случае.
Во втором случае мы найдем:
n = str.index(/\d+\z/)
#=> "cat9t".index(/\d+\z/) => nil
nil
значение для n
говорит нам, что желаемое возвращаемое значение:
str + "1"
#=> "ca9t" + "1" => "ca9t1"
Будет ли это работать?