[Freeschool] [JT] Re: чему стоит учить в школе
Michael Shigorin
=?iso-8859-1?q?mike_=CE=C1_osdn=2Eorg=2Eua?=
Пт Окт 24 14:38:20 MSD 2008
On Fri, Oct 24, 2008 at 01:29:35PM +0400, Denis Kirienko wrote:
> >>>import sys
> >>>for i in sys.stdin.read().split():
> >>> print int(i)
Кстати насчёт "print int": непедагогично, выводятся-то строки.
Или это работа на побочных эффектах int(str)?
---
Есть что-то странное в нашем любимом методе... Посмотрите-ка вот
на это:
puts 20
puts 20.to_s
puts '20'
20
20
20
Почему эти три вызова puts выводят одно и то же? Ну, положим,
последние два так и должны выводить, поскольку 20.to_s и есть
'20'. А как насчёт первого, с целым числом 20? Собственно
говоря, что же это значит: написать целое число 20? Когда вы
пишете 2, а затем 0 на листе бумаги, вы записываете строку, а не
целое. Число 20 -- это количество пальцев у меня на руках и
ногах; это не 2 с последующим 0.
Что ж, у нашего знакомого, puts, есть большой секрет: прежде,
чем метод puts пытается вывести объект, он использует to_s,
чтобы получить строковую версию этого объекта. Фактически, s в
слове puts обозначает string; puts на самом деле значит put
string ["вывести строку" -- Прим. перев.].
--- http://www.shokhirev.com/mikhail/ruby/ltp/Chapter04.html
> >>О, это уже выход. Я же писал - что у Питона есть своя логика и
> >>свои методы, мне, человеку, испорченному C++, очень тяжело
> >>доходить до таких подходов.
Плюсы -- условно объектно-ориентированный язык, IMHO :-\
На #altlinux сегодня вопрос тоже отзвучал.
> >while line = gets
> > puts line
> >end
> Подождите, разве это решает поставленную задачу?
Виноват, надо сперва просыпаться.
> Повторяю поставленную задачу. Во входном файле записано два
> числа. Они могут быть записаны в одной строке или в разных
> строках, строк в файле может быть много, между числами может
> быть один пробел, два пробела и т.д. Самое главное, что в файле
> есть два числа и пробельные символы, между двумя числами не
> менее одного пробельного символа. Нужно эти два числа выделить.
Что самое смешное, split() выше заметил только сейчас :)
$ echo -e " 2 \n\n3\n" | ruby -e 'p readlines.to_s.split'
["2", "3"]
Или в форме программы --
readlines.to_s.split.each do { |n| puts n }
Блин, опять однострочник... Так более программа? :)
#!/usr/bin/ruby
nums = readlines.to_s.split
puts nums[0], nums[1] unless nums.length < 2
> Пока я нашел приемлемыми только варианты от Дмитрия
> Масленникова.
Ну, честь ему и хвала за более вдумчивое чтение ТЗ
и имплементацию почти того, что спросили.
--
---- WBR, Michael Shigorin <mike на altlinux.ru>
------ Linux.Kiev http://www.linux.kiev.ua/
Подробная информация о списке рассылки Freeschool