Re[8]: Задача на собеседовании - обращение списка.
От: mucks  
Дата: 25.02.12 08:52
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>
L>var sb = new SringBuilder(s.Length);
L>for (int i = s.Length-1; i >=0; i--)
L>{
L>    sb.Append(s[i]);
L>}
L>return sb.ToString();
L>


Ага. А если бы подобный алгоритм написал на плюсах, то обвинили бы в перерасходе памяти.
Так что таки "конкретные особенности системы типов и рантайма"
Re[8]: Задача на собеседовании - обращение списка.
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 25.02.12 09:05
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, Mystic, Вы писали:


M>>Здравствуйте, Vzhyk, Вы писали:


V>>>За 20 лет ни разу не понадобилось писать оное самому. Всегда была в

V>>>наличии функция sort.

M>>Было похожее: надо из 10 000 000 элементов вывести 1000 первых по определенному критерию. Обычный sort оверхид, ибо сортирует все. Может и есть что готовое, но проще было написать самому...


G>.Where(<критерий>).Take(1000)


G>И linq-гуано (с) рвет в какашки любые поделки по выразительности.


Увы, на С# я просто не умею писать высокопроизводительный код.
Re[7]: Задача на собеседовании - обращение списка.
От: pagid Россия  
Дата: 25.02.12 10:44
Оценка:
Здравствуйте, Философ, Вы писали:

В школе объясняют(ли) "физический смысл" интеграла как площади "под графиком функции", для соискателя помнящего школьную программу этого могло бы хватить даже если он забыл/никогда не изучал вычмат.
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re[9]: Задача на собеседовании - обращение списка.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.02.12 11:02
Оценка: +1
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, gandjustas, Вы писали:


G>>Здравствуйте, Mystic, Вы писали:


M>>>Здравствуйте, Vzhyk, Вы писали:


V>>>>За 20 лет ни разу не понадобилось писать оное самому. Всегда была в

V>>>>наличии функция sort.

M>>>Было похожее: надо из 10 000 000 элементов вывести 1000 первых по определенному критерию. Обычный sort оверхид, ибо сортирует все. Может и есть что готовое, но проще было написать самому...


G>>.Where(<критерий>).Take(1000)


G>>И linq-гуано (с) рвет в какашки любые поделки по выразительности.


M>Увы, на С# я просто не умею писать высокопроизводительный код.


Это легко. Вот ты говоришь что у тебя есть массив из 10000000 элементов. Но ведь эти элементы не из воздуха появились.
Если они из БД, то .Where(<критерий>).Take(1000) прекрасно сработает, только еще orderby надо добавить. Если в БД есть подходящие индексы, то это даст охренительный прирос производительности, больше чем любое вылизывание кода.

Другой вариант: данные попадают из источника, который не поддерживает индексы. Тем не менее при таком объеме данные не будут получены все сразу, скорее всего они будут приходить порциями. Так вот преобразовывая порции в поток (IObservable) объектов используя тоже самое linq выражение просто отпадет необходимость считывать все и ответ получишь как только необходимый объем данных будет получен.

Если же данные генерируются или достаются из внешнего источника синхронно (pull), то необходимо для них сделать ленивую последовательность (с помощью yield), которую обрабатывать тем же выражением что выше.

При любом раскладе сокращение затрат на считывание\генерацию ненужных элементов будет в во много раз больше, чем любое вылизывание кода.
Re[16]: Задача на собеседовании - обращение списка.
От: b-3 Россия  
Дата: 25.02.12 12:38
Оценка: -3
Здравствуйте, gandjustas, Вы писали:

ПМ>>Нет, просто не умеешь оценивать сложность алгоритмов.

G>Ну я хотя бы умею их писать.
Умеешь писать те, которые уже есть в либе что ли?
А писать код, который потом не можешь протестировать (или оценить, как в нашем случае), это такая MVP-шная метода разработки?

:) :)
Забанен с формулировкой "клинический дисидент".
Re[17]: Задача на собеседовании - обращение списка.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.02.12 12:47
Оценка:
Здравствуйте, b-3, Вы писали:

b-3>Здравствуйте, gandjustas, Вы писали:


ПМ>>>Нет, просто не умеешь оценивать сложность алгоритмов.

G>>Ну я хотя бы умею их писать.
b-3>Умеешь писать те, которые уже есть в либе что ли?
В либе чего?

