Как сделать так, чтобы повторяющаяся строка влево удалялась без использования while? - PullRequest
1 голос
/ 19 октября 2019

Например, у меня есть эта строка из только чисел :

0009102

Если я преобразую ее в целое число, Ruby автоматически выдаст мне это значение:

9102

Это верно. Но моя программа дает мне различные типы чисел:

2229102 желаемый вывод => 9102

9999102 желаемый вывод => 102

Если выпосмотрите на них, я обработал 2 и 9 как нули, так как они автоматически удаляются, ну, это легко удалить с помощью while, но я должен избегать этого.

Другими словами,как сделать так, чтобы 'n' слева считалось нулем для Ruby?

Ответы [ 4 ]

3 голосов
/ 19 октября 2019
"2229102".sub(/\A(\d)\1*/, "") #=> "9102"`.

Регулярное выражение гласит: «соответствует первой цифре в строке (\A - привязка начала строки) в группе захвата 1 ((\d)), за которой следует ноль или более символов (*), которые равны содержимому группы захвата 1 (\1). String # gsub преобразует совпадения в пустую строку.

2 голосов
/ 19 октября 2019

Попробуйте с Enumerable # chunk_ while :

s = '222910222'

s.each_char.chunk_while(&:==).drop(1).join
#=> "910222"

Где s.each_char.chunk_while(&:==).to_a #=> [["2", "2", "2"], ["9"], ["1"], ["0"], ["2", "2", "2"]]

1 голос
/ 19 октября 2019

Вы также можете попробовать этот способ:

s = '9999102938'

s.chars.then{ |chars| chars[chars.index(chars.uniq[1])..-1] }.join
=> "102938"
1 голос
/ 19 октября 2019

Аналогично решению iGian вы также можете использовать drop_while.

s = '222910222'

s.each_char.each_cons(2).drop_while { |a, b| a == b }.map(&:last).join
#=> "910222"

# or

s.each_char.drop_while.with_index(-1) { |c, i| i < 0 || c == s[i] }.join
#=> "910222"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...