Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Тестовое задание Yandex (https://javascript.ru/forum/offtopic/18474-testovoe-zadanie-yandex.html)

mycoding 02.07.2011 16:51

Тестовое задание 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 02.07.2011 17:17

Посмотри тут
пример..

Похоже Яндекс позаимствовал тест. задание у кого-то...

А что там с темпом?? Яндекс заставляет работать круглосуточно??

monolithed 02.07.2011 17:48

DrStrangelove, если не секрет, как это вы с ходу нашли это задание?

PS: вообще задание простое, но весьма интересное с точки зрения его реализации разработчиками. Я бы к примеру, вообще по другому все сделал. Этим оно и интересно

mycoding 02.07.2011 18:15

Цитата:

Сообщение от DrStrangelove (Сообщение 111477)
Посмотри тут
пример..

Похоже Яндекс позаимствовал тест. задание у кого-то...

А что там с темпом?? Яндекс заставляет работать круглосуточно??

С темпом не знаю как.
Я там не работал.
Лишь был на собеседовании.
Очень понравился офис.
Понравилось, что можно на стенах маркером писать - удобно.
А еще очень приятно было разговаривать с Федором Голубевым - очень позитивный человек :)

mycoding 02.07.2011 18:27

Цитата:

Сообщение от monolithed (Сообщение 111480)
PS: вообще задание простое, но весьма интересное с точки зрения его реализации разработчиками. Я бы к примеру, вообще по другому все сделал. Этим оно и интересно

Можете привести пример задания по сложнее.
Хочется себя проверить :)

А как бы Вы сделали?

DrStrangelove 02.07.2011 18:50

Цитата:

Сообщение от monolithed (Сообщение 111480)
DrStrangelove, если не секрет, как это вы с ходу нашли это задание?

PS: вообще задание простое, но весьма интересное с точки зрения его реализации разработчиками. Я бы к примеру, вообще по другому все сделал. Этим оно и интересно

Сейчас только достал ссылку из закладок..
Нашёл давно, когда только увидел это тест. задание в вакансиях Яндекса-
стало интересно как сортировать объекты, и в Гугле как-то всплыла эта ссылка..

DrStrangelove 02.07.2011 19:03

Цитата:

Сообщение от mycoding (Сообщение 111483)
С темпом не знаю как.
Я там не работал.
Лишь был на собеседовании.
Очень понравился офис.
Понравилось, что можно на стенах маркером писать - удобно.
А еще очень приятно было разговаривать с Федором Голубевым - очень позитивный человек :)

А как вообще проходит собеседование??
Проверяют дипломы??
Требуют высшее образование?? обязательно профильное программерское??
или просто высшее?? В объявлениях о вакансии часто не пишут о в/о, в основном об опыте..
А как на самом деле, на собеседовании??

mycoding 02.07.2011 19:09

Цитата:

Сообщение от DrStrangelove (Сообщение 111491)
А как вообще проходит собеседование??
Проверяют дипломы??
Требуют высшее образование?? обязательно профильное программерское??
или просто высшее?? В объявлениях о вакансии часто не пишут о в/о, в основном об опыте..
А как на самом деле, на собеседовании??

Про ВО ни разу не спросили.
Хотя в вакансиях пишут, что желательно.

Вообще, если есть знания и без ВО можно работать.
Например V~Vladi вроде без ВО, а работает в очень серьезной фирме :)

ВО нужно для формирования личности, фундамента знаний, знакомства с очень интересными людьми, выбора пути в жизни и много то, что просто не рассказать.

Все профессиональные знания получаются на работе в реальных условиях бизнеса. Либо самим человеком при чтении книг, блогов и прочего.

Про собеседование:
Я общался с Федором Голубевым и еще одним человеком.
Вопросы были вроде тех, что вот здесь
http://company.yandex.ru/job/vacanci..._developer.xml
http://company.yandex.ru/job/vacanci...dia_search.xml

Мне на собеседовании очень понравилось)))
Длилось где-то два часа.

Я не помню уже всего о чем спрашивали.
Вот что запомнилось
1 - Что такое JSONP
2 - Реализации ООП в js(примеры)
3 - Про замыкания, классический пример с массивом
Больше ничего не запомнилось)))

Собеседование проходило в кабинете с надписью "Пятая колонна"
Было очень дружелюбно.
На прощанье дали папочку с надписью "Яндекс")))

tenshi 02.07.2011 19:55

> Карточки должны выглядеть так

не должны. для ускорения выборок лучше создать отдельный индекс как в реляционных субд. нет ничего хуже, чем внутренняя оптимизация зашитая во внешний апи.

> В любом случае arguments.callee - использовать не следует.

почему? не вижу ни одного веского аргумента. аналогичная ситуация с with.