b-3>А писать код, который потом не можешь протестировать (или оценить, как в нашем случае), это такая MVP-шная метода разработки?

Протестировать? Оценить? Ты о чем? Причем тут MVP?
Ты что-то несвязное говоришь вообще.
Re[16]: Задача на собеседовании - обращение списка.
От: Паблик Морозов  
Дата: 25.02.12 13:02
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Вот я и показываю что большинство присутствующих здесь что-нить да не знает.


Я уже 20 раз написал, что мне не нужны знания, мне нужно умение решать задачи. Если я вижу, что человек знает алгоритм, я даже не останавливаюсь на решении, а сразу даю другую задачу.
Re[10]: Задача на собеседовании - обращение списка.
От: Ромашка Украина  
Дата: 25.02.12 13:13
Оценка:
24.02.2012 14:47, Здравствуйте, Lloyd :
> IEnumerable — это итератор, а не список. Список — это List.

List в C#, как меня недавно ткнули носом, нифига не список, а массив.
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[2]: Порка ganjustas
От: b-3 Россия  
Дата: 25.02.12 13:23
Оценка:
Здравствуйте, gandjustas, Вы писали:

Ну вот, после всех заявлений и хамства "Вы сами ничего не умеете, а хотите, чтобы целый MVP вам двигал указатели на собеседовании !!", я взял да написал поиск максимальной подпоследовательности в один проход.

Время 25 мин, в студии, без всякого гугления (доказывай обратное), без предварительных построений на хаскел, с использованием динамического программирования и мозга.

На нечитаемый map + fold или темплейт ты это сам перепишешь

Что здесь недоступного программисту с 4 годами опыта?


static IEnumerable<int> MaxSubseq(IEnumerable<int> seq)
{
    Int64 partSum = 0, sumMin = Int64.MaxValue, sumMax = Int64.MinValue;
    int posMin = 0, posMax = 0, pos = 0; 
    foreach (var vl in seq)
    {
        if (partSum <= sumMin)
        {
            sumMin = partSum;
            posMin = pos;
        }

        pos++;
        partSum += vl;

        if (partSum >= sumMax)
        {
            sumMax = partSum;
            posMax = pos;
        }
    }

    if (posMax < posMin)
        posMin = 0;

    return seq.Skip(posMin).Take(posMax - posMin);
}

static void Main(string[] args)
{
    IEnumerable<int> seq = new int[] { 10, 20, -15, -30, 22 };
    var maxSubseq = MaxSubseq(seq);

    foreach (var vl in maxSubseq)
        Console.Out.WriteLine(vl);
}
Забанен с формулировкой "клинический дисидент".
Re: Задача на собеседовании - обращение списка.
От: namespace  
Дата: 25.02.12 14:05
Оценка:
Можно предположить, что в если это очередной вопрос из списка элементарнейших, а соискатель имеет серьезный опыт в разработке, то это больше похоже на банальное нежелание выполнять этот тест. Иногда проще сказать 'Не знаю', в противном случае придется долго и нудно объяснять, а собеседующие начнут уговаривать сделать. А в сознании уже вырисовывается тип задач, которые планируются для выполнения на этой позиции. Ну что могут поручить сотруднику, о котором знают, что он умеет решать студенческие задачки? А может, это попытка продавить по зарплате, поставив на один уровень со студентами? В любом случае — обидно.
Re[8]: Задача на собеседовании - обращение списка.
От: WolfHound  
Дата: 25.02.12 14:12
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

M>>Было похожее: надо из 10 000 000 элементов вывести 1000 первых по определенному критерию. Обычный sort оверхид, ибо сортирует все. Может и есть что готовое, но проще было написать самому...

G>.Where(<критерий>).Take(1000)
G>И linq-гуано (с) рвет в какашки любые поделки по выразительности.
Тут больше похоже на то, что ему нужно было 1000 минимальных элементов.
Ибо иначе нормальный человек про сортировку бы не заикнулся.
И твой код эту задачу не решает.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Задача на собеседовании - обращение списка.
От: b-3 Россия  
Дата: 25.02.12 14:31
Оценка:
Здравствуйте, namespace, Вы писали:

N>Можно предположить, что в если это очередной вопрос из списка элементарнейших, а соискатель имеет серьезный опыт в разработке, то это больше похоже на банальное нежелание выполнять этот тест. Ну что могут поручить сотруднику, о котором знают, что он умеет решать студенческие задачки? А может, это попытка продавить по зарплате, поставив на один уровень со студентами?

