программирование во вьетнаме
Mar. 21st, 2013 09:57 amОчень интересный рассказ Нила Фрейзера о том, как преподают компьютеры во вьетнамских школах. Не буду пытаться пересказывать - но советую прочитать. И игра его Blockly Maze для объяснения детям основных понятий программирования - тоже интересная штука.
Что касается задачи про лабиринт для старшеклассников, которую он описывает ближе к концу записи, меня это весьма впечатлило (и даже подзуживает скепсис несколько). Это действительно непростая задача, и автор не преувеличивает, когда пишет, что ее вполне можно задавать на интервью в Гугле. Любопытства ради я решил ее на Питоне, сидя за компьютером, и засек время: от начала работы до вывода всех требуемых результатов, включая отладку и все остальное, у меня заняло 35 минут.
Что касается задачи про лабиринт для старшеклассников, которую он описывает ближе к концу записи, меня это весьма впечатлило (и даже подзуживает скепсис несколько). Это действительно непростая задача, и автор не преувеличивает, когда пишет, что ее вполне можно задавать на интервью в Гугле. Любопытства ради я решил ее на Питоне, сидя за компьютером, и засек время: от начала работы до вывода всех требуемых результатов, включая отладку и все остальное, у меня заняло 35 минут.
no subject
Date: 2013-03-21 08:29 am (UTC)1) хочу мазу и задачи в классы студентам
2) готова делать задачи (т.е. перевести часть задач классических задач cs на эту мазу забесплатно и придумать новые на разные разделы; я это могу и могу много)
Причина: даже если человек олимпиадник-международник по математике, то это еще не значит, что он прекрасно начинает писать программы на формальном языке (а если не олимпиадник-международник, а просто умный мальчик, то еще менее значит).
Я готова согласиться, что часть народа в студенческие годы, как и среднюю школу, нужно учить через "программирование в картинках". Особенно, если это первый язык программирования.
3-5% на математических специальностях обучаются либо туго, либо очень туго.
no subject
Date: 2013-03-21 09:54 am (UTC)no subject
Date: 2013-03-21 10:11 am (UTC)Где в этой игре данные? Возможно эта игра развивает алгоритмическое мышление, но это не программирование.
no subject
Date: 2013-03-21 10:18 am (UTC)no subject
Date: 2013-03-21 10:36 am (UTC)no subject
Date: 2013-03-21 10:53 am (UTC)no subject
Date: 2013-03-21 11:26 am (UTC)no subject
Date: 2013-03-21 11:46 am (UTC)no subject
Date: 2013-03-21 11:54 am (UTC)no subject
Date: 2013-03-21 10:47 am (UTC)no subject
Date: 2013-03-21 10:19 am (UTC)no subject
Date: 2013-03-21 11:41 am (UTC)в конце автор рассуждает о том, что в США проблема с компетентными учителями CS, при этом умалчивает о том, откуда они взялись во Вьетнаме. что удивительно, учитывая его же слова о том, что в тамошних университетах не так всё впечатляет, т.к. CS пришли в страну недавно.
ну и по поводу нёрдов, по-моему, у него устаревшая информация. с тех пор как супергерои и звёздные войны завоевали попкультуру (последние 7-10 лет), ботаны вышли из подполья. сам этот факт уже вполне обыгрывается в фильмах, см. к примеру 21 Jump Street (2012) (http://www.imdb.com/title/tt1232829/).
no subject
Date: 2013-03-21 01:27 pm (UTC)no subject
Date: 2013-03-21 01:36 pm (UTC)no subject
Date: 2013-03-21 01:54 pm (UTC)no subject
Date: 2013-03-21 07:31 pm (UTC)no subject
Date: 2013-03-21 09:09 pm (UTC)no subject
Date: 2013-03-21 09:41 pm (UTC)no subject
Date: 2013-03-21 10:45 pm (UTC)no subject
Date: 2013-03-21 11:20 pm (UTC)no subject
Date: 2013-03-22 09:21 am (UTC)no subject
Date: 2013-03-22 03:06 pm (UTC)no subject
Date: 2013-03-22 04:58 pm (UTC)no subject
Date: 2013-12-19 08:49 am (UTC)Пошел учиться, чтоб быть не хуже вьетнамских школьников.
Вот пример решения на питоне, если кому интересно
https://gist.github.com/obiwanus/8036251
no subject
Date: 2013-03-22 09:21 am (UTC)00100
01010
10001
где верхняя единичка по идее должна быть уголком (??). Еще была мысль, что нолики и единички означают не клетки, а узлы решетки, но и в такой интерпретации в таком формате невозможно закодировать конфигурацию, которая приведена тут http://i.imgur.com/qTFiXAW.jpg как иллюстрация.
no subject
Date: 2013-03-22 09:40 am (UTC)Это дискретизированная плоскость. Единички - "точки", из которых состоят диагональные отрезки, нолики - "точки", соответствующие пустым местам. Если дан файл данных, то учитывая условие, что отрезки всегда диагональные, понятно, как соединить единички, чтобы получить представление в виде картинки. Картинка получится очень грубой, потому что в файле единичный квадрат размером всего 4x4. Если бы он был размером 400x400 "точек", то вышла бы даже более "точная" картинка, чем на иллюстрации.
no subject
Date: 2013-03-22 09:58 am (UTC)no subject
Date: 2013-03-22 01:20 pm (UTC)Я, грешным делом, вообще подумал, что единички - это клетки, где диагональ проведена одним способом, а нолики - другим.
в чем сложность задачи?
Date: 2013-03-21 08:23 pm (UTC)Re: в чем сложность задачи?
Date: 2013-03-21 09:33 pm (UTC)Сложность заключается в следуюшем:
- понять, как решается задача
- написать код на бумаге или доске без ошибок, или уметь найти и исправить собственные ошибки
- сделать это в стрессовой обстановке интервью, уложиться в заданное время
- в данной конкретной задаче есть также серьезная проблема, которую вы не заметили: правильно вернуть площадь наибольшей замкнутой области (надо учесть, в каких единицах определана площадь, это не кол-во нулей - см. правильный ответ в условии задачи). У меня на "честное" решение этой части ушла минимум треть всего времени на задачу.
В Гугле на интервью задают в принципе три разных вида задач:
1. algo
2. coding
3. system design
Для алгоритмической задачи эта слишком проста. Для задачи на написание кода она в самый раз или даже сложнее средней.
Re: в чем сложность задачи?
Date: 2013-03-22 01:34 am (UTC)ЗЫ: Я б решал задачу построчным сканированием и модификацией списков связных регионов. В компьютерной графике есть похожий алгоритм заполнения 2х-мерных областей, не помню чьего имени.
no subject
Date: 2013-03-22 07:11 am (UTC)no subject
Date: 2013-03-22 09:10 am (UTC)no subject
Date: 2013-03-22 09:21 am (UTC)no subject
Date: 2013-03-22 03:39 pm (UTC)no subject
Date: 2013-03-23 08:02 pm (UTC)Я, кажется, понял, почему вообще возник вопрос о "дырках": если обрабатывать область идя вдоль границы, то внутренние области ("дырки") не видны. Но если рассматривать внутренность каждой связной области, то "дырки" не мешают. А данное в задаче представление в виде матрицы позволяет легко идентифицировать связную (многосвязную) внутренность области через граничащие друг с другом нули.
no subject
Date: 2013-03-25 08:05 pm (UTC)no subject
Date: 2013-03-22 08:48 am (UTC)1. Заменить в матрице все «висячие» единицы (т.е. граничащие с не более чем одной единицей) на 0. Итерировать, пока таковых не останется.
2. Удалить из матрицы (скажем, заменить на «-1») все пограничные нули. (Ноль – пограничный, если с одной из 4 сторон касается границы матрицы или ранее удаленного нуля). Итерировать, пока пограничных нулей не останется.
3. (общий шаг) Выбрать какой нибудь «0» и удалить из матрицы. Затем итеративно удалить все другие нули, граничащие с ранее удаленными. При удалении накапливать суммарную площадь по правилу: если не граничит с единицами, добавить 1; если граничит с одной единицей, добавить ½; если с двумя – добавить ¼. Когда не остается нулей для удаления, накопленная сумма есть (16-кратная) площадь соответствующей области.
Продолжаем процесс, считая области и сравнивая их площади, до тех пор пока остаются нули.
У меня чистое программирование с отладкой в С++ заняло около 40 мин, но перед этим я потратил некоторое время на обдумывние алгоритма и структуры программы. Это время я не засек; это могло быть от 5 до 20 мин.
Но на интервью я бы, наверное, решал иначе, сведя к более общей задаче. Какие-то усилия заняло бы написание процедуры перевода матрицы в плоский граф (вершины с координатами и ребра), но зато потом решать легче и приятнее. Достаточно трех-четырех операторов, чтобы удалить все висячие ребра; при обходе контура элементарно считается площадь многоугольника через координаты вершин, и т.п.
no subject
Date: 2013-03-22 07:47 pm (UTC)no subject
Date: 2013-03-22 11:02 pm (UTC)Одна квадратная единица площади соответсвует 4х4=16 элементам матрицы. Нолик внутри области представлает 1\16 кв. единицы; нолик на границе - вдвое меньше; нолик в углу - вчетверо меньше.
Жульничество или аппроксимация (если даже дадут правильный результат) ничего не облегчают -- простой подсчет нуликов достаточно прост..
no subject
Date: 2013-03-23 01:53 pm (UTC)4 угловых - 1
8 пограничных - 4
13 внутренних - 13
Итого 18.
no subject
Date: 2013-03-23 07:29 pm (UTC)____1
___101
__10001
_1000001
100000001
_1000001
__10001
___101
____1
4 угловых единичек - 1
12 пограничных единичек - 6
25 внутренних ноликов - 25
Итого 32.
Площадь области: 32/16 = 2.
no subject
Date: 2013-03-23 09:17 pm (UTC)no subject
Date: 2013-03-23 09:28 pm (UTC)............1
...........1.1
..........1...1
.........1.....1
........1.......1
.......1.......1
......1.......1
.....1.......1
....1.......1
...1.......1
..1.......1
.1.......1
1.......1
.1.....1
..1...1
...1.1
....1
Площадь 6, а по вашей формуле выходит, по-моему, 97. То есть тоже приближение.
no subject
Date: 2013-03-23 09:44 pm (UTC)Как это работает можете объяснить?
no subject
Date: 2013-03-24 11:07 am (UTC)(Первоначальную наспех написанную программу я причесал, вставил комментарии и добавил печать промежутожных результатов в наглядном виде).
Если у Вас есть вопросы по коду, пишите мне. Неудобно засорять журнал Аввы посторонними вещами.
no subject
Date: 2013-03-25 05:47 pm (UTC)В данном случае, я вижу, что публика решала ярко выраженную _векторную_ задачу (именно как векторная она сформулирована в исходной абстрактной постановке) как _растровую_ задачу. Для детишек в школе, которым учитель сказал, что требуется именно растровое решение, это приемлемо - они учатся искать и считать клеточки в матрице
Готовый программист же, будучи ознакомлен с исходной абстрактной постановкой задачи, должен сделать большие глаза, увидев, что входные данные вдруг с какого-то бодуна представлены растром. Для любого job interview (если интервьюирующий не идиот) в такой ситуации правильным ответом является: ткнуть пальцем во входные данные и сказать "вы что, с дуба ляснулись?!". Садиться же тихо строчить растровое решение "за 40 минут" в такой ситуации является ярко выраженным признаком непрофессионализма.
Если же "заказчик" таки настаивает на растровом задании входа, то правильным решением будет все таки разработать собственный векторный формат входа и решение именно для векторной задачи. А затем просто написать "преобразовалку" растрового входа к вектороному, т.е. свести решение растровой задачи к уже решенной векторной задаче. Да, это может занять больше, чем 40 минут. Но это продемонтирует тот факт, что программист умеет разделять поствленную задачу на осмысленое ядро и малозначительную интерфейсную шелуху. Последеняя существует лишь потому, что "заказчик" еще сам не понял, что ему нужно.
no subject
Date: 2013-03-25 11:22 pm (UTC)Садиться же тихо строчить растровое решение "за 40 минут" в такой ситуации является ярко выраженным признаком непрофессионализма -
очевидно, относятся ко мне.
В свою защиту процитирую свой комментармй выше:
Но на интервью я бы, наверное, решал иначе, сведя к более общей задаче. Какие-то усилия заняло бы написание процедуры перевода матрицы в плоский граф (вершины с координатами и ребра), но зато потом решать легче и приятнее и т.д.
Но говорить на интервью "вы что, с дуба ляснулись?!" я бы все-таки воздержался.