Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Ruby
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2013, 17:15   #1
Rigby
Новичок
Джуниор
 
Регистрация: 31.01.2013
Сообщений: 1
По умолчанию Ruby, задачки для начинающих

Добрый день. Решила несколько задачек, вроде бы всё (более-менее) работает, но хотелось бы, чтобы специалисты дали комментарии относительно правильности и оптимальности - как можно было бы всё это сделать поизящнее? Заранее спасибо.

Код:
#1. Дана строка слов, разделённых пробелами. Вывести длиннейшее слово.

sentence = "Дана строка слов,    разделёных! пробелами. Вывести все   длиннейшие? слова."
array = sentence.scan(/[a-zA-zА-Яа-яё]+/)
maximum = array.max_by{|elem| elem.size}
p array.find_all{|e| e.size==maximum.size}

#=> ["разделёных", "длиннейшие"]
Код:
#2. Дана строка, содержащая кириллицу, латиницу и цифры. Вывести все слова, длина которых равна средней.

sentence = "Дана stroka, содержащая 15558.98 кириллицу, латиницу и цифры. Vyvesty все слова, qwqwqw длина которых равна средней."
array = sentence.scan(/[a-zA-ZА-Яа-яё]+/)
size = array.size
result = 0.0
array.each do |elem|
	result = result + elem.size
end
medium = (result/size).round

p array.find_all {|e| e.size==medium}

#=> ["stroka", "qwqwqw"]
Код:
#3. Найти в строке первое целиком кириллическое слово.

sentence = "Attention 58999777 На9йти three вt строке первое целиком кириллическое слово."
array = sentence.scan(/\b[А-Яа-яё]+\b/)
p array[0]

#=> "строке"
Код:
#5. Найти в тексте время в формате «часы:минуты:секунды».

sentence = "Найти 1:45:17 в 22:am:08 тексте 56:10:00 время 15:48:00 в формате 11-03-15 «часы:минуты:секунды»."
p array = sentence.scan(/(\b([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\b)/)
# => [["1:45:17", "1"], ["15:48:00", "15"]]
И вот по последнему вопрос: почему я в результате получаю двумерный массив, и как избавиться от "вторых" значений?
Большое спасибо.


UPD: разобралась с последним. В качестве "вторых" элементов массива выступает переменная, куда заносится результат совпадения с круглыми "сохраняющими" скобками. Чтобы получить правильный ответ, нужно использовать "несохраняющие" круглые скобки: вместо (...) нужны (?:...)
таким образом:
Код:
#5. Найти в тексте время в формате «часы:минуты:секунды».

sentence = "Найти 1:45:17 в 22:am:08 тексте 56:10:00 время 15:48:00 в формате 11-03-15 «часы:минуты:секунды»."
p array = sentence.scan(/\b(?:[01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\b/)
# => ["1:45:17", "15:48:00"]

Последний раз редактировалось Rigby; 01.02.2013 в 13:09.
Rigby вне форума Ответить с цитированием
Старый 20.04.2017, 13:23   #2
Guitarfreak
 
Регистрация: 03.04.2017
Сообщений: 5
По умолчанию

Было интересно почитать. Жаль что никто так ничего и не ответил.
Guitarfreak вне форума Ответить с цитированием
Старый 02.05.2017, 16:21   #3
domenianna
Новичок
Джуниор
 
Регистрация: 02.05.2017
Сообщений: 2
По умолчанию

Промолчали все потому видимо, что задачка для начинающих! А для меня вроде и не как для начинающих. Решение себе взяла на вооружение в прогу всуну по замене слов на ссылки.
domenianna вне форума Ответить с цитированием
Старый 02.05.2017, 16:32   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Скорее потому что на этом форуме примерно полтора человека пишущих на Руби.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.10.2017, 21:26   #5
fenek644
 
Регистрация: 15.10.2017
Сообщений: 9
По умолчанию

Может быть здесь найдете баг

def stock_picker(a)
l = a.length
jim = (0..l-2).to_a
m = a
#Sc = a
puts "hiii"
puts a
(0..l-2).each do |i|
#jim[i] = i
#m[i] = a[i]
puts a[i]
puts i
(i+1..l-1).each do |j|
if a[j] > m[i]
# do
m[i] = a[j]
jim[i] = j
end
puts j
puts i
puts a[i]
end

puts a[i]

#c[i] = m[i]-a[i]
end
#c = m-a
puts jim
puts m
puts a
f_i = 0
#(0..l-2).each do |i|
#f_i = 0
(0..l-2).each do |j|

if (m[j]-a[j]) > (m[f_i]-a[f_i])
f_i = j
puts j.to_s
end
end
#end
result = [f_i, jim[f_i]]
end

b = [17,3,6,9,15,8,6,1,10]

puts stock_picker(b)
Когда первый раз печатаю a[i], стр 11, - получается заданный a[i], а после цикла по j, стр 21, - он превращается в максимальный элемент массива a с номерами большими i.
fenek644 вне форума Ответить с цитированием
Старый 16.10.2017, 00:40   #6
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Без описания задачи, без форматирования, без единого комментария..

От того, что Вы написали
Код:
m = a
, у Вас не стало два разных массива..
Код:
irb(main):001:0> b = [17,3,6,9,15,8,6,1,10]
=> [17, 3, 6, 9, 15, 8, 6, 1, 10]
irb(main):002:0> a = b
=> [17, 3, 6, 9, 15, 8, 6, 1, 10]
irb(main):003:0> a[0] = 777
=> 777
irb(main):004:0> a
=> [777, 3, 6, 9, 15, 8, 6, 1, 10]
irb(main):005:0> b
=> [777, 3, 6, 9, 15, 8, 6, 1, 10]

Последний раз редактировалось Black Fregat; 16.10.2017 в 00:50.
Black Fregat вне форума Ответить с цитированием
Старый 16.10.2017, 01:03   #7
fenek644
 
Регистрация: 15.10.2017
Сообщений: 9
По умолчанию

, у Вас не стало два разных массива..
то есть m и а - один массив а как мне сделать два массива - один m а второй а

Спасибо Это и есть баг. Только как его преодолеть я не понимаю

я мыслил так - у меня есть а, я делаю его копию с именем m, а затем m - меняю

Последний раз редактировалось fenek644; 16.10.2017 в 01:05.
fenek644 вне форума Ответить с цитированием
Старый 16.10.2017, 01:04   #8
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Код:
m = a.clone
Black Fregat вне форума Ответить с цитированием
Старый 16.10.2017, 01:06   #9
fenek644
 
Регистрация: 15.10.2017
Сообщений: 9
По умолчанию

попробую
fenek644 вне форума Ответить с цитированием
Старый 16.10.2017, 01:11   #10
fenek644
 
Регистрация: 15.10.2017
Сообщений: 9
По умолчанию

Все - заработало - Спасибо - до новых встреч
fenek644 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ для начинающих Haruko_ Помощь студентам 0 23.10.2012 21:41
Pascal (задачки для начинающих) Pontiac228 Помощь студентам 11 12.05.2011 07:25
Круглый стол: Ruby on Rails для начинающих айтишников BelOlga Свободное общение 0 17.06.2010 21:57
С++ для начинающих Maxim1 Общие вопросы C/C++ 10 31.05.2010 00:22