Ну, это обосновано, но это ж должно быть сразу заметно.
Есть программисты, которые умеют писать код. А есть программисты, которые умеют не писать код.
В целом вторые более оплачиваемые, ведь как сказал классик: лучшая программа — это та, которую обоснованно удалось не писать вообще.

Проблема только в том, что когда в расчёте на второй вариант П. Морозов спросит не "напишите код", а к примеру "предположите, каким образом может быть устроен протокол RPC в WCF?", то собеседуемый всё равно прибежит на RSDN с жалобами, типа "меня завалили тупым вопросом про скрытые детали реализации"
Забанен с формулировкой "клинический дисидент".
Re[3]: Порка ganjustas
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.02.12 14:39
Оценка: +1
Здравствуйте, b-3, Вы писали:

b-3>Здравствуйте, gandjustas, Вы писали:


b-3>Ну вот, после всех заявлений и хамства "Вы сами ничего не умеете, а хотите, чтобы целый MVP вам двигал указатели на собеседовании !!", я взял да написал поиск максимальной подпоследовательности в один проход.


b-3>Время 25 мин, в студии, без всякого гугления (доказывай обратное), без предварительных построений на хаскел, с использованием динамического программирования и мозга.


на массиве { 10, 20, -15, -30, 22, 10} выдает неверный результат.

b-3>Что здесь недоступного программисту с 4 годами опыта?

Ничего, но алгоритм сложен, ты за 25 минут не выдал правильный код. Начни с того что посчитай максимальную сумму.
Re[17]: Задача на собеседовании - обращение списка.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.02.12 14:55
Оценка:
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Здравствуйте, gandjustas, Вы писали:


G>>Вот я и показываю что большинство присутствующих здесь что-нить да не знает.


ПМ>Я уже 20 раз написал, что мне не нужны знания, мне нужно умение решать задачи. Если я вижу, что человек знает алгоритм, я даже не останавливаюсь на решении, а сразу даю другую задачу.


Какие задачи? По разработке CRM? Как они коррелируют с задачами которые выдумываешь ты?
Re[18]: Задача на собеседовании - обращение списка.
От: Паблик Морозов  
Дата: 25.02.12 15:04
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Какие задачи? По разработке CRM? Как они коррелируют с задачами которые выдумываешь ты?


В разработке постоянно возникают задачи на написание алгоритмов, если человек это делать не умеет — он не нужен.
Re[4]: Порка ganjustas
От: b-3 Россия  
Дата: 25.02.12 15:05
Оценка: -1 :))
Здравствуйте, gandjustas, Вы писали:

b-3>>Время 25 мин, в студии, без всякого гугления (доказывай обратное), без предварительных построений на хаскел, с использованием динамического программирования и мозга.


G>на массиве { 10, 20, -15, -30, 22, 10} выдает неверный результат.

Да, неприятно. Хотя собеседование по любому пройдёно. Ну, представим, что это реальный код. Пишем юнит-тест, думаем где налажали и делаем правку.
if (posMax < posMin)
{
    if (sumMax > (partSum - sumMin))
        posMin = 0;
    else
        posMax = pos;
}


Я всё ещё жду кода на хаскель и мап-фолдах, написанного быстрее чем за 25 минут

b-3>>Что здесь недоступного программисту с 4 годами опыта?

G>Ничего, но алгоритм сложен, ты за 25 минут не выдал правильный код. Начни с того что посчитай максимальную сумму.
Суть тут в том, что собразить, что сумма на отрезке [a;b] — это разница сумм [0;b] и [0;a]. Дальше задача сводится к "дана последовательность, найдите два максимально отдалённых значения". Оно одно из трёх: [0, максимум], [мин, максимум] и [мин;конец]. В зависимости от расположения минимума и максимума, часть перечисленных интервалов невалидны, они исключаются из рассмотрения. Здесь хаскелисты могут воображить монаду MayBe... )))

Вы прослушали анализ задачи.

Так что, надо ли программисту уметь анализировать задачи?
Забанен с формулировкой "клинический дисидент".
Re[19]: Задача на собеседовании - обращение списка.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.02.12 15:10
Оценка: +1
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Здравствуйте, gandjustas, Вы писали:


G>>Какие задачи? По разработке CRM? Как они коррелируют с задачами которые выдумываешь ты?