mycoding 02.07.2011 20:06

Цитата:

Сообщение от tenshi (Сообщение 111498)
не должны. для ускорения выборок лучше создать отдельный индекс как в реляционных субд. нет ничего хуже, чем внутренняя оптимизация зашитая во внешний апи.

Можете по подробней?

DrStrangelove 02.07.2011 20:06

Цитата:

Сообщение от mycoding (Сообщение 111492)
Про ВО ни разу не спросили.
Хотя в вакансиях пишут, что желательно.

Вообще, если есть знания и без ВО можно работать.
Например V~Vladi вроде без ВО, а работает в очень серьезной фирме :)

ВО нужно для формирования личности, фундамента знаний, знакомства с очень интересными людьми, выбора пути в жизни и много то, что просто не рассказать.

Все профессиональные знания получаются на работе в реальных условиях бизнеса. Либо самим человеком при чтении книг, блогов и прочего.

Про собеседование:
Я общался с Федором Голубевым и еще одним человеком.
Вопросы были вроде тех, что вот здесь
http://company.yandex.ru/job/vacanci..._developer.xml
http://company.yandex.ru/job/vacanci...dia_search.xml

Мне на собеседовании очень понравилось)))
Длилось где-то два часа.

Я не помню уже всего о чем спрашивали.
Вот что запомнилось
1 - Что такое JSONP
2 - Реализации ООП в js(примеры)
3 - Про замыкания, классический пример с массивом
Больше ничего не запомнилось)))

Собеседование проходило в кабинете с надписью "Пятая колонна"
Было очень дружелюбно.
На прощанье дали папочку с надписью "Яндекс")))

Понятно, спасибо!
Не подскажешь как правильно ответить на этот вопрос:
Дан код:
var rx1 = RegExp(/regular/ + /expression/);
var rx2 = /regularexpression/;

Что нужно добавить в начало программы, чтобы rx1 и rx2 стали идентичными? Сами строчки трогать нельзя.

mycoding 02.07.2011 20:09

Цитата:

Сообщение от DrStrangelove (Сообщение 111506)
Понятно, спасибо!
Не подскажешь как правильно ответить на этот вопрос:
Дан код:
var rx1 = RegExp(/regular/ + /expression/);
var rx2 = /regularexpression/;

Что нужно добавить в начало программы, чтобы rx1 и rx2 стали идентичными? Сами строчки трогать нельзя.


Вот этот пример я до сих пор не знаю как правильно сделать)))
Это же для Яндекс бар, возможно там что-то из EcmaScript 5, вроде
use strict.

DrStrangelove 02.07.2011 20:30

Цитата:

Сообщение от mycoding (Сообщение 111509)
Вот этот пример я до сих пор не знаю как правильно сделать)))
Это же для Яндекс бар, возможно там что-то из EcmaScript 5, вроде
use strict.

Яндекс потом не раскрывает правильных ответов для соискателей??

B@rmaley.e><e 02.07.2011 20:32

Скажем, это:
// 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! ^_^

mycoding 02.07.2011 20:37

Я просто привел пример, что спрашивают.
Т.е. все, что есть в примерах вакансий со страницы http://company.yandex.ru/job/vacancies/

Да особо и раскрывать то нечего.

Думаю, чтобы пройти собеседование, надо прочитать книги
http://oreilly.com/catalog/9780596805531
http://oreilly.com/catalog/9780596806767
И всё.
Знаний будет достаточно.

tenshi 02.07.2011 21:13

http://javascript.ru/blog/tenshi/yavascriptovoe-dao

tenshi 02.07.2011 21:14

B@rmaley.e><e, у регекспов есть замечательное свойство source

B@rmaley.e><e 02.07.2011 21:20

tenshi, спасибо, забыл о существовании такового. Лучше, конечно, использовать его, чем костыль с toString.

DrStrangelove 02.07.2011 21:46

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 111515)
// NEW
var oldToString = RegExp.prototype.toString;
RegExp.prototype.toString = function(){
var value = oldToString.call(this);
return value.replace(/\//g, '')
}

Поясни, плиз, к чему применяется oldToString.call(this); и что попадает в
value??

B@rmaley.e><e 02.07.2011 21:54

Переопределяется метод 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! ^_^

monolithed 02.07.2011 23:34

Цитата:

Сообщение от B@rmaley.e><e
Но с учетом поправки, корректный код будет выглядеть так:

Однако, не соответствует условиям здания, т.к. выражения должны быть идентичными :)
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)

B@rmaley.e><e 02.07.2011 23:36

monolithed, регэкспы - объекты, в данном случае идентичными в смысле оператора == они не будут никогда.

monolithed 02.07.2011 23:49

Цитата:

Сообщение от B@rmaley.e><e
регэкспы - объекты, в данном случае идентичными в смысле оператора == они не будут никогда.

