Тестовое задание Yandex
Был несколько месяцев назад в Yandex.
Думал летом поработать там, а потом если бы устроил то остаться на постоянку. К сожалению ритм в Москве очень сложный и побыв 3 дня там понял, что жить я не смогу в столице. Прийдя на собеседование мне сказали, что на удаленку не берут, хотя вроде были готовы взять офисным сотрудником. Хочу показать тестовое задание, которое мне дали. Чтобы те, кто хочет работать в Yandex проверили свои силы и возможно устроились в эту классную компанию. Итак тестовое задание http://vreshenie.ru/Trip_Sorter.doc Теперь как сделал я. Ниже я опишу, что сделано не так и свои комментарии http://vreshenie.ru/done.html Код думаю все смогут просмотреть))) Итак: 1 - Я сделал для наглядности генерацию карточек, чего делать не надо было. 2 - По поводу сортировки и в каком формате должны быть карточки. Карточки должны выглядеть так { "Города 1":{ параметры }, "Город 2":{ параметры } } У меня в коде по другому. Почему именно так. Предположим у нас есть массив, и надо найти индекс массива, у которого у одного из объектов имеется параметр с тем или иным значением. Если это делать через for(), то времени уйдет очень много. Если же это делать обращаясь к свойству объекта, то выполниться моментально. Пример var o = {}; for(var i=0;i<1000000;i++){ o[i] = (function(i){ return function(){ console.log(i); }; })(i); } var t1 = new Date().getTime(); o[900000](); var t2 = new Date().getTime(); console.log(t2-t1); 3 - В коде я использую arguments.callee. Если не ошибаюсь, Илья Кантор говорил, что в EcmaScript 5 этого свойства нет. Также если не ошибаюсь, мне говорили, что при вызове рекурсивной функции через arguments.callee, затрачивается ресурсов в два раза больше, чем при вызове внешней функции. Как то так. В любом случае arguments.callee - использовать не следует. 4 - В программе есть баг при генерации карточек. Но так как это не требовалось, то решил не исправлять. Баг в том, что у одинакового вида транспорта одинаковый рейс и все параметры. Надеюсь кому-нибудь пригодится. Удачи. |
Посмотри тут
пример.. Похоже Яндекс позаимствовал тест. задание у кого-то... А что там с темпом?? Яндекс заставляет работать круглосуточно?? |
DrStrangelove, если не секрет, как это вы с ходу нашли это задание?
PS: вообще задание простое, но весьма интересное с точки зрения его реализации разработчиками. Я бы к примеру, вообще по другому все сделал. Этим оно и интересно |
Цитата:
Я там не работал. Лишь был на собеседовании. Очень понравился офис. Понравилось, что можно на стенах маркером писать - удобно. А еще очень приятно было разговаривать с Федором Голубевым - очень позитивный человек :) |
Цитата:
Хочется себя проверить :) А как бы Вы сделали? |
Цитата:
Нашёл давно, когда только увидел это тест. задание в вакансиях Яндекса- стало интересно как сортировать объекты, и в Гугле как-то всплыла эта ссылка.. |
Цитата:
Проверяют дипломы?? Требуют высшее образование?? обязательно профильное программерское?? или просто высшее?? В объявлениях о вакансии часто не пишут о в/о, в основном об опыте.. А как на самом деле, на собеседовании?? |
Цитата:
Хотя в вакансиях пишут, что желательно. Вообще, если есть знания и без ВО можно работать. Например V~Vladi вроде без ВО, а работает в очень серьезной фирме :) ВО нужно для формирования личности, фундамента знаний, знакомства с очень интересными людьми, выбора пути в жизни и много то, что просто не рассказать. Все профессиональные знания получаются на работе в реальных условиях бизнеса. Либо самим человеком при чтении книг, блогов и прочего. Про собеседование: Я общался с Федором Голубевым и еще одним человеком. Вопросы были вроде тех, что вот здесь http://company.yandex.ru/job/vacanci..._developer.xml http://company.yandex.ru/job/vacanci...dia_search.xml Мне на собеседовании очень понравилось))) Длилось где-то два часа. Я не помню уже всего о чем спрашивали. Вот что запомнилось 1 - Что такое JSONP 2 - Реализации ООП в js(примеры) 3 - Про замыкания, классический пример с массивом Больше ничего не запомнилось))) Собеседование проходило в кабинете с надписью "Пятая колонна" Было очень дружелюбно. На прощанье дали папочку с надписью "Яндекс"))) |
> Карточки должны выглядеть так
не должны. для ускорения выборок лучше создать отдельный индекс как в реляционных субд. нет ничего хуже, чем внутренняя оптимизация зашитая во внешний апи. > В любом случае arguments.callee - использовать не следует. почему? не вижу ни одного веского аргумента. аналогичная ситуация с with. |
Цитата:
|
Цитата:
Не подскажешь как правильно ответить на этот вопрос: Дан код: var rx1 = RegExp(/regular/ + /expression/); var rx2 = /regularexpression/; Что нужно добавить в начало программы, чтобы rx1 и rx2 стали идентичными? Сами строчки трогать нельзя. |
Цитата:
Вот этот пример я до сих пор не знаю как правильно сделать))) Это же для Яндекс бар, возможно там что-то из EcmaScript 5, вроде use strict. |
Цитата:
|
Скажем, это:
// OLD var rx1 = RegExp(/regular/ + /expression/); var rx2 = /regularexpression/; alert([rx1, rx2]) alert([rx1.test('regularexpression'), rx2.test('regularexpression')]) // false, true T_T // NEW var oldToString = RegExp.prototype.toString; RegExp.prototype.toString = function(){ var value = oldToString.call(this); return value.replace(/\//g, '') } var rx1 = RegExp(/regular/ + /expression/); var rx2 = /regularexpression/; alert([rx1, rx2]) alert([rx1.test('regularexpression'), rx2.test('regularexpression')]) // true, true! ^_^ |
Я просто привел пример, что спрашивают.
Т.е. все, что есть в примерах вакансий со страницы http://company.yandex.ru/job/vacancies/ Да особо и раскрывать то нечего. Думаю, чтобы пройти собеседование, надо прочитать книги http://oreilly.com/catalog/9780596805531 http://oreilly.com/catalog/9780596806767 И всё. Знаний будет достаточно. |
|
B@rmaley.e><e, у регекспов есть замечательное свойство source
|
tenshi, спасибо, забыл о существовании такового. Лучше, конечно, использовать его, чем костыль с toString.
|
Цитата:
value?? |
Переопределяется метод toString для регэкспов, который вызывается, например, в случае /regexp1/ + /regexp2/, так, чтобы возвращать свое значение не в виде /regexp/flags (флаги в текущей версии не предусмотрены), а просто в виде regexp. Тогда конкатенация /regexp1/ + /regexp2/ даст regexp1regexp2, которая, будучи переданной аргументом RegExp, станет /regexp1regexp2/.
oldToString используется для получения строкового представления регэкспа. В value попадает как раз содержание регэкспа. Но с учетом поправки, корректный код будет выглядеть так: // OLD var rx1 = RegExp(/regular/ + /expression/); var rx2 = /regularexpression/; alert([rx1, rx2]) alert([rx1.test('regularexpression'), rx2.test('regularexpression')]) // false, true T_T // NEW RegExp.prototype.toString = function(){ return this.source; } var rx1 = RegExp(/regular/ + /expression/); var rx2 = /regularexpression/; alert([rx1, rx2]) alert([rx1.test('regularexpression'), rx2.test('regularexpression')]) // true, true! ^_^ |
Цитата:
RegExp.prototype.toString = function(){ return this.source; } var rx1 = RegExp(/regular/ + /expression/); var rx2 = /regularexpression/; alert(rx1 == rx2); как альтернативный подход: var rx1 = RegExp(/regular/ + /expression/); var rx2 = /regularexpression/; rx1 = rx1.source.replace(/\W/g, '').replace(/.*/, '/$&/'); rx1 = rx1.toString(); rx2 = rx2.toString(); alert(rx1 === rx2) |
monolithed, регэкспы - объекты, в данном случае идентичными в смысле оператора == они не будут никогда.
|
Цитата:
|
есть идентичность по имени (которое в данном случае - адрес в памяти), а есть идентичность по содержимому (рекурсивное равенство всех данных).
первая - как правило бесполезна. редко когда нужно отличать объекты с одинаковым содержимым. вторая же наоборот как правило и нужна, но по неведомой мне причине, реализуется через костыли типа a.equal(b) по хорошему оператор == должен проверять именно идентичность данных, а не проверять через десяток эвристик: если оба объекты - сравниваем по имени, если один из них строка - сравниваем "строковые представления" (которые у разных объектов либо отражают содержимое, либо лишь принадлежность к классу), если один из них число - сравниваем "примитивные значения". |
Вчера monolithed, дал ссылку на интересные примеры.
Огромное тебе спасибо monolithed.:) Совет всем глянуть http://code.google.com/p/jslibs/wiki/JavascriptTips Честно признаюсь, что и понятия не имел о таких тонкостях и методах. Возьмем несколько примеров 1 - Почему это так? var a = [4,5,6]; var b = [7,8,9]; Array.prototype.push.apply(a, b); uneval(a); // is: [4, 5, 6, 7, 8, 9] 2 - Про такую технику я не знал, хотя до этого можно было додуматься))) Milliseconds since epoch alert(+new Date()); 3 - var text = <> this is my multi-line text </>.toString(); console.log(text); 4 - Creates a random alphabetic string function RandomString(length) { var str = ''; for ( ; str.length < length; str += Math.random().toString(36).substr(2) ); return str.substr(0, length); } RandomString(10); 5 - Kind of destructuring assignments Как это? var { a:x, b:y } = { a:7, b:8 }; console.log(x); // prints: 7 console.log(y); // prints: 8 |
Цитата:
Цитата:
Цитата:
|
Цитата:
apply(this, [name, value]). Цитата:
решил удалить, а коммент оставил. Вот к чему это было Simulate threads using yield operator //// thread definition function Thread( name ) { for ( var i = 0; i < 5; i++ ) { Print(name+': '+i); yield; } } //// thread management var threads = []; // thread creation threads.push( new Thread('foo') ); threads.push( new Thread('bar') ); // scheduler while (threads.length) { var thread = threads.shift(); try { thread.next(); threads.push(thread); } catch(ex if ex instanceof StopIteration) {} } |
Там многие вещи из JavaScript 1.6+ поэтому, работать будет только на платформах Geko и SpiderMonkey (до принятия ES6-7, однако кому не терпится можно попробовать уже сейчас) причем для запуска тех же yield/let код нужно заключать в дескрипторы с указанием версии:
<script type="application/javascript;version=1.7"/> |
ООооо.... Безграничные возможности для индусов.
|
ого, я думал про js знаю всё, однако о такой фиче даже и не подозревал:
var result job: { if( result ) break job result= 0 if( result ) break job ++result if( result ) break job ++result } alert( result === 1 ) всегда эмулировал её через цыкл #^_^# |
Цитата:
что это и для чего? |
float, быстрый выход из блока. Типа
do { if( some_condition ){ break; } // ... // все условия выполнены do_smth(); } while(0); |
Цитата:
function foo() { this.result = this.result || 0; return this.result++; } alert([foo(), foo(), foo()]); |
не совсем понял.
я про foo: {} конструкцию спрашиваю. что это такое? никогда не использовал. (если честно и do while тоже) |
а сё. нашёл в "коране" пару строк про метки:)
|
Цитата:
|
ещё вопросик: что за функция uneval ?
|
Цитата:
var obj = { a: 0, b: 1 }; alert(uneval(eval(uneval(obj))) === uneval(obj)); // гарантированно true alert(obj.toSource(eval(obj.toSource(obj))) === obj.toSource(obj)); //true Основное отличие uneval() от toSource(): var obj = {}; alert('uneval(): ' + uneval(obj.UnexistProperty) +'\n'+ 'toSource(): ' + obj.toSource(obj.UnexistProperty)); |
WTF is that ?!
// SIC !!! function abc (/*->*/ { a : a, b : b } /*<-*/) { alert( "a="+a+"\nb="+b) } abc({a:' a_var ', b:'b_var'}) это как, где, откуда и почему???? я в шоке еще одно " WTF ?! " <body>I`m a body!!11</body> <script>alert( "Body? -> "+typeof document.body+"\nUneval? -> "+uneval(document.body) )</script> короче пойду ка я еще поудивляюсь... оно та оказывается, уже без пометки используется |
Цитата:
var a, b; [a, b] = [1, 2]; alert(a + ',' + b); // 1,2 Кстати, если не ошибаюсь то в ES6 (Harmony) это будет включено, т.к. в CoffeeScript хорошо обкатали эту возможность. Подробней читать тут |
Часовой пояс GMT +3, время: 02:20. |