Форум программистов, компьютерный форум, киберфорум
Ruby
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
2 / 2 / 1
Регистрация: 08.01.2016
Сообщений: 16
1

Заменить указанные символы на соответствующие им цифры

08.01.2016, 04:20. Показов 4786. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
С праздниками, рубисты!
Буду рад любому совету.
В общем делаю задание "Вводятся строки, которые состоят из групп цифр или букв или знаков +,-,*. Нужно посчитать сколько в каждой строке групп букв. Если таких групп >=2, то каждый "+", встречающийся между группами букв заменить на цифру 1, знак "-" на 2, знак "*" на 3. Иначе оставить текст без изменения."

Думал, что можно будет пройти по каждой строке, в каждой строке пройтись по группам и посчитать сколько групп с буквами так. Но при попытке пройти по строке и отделить группы (взял как slovo) мне вылетела ошибка.
undefined method 'each' for "#первая вводимая строка"
Я так понимаю, что Ruby не может разбить каждую строку на элементы массива.
Как это можно исправить или это делается по-другому? подтолкните в нужном направлении

Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
puts 'Enter strings, enter end to finish'
arr1 = []
 
while (a = gets) != "end\n"
  arr1 << a
end
 
arr1.each do |stroka|
        stroka.split("")
    stroka.each do |slovo|
             #тут остальной код
    end
end
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2016, 04:20
Ответы с готовыми решениями:

Заменить цифры на соответствующие слова
Задание таково-вести строчку, вывести ее, заменив цифры на соответствующие слова. Есть небольшая...

Как заменить символы в строке, не соответствующие заданному шаблону?
Здравствуйте! Я хочу сделать шаблон допустимых символов, и если в строке существуют символы,...

Заменить в тексте символы кавычек (") на соответствующие парные («»)
Помогите составить регулярное выражение для следующей функции: Задача. Заменить в тексте символы...

как заменить все цифры в тексте на соответствующие слова
Здравствуйте. Подскажите пожалуйста, как заменить все цифры в тексте на соответствующие слова)

3
the hardway first
Эксперт JS
2461 / 1836 / 906
Регистрация: 05.06.2015
Сообщений: 3,603
08.01.2016, 14:35 2
Цитата Сообщение от TvoyEnot Посмотреть сообщение
Я так понимаю, что Ruby не может разбить каждую строку на элементы массива.
Вы ошиблись разделом. Совсем чуть-чуть.
Руби может разбить строку на массив. Метод String#split возвращает массив, но не изменяет строку. Другими словами у вас на строке 9 код ничего не делает, эту строку можно удалить и ничего не изменится.

Добавлено через 3 часа 2 минуты
Цитата Сообщение от TvoyEnot Посмотреть сообщение
это делается по-другому? подтолкните в нужном направлении
Вся прелесть в том, что нет единственного правильного решения. Например можно сделать так:

program01/lib/string_changer/changer.rb
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module StringChanger
  refine String do
  
    def change
      return self if self.split(/\W/).size < 2
      
      # может есть более изящное решение?
      self.gsub(/\W/) do |c|
        case c
        when '+'
          '1'
        when '-'
          '2'
        when '*'
          '3'
        end
      end # gsub
    end # change
    
  end # refine
end


program01/test/changer_test.rb
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
require 'minitest/autorun'
require_relative '../lib/string_changer/changer'
 
using StringChanger
 
class ChangerTest < Minitest::Test
 
  def test_one_block_strings_not_changed
    str = 'abcdef'
    assert_equal str, str.change
  end
  
  def test_plus_change_to_one
    str = 'abc+def'
    assert_equal 'abc1def', str.change
  end
  
  def test_minus_change_to_two
    str = 'abc-def'
    assert_equal 'abc2def', str.change
  end
  
  def test_multipl_change_to_three
    str = 'abc*def'
    assert_equal 'abc3def', str.change
  end
  
  def test_all_features
    str = 'abc-def+sert*ret+ref*zxc'
    assert_equal 'abc2def1sert3ret1ref3zxc', str.change
  end
  
end


program01/bin/program.rb
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require_relative '../lib/string_changer/changer'
 
puts 'Type string. Type "end" to finish.'
 
arr1 = []
 
while (a = gets.chomp) != 'end'
  arr1 << a
end
 
using StringChanger
 
arr2 = arr1.map { |s| s.change }
 
puts arr2
1
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
08.01.2016, 22:37 3
Цитата Сообщение от j2FunOnly Посмотреть сообщение
# может есть более изящное решение?
имхо, в данной ситуации более правильным будет воспользоваться хешем
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
module StringChanger
  refine String do
    def change
      return self if self.split(/\W/).size < 2
      {'+' => '1', '-' => '2', '*' => '3'}.each do |k,v|
        next unless self.include? k
        self.gsub! k, v
      end
      self
    end # change
  end # refine
end
Или, если слегка схитрить и, можно несколько упростить (но это явно не всегда лучше будет):
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
module StringChanger
  refine String do
    def change
      return self if self.split(/\W/).size < 2
      ['+', '-', '*'].map.with_index do |v,k|
        next unless self.include? v
        self.gsub! v, (k + 1).to_s
      end
      self
    end # change
  end # refine
end
Но на самом деле, все это можно сделать несколько изящнее, если вспомнить, что gsub вполне себе неплохо работает с хешами. В результате получится нечто такое:
Ruby
1
2
3
4
5
6
7
8
9
module StringChanger
  refine String do
    def change
      return self if self.split(/\W/).size < 2
      h = {'+' => '1', '-' => '2', '*' => '3'}
      self.gsub /[#{Regexp.escape(h.keys.join)}]/, h
    end # change
  end # refine
end
1
the hardway first
Эксперт JS
2461 / 1836 / 906
Регистрация: 05.06.2015
Сообщений: 3,603
08.01.2016, 22:47 4
Ruby
1
return self if self.split(/\W/).size < 2
Я так думаю что это можно убрать вообще. И вернее решить задачу создав класс-обертку для String, а не монкипатчить класс. Мало-ли понадобятся всякие валидации для вводимых данных и т. д.
0
08.01.2016, 22:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2016, 22:47
Помогаю со студенческими работами здесь

Заменить в данной строке цифры на соответствующие им в алфавите по порядку буквы
Слова в строке отделены одним пробелом, в конце ставится точка. Заменить в данной строке цифры на...

Найти в файле каждый символ из строки и заменить его на соответствующие символы
Есть строка и текстовый файл, состоящий из строк вида &quot;* ***&quot;. Нужно найти в файле каждый символ из...

Строки. Заменить символы - цифры на символ '*'. В заданной строке заменить подряд идущие пробелы
П.5.16.Правил Запрещено создавать темы с множеством вопросов во всех разделах, кроме разделов...

Все символы-цифры заменить "!", причем количество замен должно соответствовать значению цифры
Может подскажите как сделать: Все символы-цифры заменить &quot;!&quot;, причем количество замен должно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru