Как не надо делать тестовое задание
От: machine3000  
Дата: 16.05.07 10:45
Оценка: :))
здесь
Re: Как не надо делать тестовое задание
От: Good Looking Man  
Дата: 16.05.07 11:22
Оценка:
Здравствуйте, machine3000, Вы писали:

M>здесь


Отличный заголовок. Я бы даже переименовал в более чёткий лозунг: "Не надо делать тестовое задание!"
Re: Как не надо делать тестовое задание
От: Евгений Коробко  
Дата: 16.05.07 12:02
Оценка: 3 (1)
Блин, видел эту задачу на RantaCoder...
Вот как чуваки такие задачи делают..
Евгений Коробко
Re: Как не надо делать тестовое задание
От: AntZ  
Дата: 16.05.07 12:02
Оценка: +3 :)
Здравствуйте, machine3000, Вы писали:

M>здесь


Код просто гениален! Захватывает с первых строчек Смотрим чего инклудит — dqueue, hash_map — и это всего лишь примитивный конвертор дней, часов, минут и секунд в секунды Дальше — больше, хотя в задании ничего не говорилось про доли секунд, все делалось в double арифметике! В main совершенно нечеловеческий код ввода-вывода перемешанный с парсингом и логикой приложения, в примере два каки-то класса и некоторые фрагменты кода, которые меня восхитили


Вот например —
class name_checker
{
char valid_map[255];
public:
name_checker()
{
memset(valid_map, 0, sizeof(valid_map));
memset(valid_map + 'a', 1, 'z' — 'a');
}
bool operator()( const char *name ) const
{
--name;
while( valid_map[static_cast<unsigned char>(*++name)] );
return *name == 0;
}
} check_name;

Класс просто грандиозен
Мне настолько трудно понять, что означает возвращаемый bool, зачем в безобидном коде перегружать () (это надо быть гением, чтобы сделать класс, который перегружает () и экземплярвы которого в последствии явно косят под функцию!)

А вот это вызов функции?
check_name(unit_name1)
Да нифига! Это глобальная переменная check_name, которая является экземпляром класса name_checker и которая имеет перегруженный оператор ()! К тому-же код нереентерабельный

Теперь я понимаю, почему код писался все майские праздники!
Re[2]: Как не надо делать тестовое задание
От: CreatorCray  
Дата: 16.05.07 12:12
Оценка: :)
Здравствуйте, AntZ, Вы писали:

AZ>Код просто гениален! Захватывает с первых строчек Смотрим чего инклудит — dqueue, hash_map — и это всего лишь примитивный конвертор дней, часов, минут и секунд в секунды Дальше — больше, хотя в задании ничего не говорилось про доли секунд, все делалось в double арифметике! В main совершенно нечеловеческий код ввода-вывода перемешанный с парсингом и логикой приложения, в примере два каки-то класса и некоторые фрагменты кода, которые меня восхитили

Нда. А вот и ответ на напрашивающийся вопрос: "хто нибудь этот эээ... опус дочитал до конца с попыткой понять шо ж там такое понаписано"...
Видимо и те, к кому он на работу устраивался ужаснулись и не читая отправили подальше...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Как не надо делать тестовое задание
От: AntZ  
Дата: 16.05.07 12:15
Оценка:
Кривовато прочитал начальное задание. Задачка — написать универсальный конвертер, правила которого задаются "на лету". Некоторы е мои комментарии некоректны, хотя с большинством поста я согласен
Re: Как не надо делать тестовое задание
От: AndrewJD США  
Дата: 16.05.07 12:28
Оценка:
Здравствуйте, machine3000, Вы писали:

M>здесь


I.M.O. это действительно пример как не надо делать

Первое что бросилось в глаза
1. Слишком сложно
2. Какая-то смесь стилей С и С++
3. Ввод/вывод и логика смешаны в кучу. А что если завтра потребуется не файловый поток, а например stringstream или с консоли?
4. Используются одни и теже исключения для логики и ввода
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re: Как не надо делать тестовое задание
От: mossy  
Дата: 16.05.07 15:15
Оценка:
Здравствуйте, machine3000, Вы писали:

M>здесь


Аццкий ужос.

Контора это — CQG — я когда-то делал туда именно это задание, только на C#.

Алгоритм решения элементарный.

Кратко и без деталей — берём для каждого заданного преобразования матрицу — столбцы и строки — все заданные units, по диагонали единицы, для строка/столбец — units в преобразовании — соответственно его коэффициент и обратный ему. Когда все матрицы перемножим, то получим матрицу которая даст все в качестве элементов коэффициенты всех возможных преобразований.

Потом просто применяем её.
Re[2]: Как не надо делать тестовое задание
От: machine3000  
Дата: 16.05.07 15:51
Оценка:
Здравствуйте, mossy, Вы писали:

M>Аццкий ужос.


M>Контора это — CQG — я когда-то делал туда именно это задание, только на C#.


M>Алгоритм решения элементарный.


M>Кратко и без деталей — берём для каждого заданного преобразования матрицу — столбцы и строки — все заданные units, по диагонали единицы, для строка/столбец — units в преобразовании — соответственно его коэффициент и обратный ему. Когда все матрицы перемножим, то получим матрицу которая даст все в качестве элементов коэффициенты всех возможных преобразований.


M>Потом просто применяем её.


А сложность построения матрицы O(N**2)?
Re[2]: Как не надо делать тестовое задание
От: AntZ  
Дата: 16.05.07 15:54
Оценка:
M>Кратко и без деталей — берём для каждого заданного преобразования матрицу — столбцы и строки — все заданные units, по диагонали единицы, для строка/столбец — units в преобразовании — соответственно его коэффициент и обратный ему. Когда все матрицы перемножим, то получим матрицу которая даст все в качестве элементов коэффициенты всех возможных преобразований.

M>Потом просто применяем её.


Вы выдали великую военную тайну
Там еще парсинг не то, чтобы слишком тривильный. Можно сделать от кастомизированного парсера типа strtok или использования библиотеки регулярных выражений, до супермощной связки типа lex/yacc — в зависимости от того, что хочет увидеть "клиент".

Но я код не понял, а код который я не понимаю может быть написан либо гением, либо "альтернативно одаренным человеком". Иногда мне кажется что это одно и то-же.
Re[2]: Как не надо делать тестовое задание
От: Правдоруб  
Дата: 16.05.07 16:00
Оценка: +1
Здравствуйте, mossy, Вы писали:

M>Аццкий ужос.


+1

M>Алгоритм решения элементарный.


M>Кратко и без деталей — берём для каждого заданного преобразования матрицу — столбцы и строки — все заданные units, по диагонали единицы, для строка/столбец — units в преобразовании — соответственно его коэффициент и обратный ему. Когда все матрицы перемножим, то получим матрицу которая даст все в качестве элементов коэффициенты всех возможных преобразований.


M>Потом просто применяем её.


Слишком неэффективно. При перемножении почти все элементы будут 0.

По-хорошему, как мне кажется надо решать так: представить все единицы измерения как вершины неориентированного графа, а преобразования — как ребра. Ну и соответственно возможность перевода одной единицы в другую соответствует тому что между этими вершинами есть путь (если таблица преобразований корректна, то он должен быть единственным). А для нахождения коэффициента надо перемножить все коэффициенты на ребрах входящих в путь (естественно, при прохождении ребра в прямом и обратном порядке коэффиценты обратны друг другу). Для нахождения всех путей можно применить модифицированный алгоритм Флойда-Уоршала или даже проще, поскольку между 2 вершинами должен быть только 1 путь.

P.S. Публиковать решение не всегда хорошо для компании (придется менять задание), но раз уж ты начал...
Спам!
От: LuciferMoscow Россия  
Дата: 16.05.07 16:10
Оценка:
subj
... << RSDN@Home 1.1.4 beta 4 rev. 358>>
Re[2]: Как не надо делать тестовое задание
От: Lloyd Россия  
Дата: 16.05.07 16:19
Оценка:
Здравствуйте, mossy, Вы писали:

M>Кратко и без деталей — берём для каждого заданного преобразования матрицу — столбцы и строки — все заданные units, по диагонали единицы, для строка/столбец — units в преобразовании — соответственно его коэффициент и обратный ему. Когда все матрицы перемножим, то получим матрицу которая даст все в качестве элементов коэффициенты всех возможных преобразований.


M>Потом просто применяем её.


А вы не могли бы о шагам расписать для исходных данных. А то я чё-то не понял.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 16.05.07 16:44
Оценка:
Здравствуйте, Правдоруб, Вы писали:

П>По-хорошему, как мне кажется надо решать так: представить все единицы измерения как вершины неориентированного графа, а преобразования — как ребра. Ну и соответственно возможность перевода одной единицы в другую соответствует тому что между этими вершинами есть путь (если таблица преобразований корректна, то он должен быть единственным). А для нахождения коэффициента надо перемножить все коэффициенты на ребрах входящих в путь (естественно, при прохождении ребра в прямом и обратном порядке коэффиценты обратны друг другу). Для нахождения всех путей можно применить модифицированный алгоритм Флойда-Уоршала или даже проще, поскольку между 2 вершинами должен быть только 1 путь.


Алгоритм имеет N^2 сложность , на чем мы съекономим ?
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[4]: Как не надо делать тестовое задание
От: Правдоруб  
Дата: 16.05.07 17:14
Оценка:
Здравствуйте, minorlogic, Вы писали:

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


П>>По-хорошему, как мне кажется надо решать так: представить все единицы измерения как вершины неориентированного графа, а преобразования — как ребра. Ну и соответственно возможность перевода одной единицы в другую соответствует тому что между этими вершинами есть путь (если таблица преобразований корректна, то он должен быть единственным). А для нахождения коэффициента надо перемножить все коэффициенты на ребрах входящих в путь (естественно, при прохождении ребра в прямом и обратном порядке коэффиценты обратны друг другу). Для нахождения всех путей можно применить модифицированный алгоритм Флойда-Уоршала или даже проще, поскольку между 2 вершинами должен быть только 1 путь.


M>Алгоритм имеет N^2 сложность , на чем мы съекономим ?


Где это он N^2?

Если число единиц — V, а число заданных преобразований — E, то алгоритм Флойда-Уоршала даст сложность O(V^3), а решение предложенное mossy O(E*V^3), т.к. каждая матрица будет размером V x V, перемножение двух таких матриц — O(V^3) и таких перемножений будет E-1. Кстати решение предложенное mossy не будет работать если данные избыточны (некорректны), т.е. если существует несколько путей между вершинами.
Re[3]: Как не надо делать тестовое задание
От: mossy  
Дата: 16.05.07 18:27
Оценка: 20 (2)
Здравствуйте, Lloyd, Вы писали:

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


M>>Кратко и без деталей — берём для каждого заданного преобразования матрицу — столбцы и строки — все заданные units, по диагонали единицы, для строка/столбец — units в преобразовании — соответственно его коэффициент и обратный ему. Когда все матрицы перемножим, то получим матрицу которая даст все в качестве элементов коэффициенты всех возможных преобразований.


M>>Потом просто применяем её.


L>А вы не могли бы о шагам расписать для исходных данных. А то я чё-то не понял.



Хорошо, вот, в деталях, как я его тогда описывал в приложении к решению:

Алгоритм решения

Построим матрицу M действительных чисел, строки и столбцы которой соответствуют различным единицам измерения. Каждый элемент M[i, j] матрицы, если он отличен от нуля, будет означать, что от единицы измерения i к единице измерения j можно перейти, помножив количество единиц i на M[i, j].

