[Freeschool] [JT] Re: чему стоит учить в школе
Michael Shigorin
=?iso-8859-1?q?mike_=CE=C1_osdn=2Eorg=2Eua?=
Пт Окт 24 16:36:42 MSD 2008
On Fri, Oct 24, 2008 at 03:34:04PM +0400, Denis Kirienko wrote:
> >Или в более привычном виде для людей не знакомых с Ruby:
> >
> >sum = 0
> >while line = gets do
> > for x in line.split do
> > sum += x.to_i
> > end
> >end
> >puts sum
>
> А можно пример реализации на ruby (ибо я с ruby совсем не
> знаком) со следующими дополнительными условиями:
>
> 1. Данные читаются из файла input.txt.
> 2. Все считанные данные разбиваются на последовательности
> непробельных символов и сохраняются в списке, как в приведенном
> ранее примере на python.
понятнее:
arr = Array.new
File.open("input.txt", "r") do |file|
file.each_line do |line|
for x in line.split do
arr.push(x) # или arr.push x
end
end
end
puts arr
# работаем с arr
короче, но с хаком в виде двумерности массива:
arr = []
File.open("input.txt", "r") do |file|
file.each_line { |line| arr << line.split }
end
puts arr
# работаем с arr.flatten -- он будет одномерным
# (или сплющиваем arr при помощи arr.flatten!)
> Дело в том, что данные могут быть сложными - там могут быть и
> числа, и строки... и их не обязательно все просуммировать на
> потоке, может быть и более хитрая задача.
PS: сперва думал чуточку выпендриться:
sum = 0
text = ""
File.open("input.txt", "r") do |file|
file.each_line do |line|
for x in line.split do
if x.is_a?(String)
text += x
else
sum += x.to_i
end
end
end
end
puts "Текст: #{text}"
puts "Сумма чисел: #{sum}"
Проблема в том, что "0".to_i, "".to_i или "проверка связи".to_i
даст один и тот же нуль. Есть такая некрасивость; разбор здесь:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/14518
С другой стороны -- за интроспекцию на олимпиадах часом
канделябром не достаётся? Мне когда-то по разворачиванию
рекурсии в цикл с инвариантом специального вида хмыкнули :)
--
---- WBR, Michael Shigorin <mike на altlinux.ru>
------ Linux.Kiev http://www.linux.kiev.ua/
Подробная информация о списке рассылки Freeschool