[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