[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