[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