ну это я имел ввиду, что без приведения к элементарному типу никак

tenshi 03.07.2011 17:07

есть идентичность по имени (которое в данном случае - адрес в памяти), а есть идентичность по содержимому (рекурсивное равенство всех данных).

первая - как правило бесполезна. редко когда нужно отличать объекты с одинаковым содержимым.
вторая же наоборот как правило и нужна, но по неведомой мне причине, реализуется через костыли типа a.equal(b)
по хорошему оператор == должен проверять именно идентичность данных, а не проверять через десяток эвристик: если оба объекты - сравниваем по имени, если один из них строка - сравниваем "строковые представления" (которые у разных объектов либо отражают содержимое, либо лишь принадлежность к классу), если один из них число - сравниваем "примитивные значения".

mycoding 04.07.2011 08:37

Вчера 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

B@rmaley.e><e 04.07.2011 10:39

Цитата:

Сообщение от mycoding
1 - Почему это так?

Потому что вызывается a.push(7, 8, 9)

Цитата:

Сообщение от mycoding
3 - Это как такое получается?

Что получается? Syntax error что ли?

Цитата:

Сообщение от mycoding
var { a:x, b:y } = { a:7, b:8 };console.log(x); // prints: 7console.log(y); // prints: 8

Syntax Error в ES5.

mycoding 04.07.2011 10:44

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 111675)
Потому что вызывается a.push(7, 8, 9)

Точно, забыл чуток
apply(this, [name, value]).

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 111675)
Что получается? Syntax error что ли?

Сначала написал пример с threads, потом проверил что не работает
решил удалить, а коммент оставил.

Вот к чему это было
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) {}
}

monolithed 04.07.2011 11:11

Там многие вещи из JavaScript 1.6+ поэтому, работать будет только на платформах Geko и SpiderMonkey (до принятия ES6-7, однако кому не терпится можно попробовать уже сейчас) причем для запуска тех же yield/let код нужно заключать в дескрипторы с указанием версии:
<script type="application/javascript;version=1.7"/>

float 04.07.2011 17:51

ООооо.... Безграничные возможности для индусов.

tenshi 04.07.2011 18:56

ого, я думал про js знаю всё, однако о такой фиче даже и не подозревал:

var result
job: {
    if( result ) break job
    result= 0
    if( result ) break job
    ++result
    if( result ) break job
    ++result
}
alert( result === 1 )


всегда эмулировал её через цыкл #^_^#

float 04.07.2011 19:12

Цитата:

о такой фиче даже и не подозревал
что-то я не в теме:cray:
что это и для чего?

B@rmaley.e><e 04.07.2011 19:26

float, быстрый выход из блока. Типа
do {
  if( some_condition ){
     break;
  }

  // ...
  // все условия выполнены
  do_smth();
} while(0);

monolithed 04.07.2011 19:38

Цитата:

Сообщение от tenshi
всегда эмулировал её через цыкл #^_^#

если я правильно понял, то за основу пойдет и такое решение (в конкретном случае):
function foo() {
    this.result = this.result || 0;
    return this.result++;
}

alert([foo(), foo(), foo()]);

float 04.07.2011 19:42

не совсем понял.
я про foo: {} конструкцию спрашиваю.
что это такое? никогда не использовал. (если честно и do while тоже)

float 04.07.2011 19:47

а сё. нашёл в "коране" пару строк про метки:)

monolithed 04.07.2011 19:50

Цитата:

Сообщение от float
а сё. нашёл в "коране" пару строк про метки

http://javascript.ru/basic/syntax-switch-for

float 04.07.2011 20:45

ещё вопросик: что за функция uneval ?

monolithed 04.07.2011 21:13

Цитата:

Сообщение от float
ещё вопросик: что за функция uneval ?

это довольно старая функия, которая является дополнением к ECMA-262 Edition 3. С незапамятных время реализована только в Rhino, Geko и SpiderMonkey. Предполагается, что uneval() возвращает исходный код выражения (как и toSource()), который может быть передан eval()
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));

melky 04.07.2011 21:14

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>


короче пойду ка я еще поудивляюсь... оно та оказывается, уже без пометки используется

monolithed 04.07.2011 21:38

Цитата:

Сообщение от melky
это как, где, откуда и почему????

Это т.н. Destructuring assignment (ES4, JavaScript 1.7, реализовано в Rhino, Geko и SpiderMonkey)
var a, b;
[a, b] = [1, 2];

alert(a + ',' + b); // 1,2

Кстати, если не ошибаюсь то в ES6 (Harmony) это будет включено, т.к. в CoffeeScript хорошо обкатали эту возможность. Подробней читать тут


Часовой пояс GMT +3, время: 02:20.