1. Изначально берём матрицу для которой M[i, j] = 1, если i = j и NaN если i <> j;

2. Для каждого правила вида <v1> <u1> = <v2> <u2>:

2.1. Проверяем, что M[u1, u2] = NaN — если это не так, то значит, текущее правило избыточно и преобразование можно сделать, исходя из предыдущих, следовательно, выдаём ошибку. (Как другой вариант, в этом случае можно проверять консистентность текущего правила с уже имеющимися, путём сравнения v2/v1 и M[u1, u2] и, в случае совпадения, вместо выдачи ошибки, правило игнорировать.)

2.2. Для каждой пары индексов матрицы (i, j), таких, что M[i, j] = NaN:

2.2.1. если M[i, u1] <> NaN и M[u2, j] <> NaN, то полагаем M[i, j] := M[i, u1] * (v2 / v1) * M[u2, j];

2.2.2. иначе, если M[i, u2] <> 0 и M[u1, j] <> 0, то полагаем M[i, j] := M[i, u2] * (v1 / v2) * M[u1, j];

После того, как обработаны все правила, то для каждого запроса вида <v> <u1> = ? <u2>, если M[u1, u2] <> NaN, то преобразование существует, и ответ: <v> <u1> = <M[u1, u2] * v> <u2>, иначе преобразование не существует.
Re: Как не надо делать тестовое задание
От: BackstreetCat Земля  
Дата: 16.05.07 18:36
Оценка: :)
Здравствуйте, machine3000, Вы писали:

Ты просто гений не понятый современниками, так что не теряй духа.
Re[4]: Как не надо делать тестовое задание
От: mossy  
Дата: 16.05.07 18:41
Оценка:
Ещё, на самом деле это просто алгоритм, при реализации там всё было спрятано в классе, который только снаружи выглядел как матрица, а внутри всё хранил в виде хештейбла между индексами и элементами — за счёт этого можно было выполнять все эти манипуляции не зная заранее всех units с которыми надо будет иметь дело — просто обрабатывая входную информацию из стрима построчно. Кроме того я полагал, что количество units и известных правил ограничено, а количество правил "x = ? y" что надо вывести может сколь угодно расти — при таком предположении алгоритм линейный по сложности.
Re[3]: Как не надо делать тестовое задание
От: alzt  
Дата: 17.05.07 07:10
Оценка: 1 (1) +1
Здравствуйте, Правдоруб, Вы писали:

П>P.S. Публиковать решение не всегда хорошо для компании (придется менять задание), но раз уж ты начал...


Менять задание — это их проблемы.
На мой взгляд — не хорошо отмалчиваться, словно письма не получили.
Никто не требует ответа с детальным пояснением всех ошибок, достаточно сухого "в настоящий момент эта должность уже занята.".
Re: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 17.05.07 07:46
Оценка:
1. парсер , токенайзер , обработка ошибок входных данных.

2. для каждой единицы измерения заводим объект.

3. для каждой связи между единицами измерения заводим связь, предлагаю adjustency list.

4. для каждой единицы измерения заводим ее пересчет для неких слонов , но слоны общме для всех , например 1 секунда это 1 секунда , 1 минута это 60 секунд , 1 час это 3600 секунд и т.д. Тут слоны равны секундам.

5. Поиском в ширину проходим по получившемуся графу и расчитываем наших слонов.

6. пересчеты единиц друг в друга теперь можно делать опираясь на слонов, например например 1 секунда это 1 секунда , 1 минута это 60 секунд , 1 час это 3600 секунд , тогда

2 часа = 2*3600/1*1 секунд или например 2 секунды 2 сек = 2*1/(1*3600) часов.


Алгоритм выполняется за линейное время.
Ищу работу, 3D, SLAM, computer graphics/vision.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.