ПМ>В разработке постоянно возникают задачи на написание алгоритмов, если человек это делать не умеет — он не нужен.


"Постоянно" это как часто? Какой процент из них требует разворачивания списков или манипуляций с битами.
Ты сам часто писал в тех проектах, которыми занимаешься, эти самые развороты списков?


Вот например выборка случайных из массива — относительно часто встречается, многие алгоритмы требуют рандомизации. Алгоритмы на графах бывают.
Но это все крайне редко, настолько редко что проще нагуглить когда понадобится.

А спрашивать на собеседовании — не более чем потешать свое самолюбие.
Re[5]: Порка ganjustas
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.02.12 15:28
Оценка: +1
Здравствуйте, b-3, Вы писали:

b-3>Здравствуйте, gandjustas, Вы писали:


b-3>>>Время 25 мин, в студии, без всякого гугления (доказывай обратное), без предварительных построений на хаскел, с использованием динамического программирования и мозга.


G>>на массиве { 10, 20, -15, -30, 22, 10} выдает неверный результат.

b-3>Да, неприятно. Хотя собеседование по любому пройдёно. Ну, представим, что это реальный код. Пишем юнит-тест, думаем где налажали и делаем правку.
b-3>
b-3>if (posMax < posMin)
b-3>{
b-3>    if (sumMax > (partSum - sumMin))
b-3>        posMin = 0;
b-3>    else
b-3>        posMax = pos;
b-3>}
b-3>


Даем на вход new int[] { -5 ,10, 20, -15, -30, 22 } и получаем {-5 ,10, 20}, что очевидно неверно.

Да, детка давай еще. Еще тест, еще порция "случайных изменений" чтобы следующий тест прошел.

b-3>Я всё ещё жду кода на хаскель и мап-фолдах, написанного быстрее чем за 25 минут

Напиши сначала правильный вариант, потом и сам догадаешься.

b-3>>>Что здесь недоступного программисту с 4 годами опыта?

G>>Ничего, но алгоритм сложен, ты за 25 минут не выдал правильный код. Начни с того что посчитай максимальную сумму.
b-3>Суть тут в том, что собразить, что сумма на отрезке [a;b] — это разница сумм [0;b] и [0;a]. Дальше задача сводится к "дана последовательность, найдите два максимально отдалённых значения". Оно одно из трёх: [0, максимум], [мин, максимум] и [мин;конец]. В зависимости от расположения минимума и максимума, часть перечисленных интервалов невалидны, они исключаются из рассмотрения.
Предположение верное если на всем отрезке сумм один минимум и одни максимум, что в общем случае не так


b-3>Вы прослушали анализ задачи.

b-3>Так что, надо ли программисту уметь анализировать задачи?
Конечно надо, только ты тут ошибся.

Это очередной пример когда задача и реализация решения простые, но алгоритм сложен.
Re[20]: Задача на собеседовании - обращение списка.
От: b-3 Россия  
Дата: 25.02.12 15:30
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>"Постоянно" это как часто? Какой процент из них требует разворачивания списков или манипуляций с битами.

G>Ты сам часто писал в тех проектах, которыми занимаешься, эти самые развороты списков?
Я просто напомню, что выбирать "лучшие 20" из 10000 элементов, Linq.Enumerable без загрузки в память всей коллекции и полной её сортировки не умеет ва-а-аще.

Может ли встать такая задача в реальном проекте, скажем в медиаплеере (среди фильмов) или клиенте B2B сервиса (в некой коллекции) — вопрос риторический
Забанен с формулировкой "клинический дисидент".
Re[20]: Задача на собеседовании - обращение списка.
От: Паблик Морозов  
Дата: 25.02.12 15:32
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>"Постоянно" это как часто? Какой процент из них требует разворачивания списков или манипуляций с битами.


Постоянно — это всегда. Программирование — это и есть написание алгоритмов. Человек пишет код. Если он не умеет писать код, или пишет код криво — он не нужен. Идиота дешевле не нанимать, чем потом уволить.

G>Ты сам часто писал в тех проектах, которыми занимаешься, эти самые развороты списков?


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

G>Но это все крайне редко, настолько редко что проще нагуглить когда понадобится.


Решение реальной задачи заказчика ты не нагуглишь.

G>А спрашивать на собеседовании — не более чем потешать свое самолюбие.


Нет, это хороший способ отсеять людей, которые не могут программировать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.