Перевоплощаемся в сказочных персонажей, готовим их любимые блюда и играем в игру «Угадай концовку».
Новогодние каникулы — прекрасное время для того, чтобы отдохнуть в кругу семьи. А еще для того, чтобы прочитать все, что давно откладывалось, напомнить детям, что книга лучше гаджета, показать подросткам, какую пользу и удовольствие приносит литература, а малышей начать учить читать самостоятельно. Как сделать все это и вдобавок отлично повеселиться — рассказывают сотрудники шести московских библиотек.
Family books и книжные фанты
Советует Марина Соломонова, заместитель директора по библиотечно-информационному обслуживанию Центральной городской детской библиотеки имени А.П. Гайдара
— Если не знаете, чем заняться на каникулах, попробуйте организовать у себя дома акцию family books. Для этого каждый член семьи должен выбрать книгу на определенную тему, например про художников. Допустим, мама возьмет биографию Микеланджело Буонаротти, а ребенок — книжку «Мальчик, которого укусил Пикассо» Энтони Пенроуза. Во время чтения и после обсудите произведения, обменяйтесь эмоциями. Мы в библиотеке однажды тоже проводили такую акцию — всем очень понравилось, особенно подросткам.
Еще один интересный вид времяпрепровождения — попробовать рассказать о книге, уложившись в 30 секунд или минуту, не пересказывая сюжет. Потом все голосуют, чей рассказ оказался точнее. Победителю можно вручить приз — что-то вкусное. Еще обязательно попробуйте поиграть в книжные фанты. Они отлично сочиняются даже по энциклопедиям. Очень смешные получаются задания, например про динозавров — изобразить, как они ходят, рычат, летают.
Кроме того, советую почитать по ролям. Если ваш ребенок еще не очень хорошо читает, эта игра ему очень поможет — проверено. Каждый пишет на листочке роль — можно персонажа из книги, а можно из жизни. Внимание: выбирайте персонажей, которых интересно изображать, пусть это будет, допустим, уставший продавец в супермаркете в час пик или самый строгий учитель в школе. Книгу для чтения тоже можно выбрать любую — хоть справочник по математике. Участники вытягивают роли и в течение минуты читают книгу в соответствии с ними.
Если ребенок — фантазер, поиграйте с ним в сочинение сказок по методике Джанни Родари. Его приемами пользуются и многие современные сценаристы. Возьмите любую сказку и постарайтесь придумать, что было с героями дальше, или сказку «наоборот». Что было бы, если бы Красная Шапочка была злой, а волк — добрым? А если бы Белоснежка отправилась не к семи гномам, а к семи великанам?
«Угадай концовку» и чтение вслух
Советует Анна Августиновская, библиотекарь 1-й категории библиотеки № 68
— Я предлагаю поиграть в «Угадай концовку», которая очень хорошо развивает фантазию. Сначала все вместе прочитайте рассказ, с которым не знаком ни один из членов семьи, а потом по очереди предлагайте свою концовку. И обязательно назначьте приз — либо за самый необычный финал, либо за финал, наиболее приближенный к авторскому.
Дети, особенно младшеклассники, очень любят читать вместе с родителями. Каникулы — отличный повод устроиться вместе на диване и почитать друг другу какую-нибудь новую интересную книгу. Лично я рекомендую «Я не люблю Новый год» Ирины Зартайской. Это история о девочке, которая терпеть не может новогодние елки и подарки. Но однажды с ней происходит кое-что неожиданное, действительно волшебное.
Капсула времени и настольная игра
Советует Ольга Зайцева, библиотекарь 1-й категории библиотеки № 172
— Дома на каникулах можно устроить книжную вечеринку. Пусть каждый возьмет свою любимую книгу. Потом прочтите любимые отрывки вслух — это невероятно сближает. А еще вы можете записать чтение на диктофон, сделать собственную аудиокнигу, а потом выложить ее на своих страницах в социальных сетях. Кстати, предложите запись и вашей районной библиотеке — уверена, ее сотрудники с радостью опубликуют ваш труд на своих страницах. Мы, например, всегда открыты для такого сотрудничества.
Могу предложить и мистически-фантазийное времяпрепровождение — гадание по книге. Все очень просто: задаете вопрос, открываете книгу на любой странице, вслепую выбираете строчку и зачитываете ее вслух. Совпадения, которые вы можете встретить относительно вашей ситуации, иногда просто поражают. А если вам попалась непонятная абракадабра вместо ответа, попробуйте ее как-то истолковать всей семьей. Поверьте, будет очень весело.
Попробуйте заложить капсулу времени — отправить самим себе письмо в будущее. Что для этого надо? Саму капсулу можно сделать из чего угодно — это может быть любая банка, коробка и даже стаканчик из-под йогурта, главное — ее украсить. Потом запишите на бумаге и положите внутрь обязательства каждого члена семьи — например, прочесть определенное произведение или количество книг. А через год распечатайте капсулу и проверьте, что из задуманного получилось.
Еще можно создать собственную настольную игру по мотивам книги, сделать кубик и фишки, придумать правила, связанные с сюжетом. Сразу могу подсказать идею для игры по мотивам книги Алана Милна «Винни Пух и все-все-все»: если игрок попадает на клетку, где герой падает с дерева, то он пропускает ход.
Домашний театр и письма героям
Советует Наталья Ключникова, заведующая библиотекой № 138
— Попробуйте устроить домашний театр — во время подготовки представления развиваются творческие способности, преодолевается стеснительность, выплескиваются эмоции. Выберете сказку, прочитайте ее, обсудите, смастерите из подручных материалов декорации и костюмы, а потом разыграйте сценки. В них, кстати, могут участвовать не только дети, но и взрослые.
Сейчас, когда мы используем достижения техники во всех сферах своей жизни, совсем забыли о письмах, написанных собственной рукой. Я думаю, очень полезно вспомнить эпистолярный жанр и написать письмо сказочному герою. Обязательно красивым почерком — советую посмотреть вместе какое-нибудь обучающее видео по каллиграфии. Для ребенка, особенно младшего школьника, это то, что надо. Каллиграфия развивает мелкую моторику, творческий потенциал, воспитывает усидчивость.
Театр теней и собственный комикс
Советует Ольга Хлыстова, заведующая библиотекой № 266
— Поделюсь одной очень простой игрой, от которой, поверьте, просто невозможно оторваться. Раскройте книгу и начинайте всей семьей соревноваться — кто за три минуты больше всех найдет слогов «ма», «па» или других. Это, кстати, очень полезно — у детей развивается грамотность. На первый взгляд может показаться, что это развлечение для малышей, но не спешите с выводами. Подростки очень легко включаются в игру, готовы так сидеть подолгу.
Вместе с подростками можно попробовать создать собственный комикс по мотивам события из книги или жизни семьи. А с малышами можно сделать книжку с интересными деталями — например, открывающимися окошками.
Но самое интересное, на мой взгляд, — это театр теней. Мы в библиотеке часто его устраиваем и всегда советуем в качестве домашнего досуга. В последний раз мы ставили спектакль по сказке Джулии Дональдсон «Груффало». Все очень просто: делаете из подручных материалов ширму (подойдет простыня), вырезаете фигурки персонажей (их можно нарисовать или распечатать). Направляете из-за ширмы лампу — и готово. Остальное вам подскажет фантазия.
Еда литературных героев и книга как снотворное
Советует Надежда Краснова, ведущий библиотекарь библиотеки № 111
— Вы пробовали когда-нибудь готовить то, что едят литературные герои сказок и рассказов? Уверена, что нет. Мой вам совет: обязательно сделайте это. Когда еще этим заниматься, как не на каникулах?
Попробуйте создать литературное меню на неделю. Например, в понедельник вы готовите мясные тефтели, которые так любил Карлсон из книжки Астрид Линдгрен, а на десерт делаете пирожные наследника Тутти из «Трех толстяков» Юрия Олеши. Во вторник можно прочитать «Арбузный переулок» из «Денискиных рассказов» Виктора Драгунского и пообедать молочной лапшой, а в выходные побаловать себя пончиками с малиновым вареньем, которые обожала Мэри Поппинс.
Еще хочу поделиться с вами полезной информацией. Ученые отметили, что книги улучшают сон и снимают напряжение. Всего шесть минут чтения перед сном сработают лучше, чем чашка травяного чая или расслабляющая музыка, поэтому советую вам заменить гаджеты на литературу. А дети обязательно возьмут с вас пример.
Есть такой удивительный текст в Постной Триоди: «Кто премудр убо приобрести за немногие дни вечность?». Мне кажется, что «Лед и пламя» Рэя Брэдбери – именно об этом.
«Лед и пламя». На первый взгляд перед нами обыкновенная научно-фантастическая повесть. Космический корабль совершает аварийную посадку на незнакомой планете. Выбравшись из ракет, космонавты попадают в чудовищные условия: на планету ежесекундно обрушивается колоссальный поток радиации, вызывающий страшные изменения в организме. Даже укрывшись в глубоких пещерах, люди продолжают меняться под воздействием окружающего их мира, их пульс учащается, ускоряется метаболизм, они стареют все быстрее и быстрее.
Рассказ Брэдбери незаметно выбрался из жанра научной фантастики и приблизился к притче
В конце концов продолжительность жизни сокращается до 8 дней. Дети, рожденные в понедельник, к воскресенью превращаются в высохших стариков… И вот тут оказывается, что рассказ незаметно выбрался из жанра научной фантастики и приблизился к притче.
«Рождение мгновенно, как взмах ножа. Детство пролетает стремительно. Юношество – будто зарница. Возмужание – сон, зрелость – миф, старость – суровая быстротечная реальность, смерть – скорая неотвратимость».
Сильно, не правда ли? Но разве это только о фантастическом мире с чудовищной радиацией? Разве это не о падшем мире, в который однажды, в самом начале человеческой истории, в результате грехопадения вошла смерть? Из вечности мы выпали во время, а оно беспощадно, скоротечно. Пусть нам дано не 8 дней, а 80 лет, 90, 100, но оглянется на прожитую жизнь столетний старик – и она покажется ему мгновением.
В рассказе Брэдбери прекрасно передано это ощущение скоротечности земной жизни, оно предельно заострено (кстати, обратите внимание, что в этот мир люди попадают в прямом смысле в результате падения).
Из вечности мы выпали во время, а оно беспощадно, скоротечно, как те самые 8 дней
Вот один из героев говорит, что есть способ продлить жизнь на целых три дня, «три долгих, славных дня». В ответ раздаются восторженные крики, ликование. Три дня.
А читателю сразу становится стыдно, потому что каждому из нас, слава Богу, уже было дано и, если Бог благословит, будет дано еще много-много таких славных дней (а разве день, Божий дар миру, каждому из живущих, может быть иным?).
Но разве они будут прожиты нами так, чтобы, как мечтал Достоевский, ни одна минута не была потрачена впустую? Кто из нас на самом деле умеет дорожить временем?
***
Но «Лед и пламя» хорош не только этим заостренным восприятием времени. В тексте с удивительной силой воплощена не только идея скоротечности земной жизни, но и мысль о возможности обретения вечности.
Через 10 тысяч дней после катастрофы в пещерах появляется на свет мальчик, которому дают имя «Сим». Конечно, неслучайно, ведь «Сим» – сокращенное от « Симон», то есть Петр. Иными словами, Сим – носитель веры.
Спасение Сим находит в корабле. Стоит вспомнить, что одним из древнейших символов Церкви и является корабль
На третий день жизни возмужавший Сим пробирается обратно к кораблю, веря, что там отыщет что-то, что поможет спастись от поджидающей его уже через 5 дней смерти. Он попадает внутрь – и происходит нечто для него невероятное, но вполне естественное. Обшивка корабля укрывает Сима от смертоносной радиации, от излучения чужого мира. Проходит день, другой, Сим уже должен был стать дряхлым стариком, но он остается прежним полным сил юношей и на десятый, и на двенадцатый день.
Итак, спасение Сим находит в корабле. Притча проступает все отчетливее, стоит лишь вспомнить, что одним из древнейших символов Церкви и является корабль. Церковь спасает от радиации разлитого в мире греха, возвращает первозданную природу человека, вводит в вечную жизнь.
***
И вот еще один крайне емкий эпизод: Сим находит календарь и показывает его своей спутнице, Лайт. «Он предназначен для измерения времени», – говорит потрясенный Сим.
Давайте на секунду представим, чем были для него, знавшего, что ему отпущено лишь 8 дней, листки календаря. Каким колоссальным богатством стали для него привычные для нас недели, месяцы, годы! Не замечаемое нами и ежедневно растрачиваемое богатство.
Как тут снова не вспомнить Достоевского! Помните, как он стоял на площади, ожидая смерти, и несметным богатством казались ему даже пять минут, и он клялся, что, если ему дана будет жизнь, он ни минуты больше не потратит впустую?
И снова охватывает горечь. Потому что, полагаю, позади у каждого из нас – огромное количество попусту потраченных дней. Только и остается, что вспомнить: идет Рождественский пост. Еще один дар, 40 дней до Вифлеемской пещеры.
А что если сделать это одной из задач на пост? Наполнить смыслом каждый из оставшихся до явления звезды дней? Ни один день не прожить вхолостую, в черновую, «просто так»? Потому что каждый – уникален.
Каждый – дан один раз.
Он не повторится.
***
И вот финал. Сим и Лайт возвращаются к пещерам и рассказывают остальным: есть спасение. Мы можем жить вечно!
Происходит потрясающая вещь: люди не желают уходить из пещер! Не желают променять гарантированные (более-менее) 8 дней на вечность
И тут происходит потрясающая вещь: люди не желают уходить из пещер! Не желают променять гарантированные (более-менее) 8 дней на вечность. Не хотят предпринять сложный путь к кораблю, боятся расстаться с обжитыми жилищами (разумеется, здесь в тексте вновь проступают очертания библейских историй, хотя бы тех же самых египетских котлов, которые оказались слаще жизни с Богом).
В конце концов Сим с горечью понимает: мало кто желает приобрести вечность… С ним уходят далеко не все.
***
Разумеется, текст Брэдбери – все-таки не притча в чистом виде. Много в тексте избыточных деталей, есть навязчивые повторы, местами излишне цветасты метафоры.
Вряд ли станешь многократно перечитывать его.
Но это и не нужно. Основное запомнится надолго. Может, навсегда.
«Жизнь пролетает стремительно».
«Мы можем жить вечно».
Кто убо премудр приобрести за немногие дни вечность?
Споры о том, нужно ли разработчикам писать алгоритмический код на собеседованиях, бесконечны. В поддержку положительного ответа я уже публиковал рассказ об алгоритмических секциях с написанием кода в Яндексе и примерами задач, которые там можно встретить. Теперь я хочу развить эту тему и показать примеры реального продакшен-кода.
Все примеры когда-то написали конкретные разработчики в процессе решения достаточно рутинных задач. Я никак не улучшал код перед публикацией, лишь местами адаптировал его так, чтобы он был понятен без знакомства с нашей кодовой базой. Поэтому некоторые примеры кода могут показаться вам недостаточно классными, но в условиях постоянного давления сроков невозможно шлифовать абсолютно весь код.
В статье четыре примера. Два на C++, один на TypeScript и один на Python. Способность быстро писать относительно простые алгоритмы без багов — общая необходимость, она не зависит от специализации разработчика.
1. Поисковые подсказки в Яндекс.Маркете и ассоциативные массивы
В конце 2016-го года моя команда занималась поисковыми подсказками в мобильной версии Яндекс.Маркета. Нам нужно было адаптировать решения, уже принятые в большом Поиске, к реалиям поиска по товарам. Результаты той работы пользователи Маркета могут видеть и сейчас:
Поисковые подсказки в мобильном Яндекс.Маркете
Старые подсказки Маркета содержали только названия товаров и, скажем, среди них нельзя было встретить строчку «купить телевизор», хотя такой запрос пользователи задавали довольно часто. Поэтому среди прочего мы хотели добавить в саджест Маркета тексты поисковых запросов. Но эти запросы содержат специфические товарные стоп-слова или стоп-фразы — ничего не меняющие в смысле, но очень часто встречающиеся, например: «где купить», «дёшево», «лучший». Такие фразы пользователи дописывают в любые части любых запросов, и из-за этого первая версия нового алгоритма постоянно предлагала дописать к запросу что-то вроде «купить» и «дёшево», и это выглядело максимально странно.
Мы хотели подсказывать только содержательные продолжения запросов. Реализовать это можно было многими способами, но не хотелось тратить много времени на программирование идеального решения, так что сделали следующее: товарные стоп-фразы собрали в отдельный словарь, каждую фразу превратили в набор хешей от нормализованных слов и пар нормализованных слов; аналогичное действие совершили с поисковыми запросами. Затем запросы, в множестве хешей для которых встречались хеши стоп-фраз, выкидывались. Основную логику реализовывала функция:
bool ContainsStopHash(const TString& text,
TEasyParser& easyParser,
const THashSet<size_t>& stopHashes)
{
std::vector<TString> words;
easyParser.ParseUTF8Text(text, &words);
size_t unigramHash = 0;
size_t bigramHash = 0;
for (const TString& word : words) {
const size_t lastUnigramHash = unigramHash;
const size_t wordHash = word.hash();
unigramHash = wordHash;
bigramHash ^= wordHash;
if (stopHashes.contains(unigramHash) || stopHashes.contains(bigramHash)) {
return true;
}
bigramHash ^= lastUnigramHash;
}
return false;
}
Здесь TEasyParser
— класс, реализующий превращение текста в вектор слов, приведённых к начальным формам, THashSet
— аналог std::unordered_set
, а TString
— наш класс для строк.
Основное содержание метода — относительно простой цикл, но при реализации легко ошибиться: например, положить в множество хешей ноль или неправильно обработать последнее слово. В конце концов, можно просто написать слишком медленный алгоритм, не будучи знакомым с концепцией ассоциативных массивов.
2. Reservoir sampling на MapReduce
Положим, у меня есть очень-очень много данных, сгруппированных по ключам. Например, это могут быть поисковые запросы, сгруппированные по показам элементов поисковой выдачи.
Иногда возникает необходимость посмотреть на небольшое репрезентативное подмножество данных для конкретного набора ключей. Скажем, я часто смотрю на выборки показанных фактовых ответов — чтобы понять, не нужно ли как-то их обогатить или что-нибудь поправить в алгоритмах.
Пример фактового ответа
Общий объём данных для каждого из ключей может быть сколь угодно большим, поэтому нельзя, например, вычитать все данные и перемешать их, нужно делать что-то более хитрое. Тем не менее, можно адаптировать идею из стандартной реализации метода std::shuffle.
Если коротко, то идея следующая. Допустим, нужно случайным образом перемешать массив. Будем обрабатывать элементы по одному, слева направо; рассматривая очередной элемент с номером i
, сгенерируем случайное число от 0
до i
включительно и обменяем значениями текущий элемент и элемент на выбранной позиции.
Адаптировать этот алгоритм к нашей ситуации можно так. Представим, что мы перемешиваем входные данные случайным образом, а затем берём K
стартовых элементов — очевидно, это будет статистически корректный способ. Чтобы получить первые K
элементов, не нужно хранить весь перемешанный массив, по существу можно хранить только первые K
элементов. В алгоритм std::shuffle тогда можно внести такое изменение: если очередной элемент меняется местами с одним из первых K
элементов — помещаем его туда, а если нет, то не делаем ничего.
Другими словами: будем обрабатывать входные элементы по одному и при обработке очередного i
-го элемента будем выбирать случайный номер от 0
до i
включительно. Если этот номер меньше, чем K
— поместим текущий объект в ответ, при необходимости исключив из него какой-то ранее уже добавленный элемент. Код reducer’а выглядит так:
void Do(TMRReader* input, TMRWriter* output) override {
TVector<TNode> sample;
TMersenne<ui64> mersenne;
size_t passedItems = 0;
for (; input->IsValid(); input->Next()) {
++passedItems;
size_t position = mersenne.GenRand64() % passedItems;
if (position >= ItemsToTake) {
continue;
}
if (sample.size() < ItemsToTake) {
sample.push_back(input->GetRow());
} else {
sample[position] = input->GetRow();
}
}
Shuffle(sample.begin(), sample.end(), mersenne);
for (const TNode& node : sample) {
output->Add(node);
}
}
Здесь TMersenne
— наша реализация алгоритма mersenne twister, то есть хороший генератор псевдослучайных чисел, TNode
— структура, хранящая одну строку MapReduce-таблицы.
Эта реализация позволяет тратить объём дополнительной памяти, пропорциональный длине ответа и не зависящий от объёма входных данных.
3. Обработка параметров и TypeScript
Алгоритмы в широком смысле слова приходится писать не только бэкенд-разработчикам. В этом примере — отрывок кода клиентской части одного из наших сервисов.
При обработке url’ов иногда приходится сталкиваться с неудобствами в работе с параметрами. Например, url может содержать путь /action?param=¶m=1;2;3¶m=8
, тогда стандартные средства работы с параметрами url порождают такую структуру:
{
"param" : ["", "1;2;3", "8"]
}
С такой структурой неудобно работать, так как элементы массива невозможно обрабатывать единообразно. Было бы удобнее работать, например, с такой структурой:
{
"param" : ["1", "2", "3", "8"]
}
Для её получения была написана функция:
export type TParamValue = string | string[];
export type TParams = Record<string, TParamValue>;
export function normalizeParams(params: TParams): TParams {
const result = {};
for (const [paramName, paramValue] of Object.entries(params)) {
// массив может быть при наличии двух одинаковых query-параметров
if (Array.isArray(paramValue)) {
result[paramName] = paramValue.reduce((acc, part) => {
if (part) {
acc = acc.concat(part.split(';').filter(Boolean));
}
return acc;
}, []);
} else if (paramValue) {
result[paramName] = paramValue.split(';').filter(Boolean);
}
}
return result;
}
Здесь разработчику потребовалось продемонстрировать два важных навыка. Первый — обнаружить и обработать все краевые случаи. Второй — написать реализацию достаточно быстро и надёжно: если на реализацию, тестирование и отладку подобного кода тратить уж слишком много времени, поддерживать необходимый темп релизов никак не получится.
4. Python для аналитики
На основе результатов аналитики принимаются важные бизнес-решения; например, запускаются или отменяются проекты, оцениваются результаты работы команд, перераспределяются ресурсы разработки. При этом часто аналитические задачи довольно уникальны, для них нет готовых решений и нужно значительную работу делать с нуля. В таких условиях особенно легко ошибиться, поэтому для аналитиков способность не допускать багов и получать достоверные результаты особенно важна!
Ниже — отрывок аналитического кода. Автору захотелось исследовать взаимодействие с определёнными элементами поисковой выдачи — теми, у которых некоторое свойство попадает в список заранее определённых значений. Такая аналитика бывает полезна для того, чтобы понять, востребованы ли те или иные элементы, как с ними взаимодействуют пользователи, не нужно ли что-нибудь исправить или не стоит ли учесть в их ранжировании какие-нибудь дополнительные факторы.
count = 0
firstPos = -1
clicks = 0
for block in blocks:
result = bl.GetMainResult()
if result.IsA('TWebResult'):
url = result.Url
pos = result.Pos
propValue = result.PropValue
if propValue in interestingValues:
count += 1
if firstPos == -1:
firstPos = pos
for cl in bl.GetClicks():
clicks += 1
yield Record(count=count,firstPos=firstPos,clicks=clicks)
Интересные значения свойства заранее были сложены в set
, что позволяет очень быстро осуществлять проверку.
Даже в этом достаточно простом случае от аналитика потребовалось уверенно владеть ассоциативными массивами, а также учесть некоторые особенности наших данных — в частности, проверить, что каждый элемент имеет правильный тип.
5. Как это соотносится с собеседованиями
Все эти примеры иллюстрируют, что разработчики независимо от их специальности должны владеть базовой алгоритмической подготовкой, которая позволит им быстро и надёжно реализовывать простые алгоритмы, обрабатывая краевые случаи и при необходимости используя предоставляемые языком средства — такие как ассоциативные массивы. Давайте взглянем с этой точки зрения на примеры тех задач, что я разбирал на YouTube (раз, два) и в общем описании алгоритмических секций на Хабре.
Первая задача. Дан массив, состоящий из нулей и единиц. Необходимо вывести длину максимального непрерывного подмассива, состоящего только из единиц.
def foo(nums):
current = 0
best = 0
for n in nums:
if n > 0:
current += 1
best = max(best, current)
else:
current = 0
return best
Вторая задача. Даны две строки. Необходимо проверить, являются ли они анаграммами: отличаются ли они только порядком следования букв. Требуется сделать это за линейное время и при этом не менять входные параметры.
def dictFromString(s):
d = defaultdict(int)
for c in s:
d[c] += 1
return d
def areAnagrams(a, b):
return dictFromString(a) == dictFromString(b)
Третья задача. Генерация правильных скобочных последовательностей: дано число n
. Необходимо распечатать все правильные скобочные последовательности длины 2n
в лексикографическом порядке.
def generate(cur, open, closed, n):
if len(cur) == 2 * n:
print cur
return
if open < n:
generate(cur + '(', open + 1, closed, n)
if closed < open:
generate(cur + ')', open, closed + 1, n)
def parens(n):
generate('', 0, 0, n)
Итого, и в работе, и на собеседованиях программисту нужно уметь:
- реализовывать простые алгоритмы быстро и без багов;
- аккуратно обрабатывать краевые случаи либо писать код так, чтобы эти краевые случаи не возникали;
- уметь пользоваться базовыми конструкциями языка программирования (например, ассоциативными массивами);
- придумывать достаточно хорошие решения; пусть не идеальные, но подходящие для текущих ограничений.
Кандидаты, претендующие на позиции старших и ведущих специалистов, обязательно проходят и другие секции — архитектуру, machine learning, управление проектами, в общем, те, которые соответствуют их сильным сторонам. Поэтому не стоит думать, что алгоритмические секции на собеседованиях дают несправедливое преимущество программистам-олимпиадникам: чтобы претендовать на старшие позиции, нужно не только уметь бодро писать код, но и обладать более специфичными знаниями.
Большое спасибо Никите Макарову aka nkmakarov, Сергею Вавинову, Елене Кунаковой, Егору Омельченко за помощь в подготовке статьи и отрывков кода!
Вы считаете, как и все, что Конан Дойль написал только 56 рассказов и четыре романа?
О, тогда мне есть чем вас удивить, потому что существует необычайный 57-й рассказ, который отдельно не входил ни в одно из известных собраний его сочинений.
И, почти наверняка, никогда не переводился. Вы сейчас первыми о нем узнаете, ибо находится он в совершенно необычайной библиотеке.
Но расскажу все по порядку.
Начало 20-х в Британии было трудным и отчаянным временем. Сотни тысяч жизней бездарно сгинули в полях Фландрии и Франции. С карты Европы исчезло несколько империй. Монархическое правление виделось пережитком. После отречения и убйства императора России и падения Австро-Венгерской монархии качнулся под Георгом Пятым и британский трон: усиливались республиканские настроения, от короля требовали отречения. Экономика — в упадке. Появились явные предвестники распада самой крупной империи в мировой истории, расширявшейся более чем двести лет. Более того — многим становилось ясно, что рушится весь европейский миропорядок, сложившийся примерно со времени объединенной победы над неистовым корсиканцем.
Видео дня
И как же решают в британской монархии 1921 года противостоять нарастанию энтропии?
Удивительно: сделать кукольный дом! Запечатлеть уходящее.
Феноменально несчастливая в браке внучка королевы Виктории, принцесса Мария Луиза Шлезвиг-Голштейнская, решила порадовать подругу детства королеву Марию (жену английского короля Георга Пятого) уникальным подарком — самым большим и великолепным кукольным домом на свете.
Она связалась с другом и архитектором сэром Эдвином Лютьеном, и тот сразу увидел изумительный (философский и деловой!) потенциал этой идеи. Три года лучшие художники, краснодеревщки, ювелиры, плотники проектировали и создавали эту изумительную “кукольную” резиденцию.
Что такое кукольный дом? Есть в этой идее что-то будоражащее и умиротворяющее одновременно. Это полностью подвластный тебе маленький мир, это та иллюзия контроля и предсказуемости, которые невозможны в реальном мире. Но не только. Первая мировая война показала необычайную хрупкость того, что считалось незыблемым. С германских цеппелинов впервые сбрасывали бомбы на Лондон: в Великой войне впервые стерлась граница между “театром войны” и тылом — безопасности, когда война, не осталось ни для кого…
“Я создавал то, что переживет всех нас и понесет в будущее и в незнакомый грядущий мир то, как мы жили. Это уменьшенная копия нашего уходящего мира”, — писал сэр Эдвин в 1921 году, охваченный понятным эсхатологическим чувством.
Фасад имитировал обманчиво воздушную георгианскую неоклассику Кристофера Рена (имитация портландского камня) и на шарнирах поднимался вверх, чтобы видны были интерьеры комнат.
Все там было настоящим, в масштабе 1:12.
Проведено электричество и водопровод, работали лифты. Известных художников попросили расписать потолки и исполнить миниатюрные копии. В комнатах прислуги — чудо техники: пылесос и швейная машинка “Зингер”. На кухне — точные копии баночек с джемом, кофе, крошечные бутылочки шампанского Veuve Clicquot (да-да, самая знаменитая веселая вдова на свете!), печений McVities ( с логотипами производителей, многие благополучно процветают и сейчас!), машины для гаража изготовили на заводах Rolls Royce, ювелиры фирмы Cartier изготовили каминные и напольные часы. Знаменитый ландшафтный художник разработала дизайн сада и сам Густав Холст написал музыку для миниатюрных нот на рояле…
Дом получился таким изумительным, что стал сенсацией на Выставке Искусств и Ремесел Британской Империи 1924 года. Для производителей, поставивших копии своих товаров с хорошо различимыми логотипами, это также явилось прекрасной рекламой. Выставку посетило более двух миллионов человек. Люди выходили воодушевленные: если в стране еще умеют делать такие удивительные по мастерству и практической бесполезности вещи, не все еще пропало!
Самое необычайное в домике — библиотека! Здесь настоящее все: копии картин, и росписи, и гобелены, и мраморный камин, и персидский ковер, и глобус, и книги! Да, все это крошечные фолианты с сокращенными текстами Библии, Шекспира, Диккенса. Королева Мария могла достать их с полки и полистать под лупой. Всем известным британским авторам были заказаны миниатюрные произведения для этой библиотеки. Для них писали — Томас Харди, М. Джеймс, Эдит Уортон, Олдос Хаксли, Редьярд Киплинг и многие другие. Понятно, что отказались только Вирджиния Вульф и Бернард Шоу. Их не стали уговаривать. А вот Конан Дойль согласился. Он написал самый короткий рассказ “Как Уотсон научился трюку” (если перевести дословно). И еще замечательно, что книга эта рукописная. Рука самого Конан Дойля.
Конечно, я купила ее миниатюрную копию.
Вот мой (неотредактированный) перевод этого самого маленького рассказа о Уотсоне и Холмсе.
“Уотсон внимательно следил за своим компаньоном с тех самых пор, как тот уселся за стол завтракать. Холмс поднял глаза и увидел его взгляд.
—Так, Уотсон, о чем Вы думаете?”- спросил он.
—О Вас.
—Обо мне?
—Да, Холмс. Я думал о том, как банальны все Ваши трюки и как удивительно, что они продолжают вызывать интерес у публики.
—Совершенно с Вами согласен, — сказал Холмс. — Более того, припоминаю, что и сам говорил нечто подобное.
—Вашему методу, — сказал Уотсон резко, — Не так уж трудно научиться!
—Вне всякого сомнения, — с улыбкой ответил Холмс- Может, Вы и сами приведете пример такого метода размышлений.
—С удовольствием, — сказал Уотсон. — И могу сказать, что Вы были чем-то озабочены, когда одевались сегодня утром.
—Прекрасно! — сказал Холмс,- Как Вы об этом догадались?
—Вы обычно довольно аккуратны, а тут забыли побриться.
—Боже мой! Это действительно проницательно, — сказал Холмс, — Я и понятия не имел, что Вы такой одаренный ученик! Осталось ли нечто еще, что не смогло укрыться от Вашего орлиного глаза?
—Да, Холмс. У Вас есть клиент по фамилии Барроу, дело которого Вам не удалось распутать.
—Боже мой, как Вы об этом узнали?
—Я видел конверт с этим именем. Вы открыли его, издали стонущий звук и поглубже засунули конверт в карман, с гримасой боли на лице.
—Восхитительно! Вы очень наблюдательны.
—Опасаюсь, Холмс, что Вы также занялись финансовыми спекуляциями.
—И как Вам удалось догадаться, Уотсон?
—Вы открыли газету на биржевой странице и издали громкий, заинтересованный возглас.
—Что ж, это очень умнО, Уотсон. Что-нибудь еще?
—Да, Холмс, вместо своего халата Вы надели черный сюртук, это говорит о том, что Вы ожидаете визита кого-то довольно важного.
—Что-нибудь еще?
— Я не сомневаюсь, Холмс, что нашел бы и еще, но я привожу только несколько этих пунктов, чтобы доказать: есть и другие люди в мире, столь же проницательные, что и Вы.
—Есть и не столь же проницательные, — сказал Холмс- Признаюсь, Уотсон, их не так уж много, но я должен включить и Вас в их число.
—Что Вы имеете в виду, Холмс?
—То, мой дорогой друг, что Ваши заключения не так удачны, как мне бы хотелось.
—Вы хотите сказать, что я ошибся.
— Боюсь, что так. Давайте рассмотрим каждый пункт. Я не побрился, потому что отправил бритву точильщику. И надел сюртук, потому что у меня, к несчастью, был назначен визит к дантисту. Его зовут Барлоу, письмо было от него, оно подтверждало назначенное время. Страница о крикете в газете идет рядом с финансовой, и я проверил, как сыграла команда Саррея против Кента. Но, продолжайте, Уотсон, продолжайте! Это довольно банальный трюк и, я уверен, вскоре Вы его освоите!
The end”
“Кукольный” дом королевы Марии выставлен в Виндзорской крепости хрупким апофеозом ушедшей эпохи, в его окнах горят крошечные люстры, слышится призрачная музыка…
Домику почти сто лет.
Хрупкое пережило то, что казалось незыблемым…
Ах, как часто мы столь же проницательны о будущем, как и старый, добрый Уотсон)))
Важно: мнение редакции может отличаться от авторского. Редакция сайта не несет ответственности за содержание блогов, но стремится публиковать различные точки зрения. Детальнее о редакционной политике OBOZREVATEL поссылке…
Праздничный марафон берет свое начало в 1990-х и каждый год обходит все предложения правительства сократить число нерабочих дней. Разбираемся, почему «на новогодние» мы хотим долго отдыхать и насколько это полезно
Как было раньше
Если проследить историю новогодних каникул в России и СССР, то тенденция к увеличению праздничного периода, а потом и к неудачным попыткам его сокращения, станет наглядной. Больше всего на нынешнюю ситуацию похоже положение вещей в конце XIX века: закон разрешал гражданам не работать в Рождество, Новый год и еще 12 праздничных дней. В первые годы советской власти выходным считалось только 1 января. Все изменило постановление СНК СССР, в котором слово «праздники» заменили на «революционные дни» — а к ним Новый год и тем более Рождество отнести было просто невозможно. Елки вернулись в жизнь советских людей в 1935 году, но Новый год так и считался исключительно детским праздником, а это значило, что взрослым выходной ни к чему. Так продолжалось вплоть до 1947 года, когда впервые после войны 1 января вернули статус выходного. Писательница Татьяна Толстая посвятила этому дню целый рассказ под названием «Пустой день»: «Как бы мы жили, если бы этого дня не было! Как справились бы с жизнью, с ее оглушительным и жестоким ревом, с этим валом смысла, понять который мы все равно не успеваем!»
Но уже 2 января всеми правдами и неправдами советский человек должен был оказаться на рабочем месте — на этом праздники заканчивались. С распадом СССР выходные дни в новогодний период стали нарастать как снежный ком: сначала прибавились 2 и 7 января, потом период с 3 по 5, а к 2012 году россияне стали отдыхать до 8 января. Не все граждане воспринимали эту, казалось бы, выгодную для всех реформу положительно. В 2009 году результаты опроса Superjob показывали, что далеко не все россияне готовы к десятидневному отдыху, их вполне устраивают 3 или 5 дней: «А остальное — это уже не отдых, а пытка!»
Что насчет 2022-го?
В последние годы вместе с украшением елки и нарезанием оливье ежегодной традицией в России стала и «перетасовка» новогодних каникул. Депутаты и врачи то и дело требуют сократить праздники, а обычные граждане этому сопротивляются, отстаивая свое право на «отпуск» после тяжелого декабря.
В этом году также не обходится без дискуссий о новогодних каникулах. Несмотря на то, что производственный календарь на 2022 год утвердили еще в сентябре, коррективы в него может внести очередная волна коронавируса. Пока праздники остаются на своих местах — россияне будут отдыхать с 1 по 9 января. Нововведения коснутся 31 декабря — по новому указу этот день впервые становится выходным. Вопрос об этом поднимался чуть ли не каждый год с 2004-го. Еще тогда спикер Совета Федерации Сергей Миронов выступил с идеей сделать 31 декабря нерабочим, чтобы люди «не изображали работу, не били баклуши на рабочем месте, а лучше бы наряжали елки и готовились дома к празднику».
Несмотря на постоянные попытки урезать дни отдыха, в этом году возможен и обратный исход. Этой осенью на волне обострения эпидемиологической обстановки и ввода недели выходных, в СМИ появилась информация о том, что новогодние каникулы в 2022 году продлят. Пока пресс-секретарь президента Дмитрий Песков, скорее, опровергает предположения: «Конечно, не хотелось бы продлевать новогодние каникулы. Но главное — сохранность жизни и здоровья. Для этого могут приниматься самые неординарные меры». По данным опроса Superjob, сейчас тех, кто одобряет 10-дневные каникулы, меньше, чем когда-либо — 49%. Большинство россиян либо выступает против («Без QR-кода никуда не сходишь», «Нет денег праздновать», «И так весь год отдыхаем»), либо занимает позицию в духе: «Мне все равно, так и так буду работать».
Почему праздники хотят сократить?
Несмотря на прибавление к «новогоднему отпуску» еще одного дня — 31 декабря — сторонников уменьшения каникул становится все больше. Еще в 2020 году, который побил рекорд по количеству выходных дней, в дело решительно вмешался глава экономического комитета Совфеда Андрей Кутепов. Он выступил с инициативой сократить новогодние каникулы, чтобы компенсировать нерабочие дни, объявленные на фоне пандемии COVID-19. Кутепов апеллировал к тому, что россияне и так отдыхали целых 120 дней и 27 дней находились в самоизоляции, однако его инициативу не поддержали, и страна как обычно на 10 дней «выпала из жизни».
В чем же кроется причина, по которой и власть, и многие жители России периодически выступают за отмену длинных выходных?
Во-первых, дело в качестве отдыха. Погодные условия зимой не позволяют большинству людей провести время с пользой для здоровья, именно поэтому так популярна стала идея переноса новогодних выходных на майские, которые многие проводят на даче или в путешествии. Во-вторых, отсутствие каких-либо занятий приводит к злоупотреблению алкоголем — запои называют одной из главных причин, почему стоит сократить новогодние каникулы. Экс-руководитель Минздрава Геннадий Онищенко в 2012 году отозвался об этом периоде как о «декаде ужасов»: «Большинство граждан нашей страны будет предоставлено самим себе. Нет более страшного врага для нашего гражданина, чем он сам». Отравления несвежими салатами, переедание, аллергия на мандарины и сладкое, бытовые травмы в ходе семейных ссор, травмы, связанные с активных отдыхом, переохлаждение — именно в новогодние выходные возрастает количество случаев обращения в «Скорую помощь». Праздники не дают людям восстановить силы, а отбирают их. В-третьих, длинные выходные стране экономически невыгодны. По данным на 2020 год, один день отдыха стоит около ₽120–150 млрд, а всего из-за праздников Россия теряет более ₽1 трлн.
Где еще Новый год отмечают так масштабно?
Россия — одна из немногих стран, в которой Новый год отмечается с таким размахом. Возможно, дело в менталитете — иностранные власти не так щедры по отношению к своим гражданам. В большинстве европейских стран отдыхают два дня на Рождество и аналогично на Новый год. Очень масштабно празднуют Новый год в Китае, но он приходится на начало февраля, и официальных выходных всего 5–6 дней. Ближе всего к российскому формату празднования оказываются японцы: период с 31 декабря по 3 января считается у них выходным аж с 1948 года. Но все же и это довольно далеко от русского десятидневнего застолья, поэтому Россия уже два десятилетия остается рекордсменкой по длительности новогодних каникул.