Как не надо делать тестовое задание
От: 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.
Re[2]: Как не надо делать тестовое задание
От: AntZ  
Дата: 17.05.07 08:04
Оценка:
M>1. парсер , токенайзер , обработка ошибок входных данных.
Парсер и токенайзер в даном случае избыточны — одна строка представляет собой один элемент — "токен", а парсинг отдельной строки задача тривиально решаемая либо strtok и аналогами, либо применением простейшей либы регулярных выражений.

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

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

Google на adjustency выдает ровно один документ, я про такие личты не слышал. Слово какое-то корявое и термин тоже.

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


Логичное и простое решение, вероятно наилучшее из всех предложенных.

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


Да тут граф избыточен — переводим единицу1 в слонов, слонов в единицу2, можно конечно назвать это "графом"

M>Алгоритм выполняется за линейное время.


Согласен, красивое и простое решение. Задачка правда, несколько исскуственная
Re[4]: Как не надо делать тестовое задание
От: DangerRSDN Россия http://danger-world.livejournal.com/
Дата: 17.05.07 08:59
Оценка: +5
Здравствуйте, alzt, Вы писали:

A>На мой взгляд — не хорошо отмалчиваться, словно письма не получили.

Абсолютно согласен.
Кстати — я тут недавно поднимал в одной теме вопрос об обязательных ответах кандидату. К ужасу своему выяснил что практически всех устраивает ситуация когда работодатель не пишет ответ при принятии отрицательного решения. Мне лично всегда кажется в этих случаях что ко мне просто проявили неуважение. И работать к этому работодателю я уж точно в будущем не пойду — даже если он сам сделает достаточно распологающее предложение.

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

Вот хотя бы так! А то это молчание — оно тяготит очень. А если человек ищет работу что называется аврально и у него элементарно денег нет — то такое молчание вообще убийственно.
Re[3]: Как не надо делать тестовое задание
От: De-Bill  
Дата: 17.05.07 09:10
Оценка:
AZ>Google на adjustency выдает ровно один документ, я про такие личты не слышал. Слово какое-то корявое и термин тоже.

Попробуй adjacency.
Re[4]: Как не надо делать тестовое задание
От: AntZ  
Дата: 17.05.07 09:14
Оценка:
Здравствуйте, De-Bill, Вы писали:

AZ>>Google на adjustency выдает ровно один документ, я про такие личты не слышал. Слово какое-то корявое и термин тоже.


DB>Попробуй adjacency.


Умный термин — а оказывается список ребер графа
Re[3]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 17.05.07 09:32
Оценка:
Здравствуйте, AntZ, Вы писали:

M>>1. парсер , токенайзер , обработка ошибок входных данных.

AZ>Парсер и токенайзер в даном случае избыточны — одна строка представляет собой один элемент — "токен", а парсинг отдельной строки задача тривиально решаемая либо strtok и аналогами, либо применением простейшей либы регулярных выражений.

Имелось ввиду, вынести это отдельным блоком, а не писать свои токенайзеры и парсеры. Хотя если есть готовые ...

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

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

AZ>Google на adjustency выдает ровно один документ, я про такие личты не слышал. Слово какое-то корявое и термин тоже.


Прошк прощения за корявость , конечно "Adjacency list", список связанности.
http://en.wikipedia.org/wiki/Adjacency_list

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


AZ>Логичное и простое решение, вероятно наилучшее из всех предложенных.


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


AZ>Да тут граф избыточен — переводим единицу1 в слонов, слонов в единицу2, можно конечно назвать это "графом"


M>>Алгоритм выполняется за линейное время.


AZ>Согласен, красивое и простое решение. Задачка правда, несколько исскуственная
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Как не надо делать тестовое задание
От: machine3000  
Дата: 17.05.07 09:33
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>1. парсер , токенайзер ,

Из пушки по воробьям.

M> обработка ошибок входных данных.

Там есть. Но, вообще, на вводе-выводе я особо не заморачивался, решив что он играет второстепенную роль.

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

Заводим.

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

Я все необходимые связи оставил в самом объекте. При этом некоторые объекты могут служить для связи, не являясь единицами измерения, как таковыми. Структура данных разработана так, чтобы свести к минимуму число выделяемых из памяти объектов, поскольку в C++ оператор "new" крайне нерасторопен.

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

У меня для этого есть "base_unit" и "weight". Если у двух единиц одинаковый "base_unit", они конвертируются путём умножения на "weight" результирующей и деления на "weight" исходной единицы.

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

Я стараюсь, по возможности, расчитать "weight" при вставке. Когда это требует пересчёта весов, связи между единицами помещаются в ориентированный граф (дерево циклических списков). Пересчёт весов осуществляется после добавления всех правил конвертации проходом сверху вниз по дереву. После этого все узлы дерева, кроме самих единиц измерения, могут быть удалены.

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


M>Алгоритм выполняется за линейное время.


В общем, всё очень похоже. Я просто купился на фразу в вакансии об обязательном знании real-time оптимизации и, похоже, переборщил.
Re[3]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 17.05.07 09:41
Оценка:
Здравствуйте, machine3000, Вы писали:

M>В общем, всё очень похоже. Я просто купился на фразу в вакансии об обязательном знании real-time оптимизации и, похоже, переборщил.


Да нет .... просто код нечитабельный , тренируйтесь. Самая лучшая тренировка это peer code review. Давайте свой код читать другим и прислушивайтесь к замечаниям.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Как не надо делать тестовое задание
От: machine3000  
Дата: 17.05.07 09:50
Оценка:
Здравствуйте, BackstreetCat, Вы писали:

BC>Ты просто гений

Так это или нет, не имеет никакого практического значения.

BC>не понятый современниками

Само по себе это меня тоже не очень волнует. Однако для достижения своих целей очень часто требуется именно "быть понятым современниками"

BC> так что не теряй духа.

Упущенную выгоду нужно воспринимать как упущенную выгоду. Отсутствие отрицательных эмоций лишает стимула работать над лучшением условий содержания бренного тела, что, в конечном итоге, может привести к его преждевременному разрушению.
Re[2]: Как не надо делать тестовое задание
От: Worad  
Дата: 17.05.07 10:14
Оценка:
To machine3000:
1. is_equal_values реализована неверно. Работа ведётся в ограниченной разрядной сетке, поэтому сравнивать нужно с учётом порядка.
2. В код въехал, но полотна в методах неприемлемы.
3. +1 к вышесказанному.

Расширяема ли схема, предложенная minorlogic, до обработки правил и вопросов перевода следующего типа:
<v1> <u1> = <v2> <u2>
<x> <u1>^n = ? <u2>^n
?
^ — возведение в степень
n — действительное.
x — задано, действительное.
Если расширяема, то как?

Что делать в этом случае с матрицей перевода, предложенной mossy?

Например, требуется переводить квадратные и кубические сантиметры в соотв. метры, для чего достаточно лишь правила
1 м = 100 см.
Как будет обрабатываться вопрос
35 см^2 = ? м^2
?
Re: Как не надо делать тестовое задание
От: Дмитрий В  
Дата: 17.05.07 10:19
Оценка:
Здравствуйте, machine3000, Вы писали:

M>здесь

Глобальные функции это вообще жесть.
Ну максимум я бы выносил их в какой-нибудь класс типа *Utils (Например GrafUtils, хотя по-моему все операции с графами можно в этом графе и оставить )
По-моему какое-то сложное решение простой задачи.
Мне кажется задача сводиться к построению дерева, которое задается классом типа:

public class Unit {
    private Unit subUnit;
    private Integer subUnitCount;
    private String name;

    public Integer getUnitCount(String unitName) {
        if(name.equals(unitName))
            return 1;
        if(subUnit == null)
            throw new IllegalArgumentException();        
        return subUnitCount * subUnit.getUnitCount(unitName);
    }
}

В начальном условии нет определений типа 1 hour = 3600 second , поэтому дерево можно в лоб построить
Re[3]: Как не надо делать тестовое задание
От: machine3000  
Дата: 17.05.07 10:59
Оценка: +1
Здравствуйте, Worad, Вы писали:

W>To machine3000:

W>1. is_equal_values реализована неверно. Работа ведётся в ограниченной разрядной сетке, поэтому сравнивать нужно с учётом порядка.
В ЖЖ с учётом сравнивается.

W>Расширяема ли схема, предложенная minorlogic, до обработки правил и вопросов перевода следующего типа:

W><v1> <u1> = <v2> <u2>
W><x> <u1>^n = ? <u2>^n
W>?
W>^ — возведение в степень
W>n — действительное.
W>x — задано, действительное.
W>Если расширяема, то как?

W>Что делать в этом случае с матрицей перевода, предложенной mossy?


W>Например, требуется переводить квадратные и кубические сантиметры в соотв. метры, для чего достаточно лишь правила

W>1 м = 100 см.
W>Как будет обрабатываться вопрос
W>35 см^2 = ? м^2
W>?

А что тут вообще меняется, кроме добавления операции возведения в степень? Вот если бы "x1 <u1>^n1 = x2 <u2>^n2"...
Re[2]: Как не надо делать тестовое задание
От: AntZ  
Дата: 17.05.07 11:07
Оценка:
ДВ>Глобальные функции это вообще жесть.
ДВ>Ну максимум я бы выносил их в какой-нибудь класс типа *Utils (Например GrafUtils, хотя по-моему все операции с графами можно в этом графе и оставить )
ДВ>По-моему какое-то сложное решение простой задачи.
ДВ>Мне кажется задача сводиться к построению дерева, которое задается классом типа:

Глобальные функции, если они без статических переменных и с понятными названиями никакой проблемы не составляют. В С++ их можно внести в пространство имен, в чистом С обычно стараются как-то минимизировать кофликты имен обзывая функции типа MylibFunc1, MyLibFunc2

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

Да код просто перемешан и усложнен — нечитабельный он.
Re[2]: Как не надо делать тестовое задание
От: AndrewJD США  
Дата: 17.05.07 11:11
Оценка:
Здравствуйте, minorlogic, Вы писали:

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


В задаче не только время
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[4]: Как не надо делать тестовое задание
От: AndrewJD США  
Дата: 17.05.07 11:22
Оценка:
Здравствуйте, alzt, Вы писали:

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

A>Менять задание — это их проблемы.

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

A>На мой взгляд — не хорошо отмалчиваться, словно письма не получили.

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

Может автор поспешил? Народ в компании мог все майские выходные бухать и до его решения еще нее добрались
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[3]: Как не надо делать тестовое задание
От: machine3000  
Дата: 17.05.07 11:27
Оценка:
Здравствуйте, AntZ, Вы писали:

AZ>Глобальные функции, если они без статических переменных и с понятными названиями никакой проблемы не составляют. В С++ их можно внести в пространство имен, в чистом С обычно стараются как-то минимизировать кофликты имен обзывая функции типа MylibFunc1, MyLibFunc2


AZ>Куда страшнее использование глобальных переменных,

Для паттерна "singleton" это самое очевидное решение.

AZ>особенно когда они маскируются под вызовы функций.

На самом деле кроме случаев создания функторов такого не разу не делал. Но тут решил показать, что умею так делать.

AZ>Да код просто перемешан и усложнен — нечитабельный он.

Да, мне очень тяжело писать код для людей. В основном стараюсь для машин подоходчивее.
Re[3]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 17.05.07 11:27
Оценка: +1
Здравствуйте, AndrewJD, Вы писали:

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


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


AJD>В задаче не только время


Это не имеет значения. Даже если граф будет не связанным.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 17.05.07 11:29
Оценка:
Вот действительно задачу усложнит если мы считаем курсы валют. И обмен долара на гривну и гривну на долар не равны. Тогда существует множество решений из которых видимо надо выбирать ...
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[4]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 17.05.07 11:32
Оценка: +1
Здравствуйте, machine3000, Вы писали:

AZ>>Да код просто перемешан и усложнен — нечитабельный он.

M>Да, мне очень тяжело писать код для людей. В основном стараюсь для машин подоходчивее.

Для машин можно и в машинных кодах, а для людей это самое тяжелое в программировании. Недаром же самые ценные сотрудники — архитекторы , которые умеют сложные вещи сделать простыми.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: Как не надо делать тестовое задание
От: machine3000  
Дата: 17.05.07 11:47
Оценка: :)
Здравствуйте, minorlogic, Вы писали:

M>>Да, мне очень тяжело писать код для людей. В основном стараюсь для машин подоходчивее.


M>Для машин можно и в машинных кодах, а для людей это самое тяжелое в программировании. Недаром же самые ценные сотрудники — архитекторы , которые умеют сложные вещи сделать простыми.


Современные языки программирования находятся на такой стадии, что на них нельзя выразить суть задачи ни оптимальным для человека, ни оптимальным для машины образом. Так или иначе всегда приходится искать некоторый компромисс между этими взаимоисключающими критериями. Хорошо, когда есть хотя бы какой-то "corporate coding style". А то ещё у каждого разработчика могут быть свои предпочтения.
Re[4]: Как не надо делать тестовое задание
От: AntZ  
Дата: 17.05.07 12:43
Оценка: -1 :)
AZ>>Куда страшнее использование глобальных переменных,
M>Для паттерна "singleton" это самое очевидное решение.

Вы начитались много умных книг и выучили много умных слов, но поняли все через одно место. Синглтон реализуется через приватный конструктор, соответственно вызывается из статических методов. У синглтона нет экземляров класса — все данные класса — статические, так-же как и методы. Для синглтона нет obj1.method() и obj2.method(). У Вас же name_checker — совсем не синглтон. У класса name_checker (он-же объект check_name) конструктор публичный, проперти не статические — ничто не мешает иметь хоть тысячу объектов этого класса. Это просто класс написаный не головой, а другим местом.

AZ>>особенно когда они маскируются под вызовы функций.

M>На самом деле кроме случаев создания функторов такого не разу не делал. Но тут решил показать, что умею так делать.

Я умею писать ***x = *(*(y+0x2376)).DoCalculate(*(___cx++)+24)->I_am_krutoi++;
Вот как я умею делать, при правильных типах это все даже скомпилится и будет что-то делать.


AZ>>Да код просто перемешан и усложнен — нечитабельный он.

M>Да, мне очень тяжело писать код для людей. В основном стараюсь для машин подоходчивее.

А я пишу код для людей. Меня больше волнует какие чувства испытает человек, которому придется код сопровождать или изменять, чем компилятор (хотя о компиляторе тоже думаю, правда меньше) которому этот код компилировать
Re: C#
От: divergo  
Дата: 17.05.07 12:56
Оценка:
Полчаса ленивого обдумывания плюс полтара часа неторопливого набора.

using System;
using System.Data;
using System.Collections.Generic;
using System.Collections;

namespace Converter
{
public class Converter
{
DataTable _dtTable;
Hashtable _htTable;
public Converter()
{
_dtTable= new DataTable();
_dtTable.Columns.Add(new DataColumn("Argument"));
_dtTable.Columns.Add(new DataColumn("Value"));
_dtTable.Columns.Add(new DataColumn("Result"));
_htTable = new Hashtable();
}
public void AddValue(string sArgument, Decimal dValue, string sResult)
{
DataRow drRow= _dtTable.NewRow();
drRow["Argument"] = sArgument;
drRow["Value"] = dValue;
drRow["Result"] = sResult;
_dtTable.Rows.Add(drRow);

drRow= _dtTable.NewRow();
drRow["Argument"] = sResult;
drRow["Value"] = 1/dValue;
drRow["Result"] = sArgument;
_dtTable.Rows.Add(drRow);
}
public Decimal Convert(string sArgument, Decimal dValue, string sResult)
{
_htTable.Clear();
_htTable.Add(sArgument,"");
return ConvertC( sArgument, dValue, sResult);
}
Decimal ConvertC(string sArgument, Decimal dValue, string sResult)
{
for(int i=0; i<_dtTable.Rows.Count; i++)
{
Decimal tmp;
if(_dtTable.Rows[i]["Argument"].ToString() == sArgument )
{
if(_dtTable.Rows[i]["Result"].ToString() == sResult)
return dValue* System.Convert.ToDecimal(_dtTable.Rows[i]["Value"].ToString());
else
{
tmp= System.Convert.ToDecimal(_dtTable.Rows[i]["Value"].ToString());
if(!_htTable.Contains(_dtTable.Rows[i]["Result"]))
{
_htTable.Add(_dtTable.Rows[i]["Result"],"");
tmp= ConvertC(_dtTable.Rows[i]["Result"].ToString(), dValue* tmp, sResult);
if(tmp!= 0)
return tmp;
}
}
}
}
return 0;
}

}
class MainClass
{
public static void Main(string[] args)
{
Converter cnvrtr= new Converter();
cnvrtr.AddValue("Hour", 60, "Minute");
cnvrtr.AddValue("Minute", 60, "Second");
cnvrtr.AddValue("Day", 24, "Hour");
cnvrtr.AddValue("Week", 7, "Day");
Console.WriteLine(cnvrtr.Convert("Hour",2,"Second"));
Console.WriteLine(cnvrtr.Convert("Day",1,"Second"));
Console.WriteLine(cnvrtr.Convert("Week",4,"Hour"));
Console.ReadLine();
}
}
}
Re[2]: C#
От: AntZ  
Дата: 17.05.07 13:01
Оценка:
Вы решили задачу, но совсем другую. Прочитайте внимательно что на самом деле требуется сделать. требуется сделать универсальный конвертер одних единиц в другие используя набор правил, которые задаются в том-же файле.
Re[5]: Как не надо делать тестовое задание
От: Андрей Хропов Россия  
Дата: 17.05.07 13:09
Оценка:
Здравствуйте, AntZ, Вы писали:

AZ>Здравствуйте, De-Bill, Вы писали:


AZ>>>Google на adjustency выдает ровно один документ, я про такие личты не слышал. Слово какое-то корявое и термин тоже.


DB>>Попробуй adjacency.


AZ>Умный термин — а оказывается список ребер графа


Да ничего особо умного: adjacency (англ.) — смежность.
Соотв. adjacency lists — списки смежности, а adjacency matrix — матрица смежности.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: C#
От: divergo  
Дата: 17.05.07 13:09
Оценка:
Здравствуйте, AntZ, Вы писали:

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


cnvrtr.AddValue("A", 10, "B");//1A= 10B
cnvrtr.AddValue("B", 6, "C");//1B= 6C
cnvrtr.AddValue("C", 5, "D");//1C= 5D
Console.WriteLine(cnvrtr.Convert("A",4,"D"));
//result 1200
Re[4]: C#
От: AntZ  
Дата: 17.05.07 13:18
Оценка:
AZ>>Вы решили задачу, но совсем другую. Прочитайте внимательно что на самом деле требуется сделать. требуется сделать универсальный конвертер одних единиц в другие используя набор правил, которые задаются в том-же файле.

D>cnvrtr.AddValue("A", 10, "B");//1A= 10B

D>cnvrtr.AddValue("B", 6, "C");//1B= 6C
D>cnvrtr.AddValue("C", 5, "D");//1C= 5D
D>Console.WriteLine(cnvrtr.Convert("A",4,"D"));
D>//result 1200

Прочитайте, что-ли задание. Там написано, что правила читаются из файла. У Вас что-то задается в самой программе, т.е. как минимум Вы опустили парсер входного потока.

Обсуждать Ваш великий конвертер у меня желания нет, отправляйте в контору, название можно найти ранее или спросить у автора топика
Re[5]: Как не надо делать тестовое задание
От: mr_kern Швейцария  
Дата: 17.05.07 13:25
Оценка:
Здравствуйте, AntZ, Вы писали:

AZ>>>Куда страшнее использование глобальных переменных,

M>>Для паттерна "singleton" это самое очевидное решение.

AZ>Вы начитались много умных книг и выучили много умных слов, но поняли все через одно место. Синглтон реализуется через приватный конструктор, соответственно вызывается из статических методов. У синглтона нет экземляров класса — все данные класса — статические, так-же как и методы. Для синглтона нет obj1.method() и obj2.method().


Что вы говорите...
и метод Singleton.Instance.Method1() оказывается тоже статический? Статическим является только свойство Instance через котрое происходит доступ к объекту класса. Он потому и называется Singleton, что существует один-едиснтвенный, но экземпляр класса.
Re[6]: Как не надо делать тестовое задание
От: AntZ  
Дата: 17.05.07 14:12
Оценка:
_>Что вы говорите...
_>и метод Singleton.Instance.Method1() оказывается тоже статический? Статическим является только свойство Instance через котрое происходит доступ к объекту класса. Он потому и называется Singleton, что существует один-едиснтвенный, но экземпляр класса.

Уважаемый, есть несколько способов изобразить Singleton на C++.
Мое мнение заключается в том, что раз объект является единственным, то совсем не обязательно знать его имя или иметь на него указатель, его можно идентифицировать по имени класса (Имя класса однозначно соответствует одному объекту)

MySingleton::MyMethod() вполне достаточно.
Можно написать MySignletonObject->MyMethod() — что будет просто другой метод доступа к методу MyMethod (при условии, что метод MyMethod нестатический).

Для Singleton вполне достаточно статических свойств и статических методов + приватный конструктор.
Можете конечно сказать, что статические данные размещаются скажем в .bss (compiler-dependant) и не получится создать объект Singlton в heap, но тут как раз можно привести контр-пример. Это не является единственно верным каноническим методом создания Singleton в C++, можно создать Singleton другими способами.

А теперь объясните мне, каким образом Вы получили имя объекта Singleton в Вашем примере? У вас есть публичный конструктор? Тогда это не Singleton.

Вот такой код я понять могу

Singleton *pMySingleton;
pMySingleton = MySigngleton::GetPointer();
pMySingleton->MyMethod();

Пожалуйста приведите пример, когда метод синглтона вызывается не через -> а через .
Вероятно, это будет

(*pMySingleton).MyMethod();

Вот только код это будет сравнимый по качеству с кодом автора первоначального шедевра. А вот приведите мне начало Вашего кода — напомню, что Вы написали "Singleton.Instance.Method1()", меня интересует где и как была создана переменная Singleton
Re[4]: Как не надо делать тестовое задание
От: AndrewJD США  
Дата: 17.05.07 14:15
Оценка:
Здравствуйте, machine3000, Вы писали:

M>Да, мне очень тяжело писать код для людей. В основном стараюсь для машин подоходчивее.

Разве это не достаточное основание для отклонения твоей кандидатуры?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[5]: Как не надо делать тестовое задание
От: machine3000  
Дата: 17.05.07 14:27
Оценка:
Здравствуйте, AndrewJD, Вы писали:

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


M>>Да, мне очень тяжело писать код для людей. В основном стараюсь для машин подоходчивее.

AJD>Разве это не достаточное основание для отклонения твоей кандидатуры?

Я не пытаюсь оспорить основания, какими бы они ни были. С другой стороны "тяжело" не означает, что в этом направлении я совсем ничего не могу сделать. Однако хотелось бы надеяться, что существует спрос и на то направление, которое мне более интересно.
Re[2]: C#
От: minorlogic Украина  
Дата: 17.05.07 14:35
Оценка:
Вроде как полный перебор ?
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: C#
От: divergo  
Дата: 17.05.07 14:47
Оценка:
AZ> ...минимум Вы опустили парсер входного потока. ...
самое сложное?

AZ>...Ваш великий конвертер...

70 строк кода можно назвать великими?

возможно кто-то сделает для себя выводы, в пользу дотнет.
Re[3]: C#
От: divergo  
Дата: 17.05.07 14:50
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Вроде как полный перебор ?

Да. Желающие могут прооптимизировать, а мне лень.
Re[4]: C#
От: minorlogic Украина  
Дата: 17.05.07 15:00
Оценка:
Здравствуйте, divergo, Вы писали:

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


M>>Вроде как полный перебор ?

D>Да. Желающие могут прооптимизировать, а мне лень.

Мне вообщет понравилось, легко читается, по теме и работает.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[7]: Как не надо делать тестовое задание
От: mr_kern Швейцария  
Дата: 17.05.07 15:22
Оценка:
Здравствуйте, AntZ, Вы писали:

_>>Что вы говорите...

_>>и метод Singleton.Instance.Method1() оказывается тоже статический? Статическим является только свойство Instance через котрое происходит доступ к объекту класса. Он потому и называется Singleton, что существует один-едиснтвенный, но экземпляр класса.

AZ>Уважаемый, есть несколько способов изобразить Singleton на C++.

AZ>Мое мнение заключается в том, что раз объект является единственным, то совсем не обязательно знать его имя или иметь на него указатель, его можно идентифицировать по имени класса (Имя класса однозначно соответствует одному объекту)

AZ>MySingleton::MyMethod() вполне достаточно.

AZ>Можно написать MySignletonObject->MyMethod() — что будет просто другой метод доступа к методу MyMethod (при условии, что метод MyMethod нестатический).

AZ>Вот только код это будет сравнимый по качеству с кодом автора первоначального шедевра. А вот приведите мне начало Вашего кода — напомню, что Вы написали "Singleton.Instance.Method1()", меня интересует где и как была создана переменная Singleton


Все очень просто, тут небольшое недорозумение. Я говорил про C# а не про плюсплюс. Пока читал топик, забыл с чего все начиналось
Ну, а для интереса, могу показать как на шарпе: здесь
Re[8]: Как не надо делать тестовое задание
От: AntZ  
Дата: 17.05.07 16:17
Оценка:
AZ>>Вот только код это будет сравнимый по качеству с кодом автора первоначального шедевра. А вот приведите мне начало Вашего кода — напомню, что Вы написали "Singleton.Instance.Method1()", меня интересует где и как была создана переменная Singleton

_>Все очень просто, тут небольшое недорозумение. Я говорил про C# а не про плюсплюс. Пока читал топик, забыл с чего все начиналось

_>Ну, а для интереса, могу показать как на шарпе: здесь

Вот видите, просто говорили о разных вещах
Кстати — изобразить Singleton.Method() наверное можно и в плюсах

void MyFunc(Singleton &MySingleton)
{
MySingleton.MyMethod();
}

Должно работать, но это не более, чем спортивное программирование — передавать ссылку на объект, когда объект всего один.
Re[6]: C#
От: AntZ  
Дата: 17.05.07 16:27
Оценка:
D>возможно кто-то сделает для себя выводы, в пользу дотнет.

Ну и где работает .Net, windows only? Даже для Windows Mobile он несколько тяжеловат.
С и C++ есть на десятках, если не сотнях платформ. Я сейчас работаю преимущественно с PowerPC и ARM, на обеих платформах .Net — далеко не естественный выбор. И дело не в том, что я противник управляемых сред, совсем нет, просто я работаю в области *cистемного*, а не прикладного программирования.

Программа может быть красиво написана как на C++ так и на C#, а может быть по уродски написана на обоих. Мне кажется, что результат больше зависит от личности автора, нежели инструмента который он использует.
Re[7]: Как не надо делать тестовое задание
От: is  
Дата: 17.05.07 20:07
Оценка:
Здравствуйте, AntZ, Вы писали:

_>>Что вы говорите...

_>>и метод Singleton.Instance.Method1() оказывается тоже статический? Статическим является только свойство Instance через котрое происходит доступ к объекту класса. Он потому и называется Singleton, что существует один-едиснтвенный, но экземпляр класса.

AZ>Уважаемый, есть несколько способов изобразить Singleton на C++.

AZ>Мое мнение заключается в том, что раз объект является единственным, то совсем не обязательно знать его имя или иметь на него указатель, его можно идентифицировать по имени класса (Имя класса однозначно соответствует одному объекту)

Если будет нужно полиморфное поведение, например, реализации паттерна abstract factory, то придется работать с экземпляром или указателем/ссылкой на него. Классический пример: фабрика виджетов для разных платформ, которая реализована как синглтон. В случае отсутствия потребности в полиморфизме, статических методов вполне достаточно.
... << RSDN@Home 1.2.0 alpha rev. 653>>
Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius — and a lot of courage — to move in the opposite direction. -- Albert Einstein
Re[8]: Как не надо делать тестовое задание
От: MikelSV http://www.centerix.ru
Дата: 17.05.07 21:15
Оценка:
Под конец, и ваших разговоров тоже быстро листал страничку.

Народ, я вас не понимаю, строить какую-то матрицу...

Я как обычно, в своем стиле, тоесть быстро, просто, красиво (как мне кажется): (минут за 10 накатал)

/*
1 day = 24.0 hour
1 minute = 60 second
60 minute = 1 hour
10.0 glob = 1 decaglob
*/

#define TT_DAY 0
#define TT_HOUR 1
#define TT_MINUTE 2
#define TT_SECOND 3
#define TT_GLOB 4
#define TT_DECAGLOB 5

int tpr[]={1, 24, 60, 60, 1, 10};

double Convert(double val, BYTE type, BYTE totype){
if(type<4 && totype>3 || totype<4 && type>3) return 0;
if(type<totype){
for(type; type<totype; type++){val*=tpr[type+1];}
}else {
for(type; type>totype; type--){val/=tpr[type];}
}
return val;


Работает это так:
double ret=1440;
ret=Convert(ret, TT_MINUTE, TT_DAY);


double здесь, ну так, на всякий случай, скорее она здесь и нафиг не нужна.
При несоответствии типов возвращается 0. (Я не понимаю что за тип glob. и как он связан со временем)

Кстати интересная вещь, может где пригодится.

Полагаю, вам не нужно объяснять, как определить тип данных, если начальный запрос будут давать в текстовом виде? "2 hour = second". это еще проще, тока писать лень.

Присутствует некое ощущение эйфории, , давно не забегало.
Очень хочу ваши комментарии, потому как ну очень хочется услышать оценку своей работы.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[7]: Как не надо делать тестовое задание
От: goldblueranger  
Дата: 19.05.07 15:26
Оценка:
Здравствуйте, AntZ, Вы писали:

_>>Что вы говорите...

_>>и метод Singleton.Instance.Method1() оказывается тоже статический? Статическим является только свойство Instance через котрое происходит доступ к объекту класса. Он потому и называется Singleton, что существует один-едиснтвенный, но экземпляр класса.

AZ>Уважаемый, есть несколько способов изобразить Singleton на C++.

AZ>Мое мнение заключается в том, что раз объект является единственным, то совсем не обязательно знать его имя или иметь на него указатель, его можно идентифицировать по имени класса (Имя класса однозначно соответствует одному объекту)

AZ>MySingleton::MyMethod() вполне достаточно.

AZ>Можно написать MySignletonObject->MyMethod() — что будет просто другой метод доступа к методу MyMethod (при условии, что метод MyMethod нестатический).

AZ>Для Singleton вполне достаточно статических свойств и статических методов + приватный конструктор.

AZ>Можете конечно сказать, что статические данные размещаются скажем в .bss (compiler-dependant) и не получится создать объект Singlton в heap, но тут как раз можно привести контр-пример. Это не является единственно верным каноническим методом создания Singleton в C++, можно создать Singleton другими способами.

Но ведь есть же разница между "единственным экземпляром" и "набором глобальных переменных", пусть и закрытых для доступа извне:
1. Если мы используем статические методы, то лишаемся преимуществ наличия конструктора и деструктора — код который может понадобиться для инициализации и корректной деинициализации синглтона (конечно, это можно обойти, но зачем изобретать велосипед). Добавьте сюда то, что экземпляр сиглтона совсем не обязан жить вечно — например убиваться через какое-то время после последнего использования (чтобы освободить ресурсы). Или, например, какая головня боль может начаться при деинициализации набора сингтонов, использующих друг друга (почему у нас так много програм вылетает при закрытии?)
2. Бывают случаи, когда класс (до некоторой поры синглтон) может стать не синглтоном; и в случае со статическими методами нужно будет попотеть намного больше чтобы добавить пару инстансов.

Если кто-то уверен, что эти отличия никогда не будут иметь значения, то я не спорю — главное чтобы человек знал от чего отказывается.

AZ>А теперь объясните мне, каким образом Вы получили имя объекта Singleton в Вашем примере? У вас есть публичный конструктор? Тогда это не Singleton.


AZ>Пожалуйста приведите пример, когда метод синглтона вызывается не через -> а через .

AZ>Вероятно, это будет

AZ>(*pMySingleton).MyMethod();


AZ>Вот только код это будет сравнимый по качеству с кодом автора первоначального шедевра. А вот приведите мне начало Вашего кода — напомню, что Вы написали "Singleton.Instance.Method1()", меня интересует где и как была создана переменная Singleton


Зачем переменная?

Printer& thePrinter = Printer::GetInstance();
thePrinter.PrintTestPage();

Я привык пользоваться правилом, что если функция возвращает (или принимает) указатель, значит он может быть NULL. И использовать его без доппроверки нельзя. Если функция гарантирует, что объект будет создан — пусть возвращает ссылку...

Буду рад, если мой опыт в данном вопросе будет полезен прочитавшему этот пост.
Re[9]: Как не надо делать тестовое задание
От: Александр Каширин  
Дата: 19.05.07 19:03
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Я как обычно, в своем стиле, тоесть быстро, просто, красиво (как мне кажется): (минут за 10 накатал)


MSV>/*

MSV>1 day = 24.0 hour
MSV>1 minute = 60 second
MSV>60 minute = 1 hour
MSV>10.0 glob = 1 decaglob
MSV>*/

MSV>#define TT_DAY 0

MSV>#define TT_HOUR 1
MSV>#define TT_MINUTE 2
MSV>#define TT_SECOND 3
MSV>#define TT_GLOB 4
MSV>#define TT_DECAGLOB 5

MSV><skipped>


MSV>Присутствует некое ощущение эйфории, , давно не забегало.

MSV>Очень хочу ваши комментарии, потому как ну очень хочется услышать оценку своей работы.

Подумайте сами. Вот Вы разработали программу. И вот я подсовываю ей на вход текстовый файл, в котором появляются такие единицы, как килограммы, месяцы и слоны и мегаслоны. Ну и в конце требуется перевести 3 мегаслона в слонов. Вопрос: как Ваша программа будет работать? Думаю, ответ очевиден: не будет работать. А в CQG требование к масштабируемости кода озвучивается в явном виде, когда дается задание.
Re[2]: Как не надо делать тестовое задание
От: Александр Каширин  
Дата: 19.05.07 19:11
Оценка:
Здравствуйте, minorlogic, Вы писали:

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

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

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


M>Алгоритм выполняется за линейное время.


Как быть в случае, если к перечисленным единицам во входном файле добавляются еще килограммы, тонны, метры и километры? Там столько вариантов реализации появляется, что я аж дополнительные вопросы заранее задавать не буду: подождем, что Вы предложите
Re[3]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 19.05.07 19:16
Оценка:
Здравствуйте, Александр Каширин, Вы писали:

АК>Здравствуйте, minorlogic, Вы писали:


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

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

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


M>>Алгоритм выполняется за линейное время.


АК>Как быть в случае, если к перечисленным единицам во входном файле добавляются еще килограммы, тонны, метры и километры? Там столько вариантов реализации появляется, что я аж дополнительные вопросы заранее задавать не буду: подождем, что Вы предложите


Не имеет значения , мы когда поиск в ширину ведем , то будем вести столько раз пока не пройдем все вершины. Все связанные вершины образуют отдельный граф, нам требуется только пронумеровать наших слонов , чтобы килограммы в секунды не переводить.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[9]: Как не надо делать тестовое задание
От: Александр Каширин  
Дата: 19.05.07 19:18
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Полагаю, вам не нужно объяснять, как определить тип данных, если начальный запрос будут давать в текстовом виде? "2 hour = second". это еще проще, тока писать лень.

Кстати, требования к контролю корректности входных данных также явно озвучивается CQG, когда дается задание. Поэтому "это еще проще" не соответствует действительности: слишком много вариантов, каким образом можно напортачить с входными данными (например, зациклить единицы с некорректными коэффициентами типа: 1 минута = 60 секунд; 1 секунда = 2 минуты).

В Вашем коде есть еще несколько очевидных проколов. Попробуйте найти их сами, если Вам действительно интересно. Наводка такая: прикиньте расширяемость Вашего кода.
Re[10]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 19.05.07 19:45
Оценка:
Здравствуйте, Александр Каширин, Вы писали:

АК>Здравствуйте, MikelSV, Вы писали:


MSV>>Полагаю, вам не нужно объяснять, как определить тип данных, если начальный запрос будут давать в текстовом виде? "2 hour = second". это еще проще, тока писать лень.

АК>Кстати, требования к контролю корректности входных данных также явно озвучивается CQG, когда дается задание. Поэтому "это еще проще" не соответствует действительности: слишком много вариантов, каким образом можно напортачить с входными данными (например, зациклить единицы с некорректными коэффициентами типа: 1 минута = 60 секунд; 1 секунда = 2 минуты).

АК>В Вашем коде есть еще несколько очевидных проколов. Попробуйте найти их сами, если Вам действительно интересно. Наводка такая: прикиньте расширяемость Вашего кода.


Вы зря цепляетесь , очевидно же что код писался быстро, и врядли кто либо тут без веской причины потратит неделю на написание красивого решениия ? Не находите ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[11]: Как не надо делать тестовое задание
От: Александр Каширин  
Дата: 19.05.07 20:36
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Вы зря цепляетесь , очевидно же что код писался быстро, и врядли кто либо тут без веской причины потратит неделю на написание красивого решениия ? Не находите ?


Человек просил дать оценку его решения. Потому и цепляюсь Просто этот код тоже является примером "непроходного" по ряду причин, которые я называю.
Re[4]: Как не надо делать тестовое задание
От: Александр Каширин  
Дата: 19.05.07 20:42
Оценка:
Здравствуйте, minorlogic, Вы писали:

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


Понятно, что слонов надо нумеровать. Мне был интересен предлагаемый способ нумерации. В принципе, согласен: сначала построили весь граф, затем выявляем слонов — неплохой вариант.
Re[5]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 19.05.07 20:53
Оценка:
Здравствуйте, Александр Каширин, Вы писали:

АК>Здравствуйте, minorlogic, Вы писали:


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


АК>Понятно, что слонов надо нумеровать. Мне был интересен предлагаемый способ нумерации. В принципе, согласен: сначала построили весь граф, затем выявляем слонов — неплохой вариант.


Нумеровать просто 1, 2, 3 и т.д. хранить номер используемых слонов в вершине графа рядом со значением перевода в слона.


На мой взгляд есть куда более интерессная задача.

1. Почти тоже самое речь пойдет о валютах и их курсах.

2. Курс перевода валют различен для пары , напрмиер гривна в доллар 5.6 а доллар в гривну 5.2. Т.е. в нашем решении ребра графа направленные.

3. Задача нафти самый оптимальный (по величине результата) путь обмена валют например выгоднее поменять доллары во франки и потом в евро чем доллары в гривну и потом в евро.


Насколько я понимаю специфику , задача не должна иметь линейной сложности решения. Предусмотреть частые изменения курса валют.

по крайней мере решения в лоб не получить ... Плюс видно будет на тестовых данных , как человек тестировал программу и как оптимизировал.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: Как не надо делать тестовое задание
От: MikelSV http://www.centerix.ru
Дата: 19.05.07 21:15
Оценка:
Так, приколисты. В данном коде плохо только одно: он не оптимизирован под время, т.е. выполняется линейно.

Он с пол пинка расширяется, хотите слонов?

#define TT_SLON 6
#define TT_MEGASLON 7

int tpr[]={1, 24, 60, 60, 1, 10, 1, 1024};

можно еще создать массивчик начала типов. int tprft[]={0, 4, 6}; и вначале определять, к каким блокам типов относятся типы и показывать ошибку при несоответствии типов.

минута = 60 секунд; 1 секунда = 2 минуты — это будет вашей ошибкой. вы это не сможете описать в tpr[]. Не пишите бред и будет вам счастье.
Хотя, если вы все-таки это напишите, то программа просто пройдет от одного элемента массива до другого. И вернет вам ответ, который получится.

Хотите много типов? Впишите их, это не проблема.

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

Еще был вариант не проходить по массиву, а сразу конвертировать, вы этого хотели? Здесь нет линейной зависимости. Могу показать как это будет.


О, с баксами и еврами по ходу дела уже нужно строить матрицу.
Ага, в общем ничего сложного, только нужно понять, в каком виде будут поступать данные. Из них строится матрица. Через нее ведутся расчеты.


В общем можно построить один вариант программы, основанный на матрице. Нужно только определить (я должен понимать, в каком виде мне это придет) тип входных данных. Функция будет с теми же параметрами, но другим алгоритмом.

Еще 2 вещи:
Опция равенства конвертирования: если а=б, то б=а
И Регенерации (или как это можно назвать) матрицы: если a=i*b, b=k*c, то отсюда можно понять a=j*c; Короче восстановить недостающие элементы матрицы.

Первое и второе нужны там, где величины постоянны: время, размер, вес, и не нужны в обменах валюты.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re: Как не надо делать тестовое задание
От: Vitaliy81  
Дата: 19.05.07 21:28
Оценка:
Здравствуйте, machine3000, Вы писали:

CQG? Рписал такое... Делал через графы(решение, описанное выше) на шарпе. На тех. собеседование пригласили быстро, после него послали тоже быстро ))))
Re[6]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 20.05.07 05:56
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Так, приколисты. В данном коде плохо только одно: он не оптимизирован под время, т.е. выполняется линейно.


MSV>Он с пол пинка расширяется, хотите слонов?


MSV>#define TT_SLON 6

MSV>#define TT_MEGASLON 7

Видимо имелось ввиду что код не расширяем в рантайме.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[7]: Как не надо делать тестовое задание
От: MikelSV http://www.centerix.ru
Дата: 20.05.07 07:20
Оценка: :)
M>Видимо имелось ввиду что код не расширяем в рантайме.

А как это по русски?
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[8]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 20.05.07 07:59
Оценка:
Здравствуйте, MikelSV, Вы писали:

M>>Видимо имелось ввиду что код не расширяем в рантайме.


MSV>А как это по русски?


Время выполнения , время компиляции. У вас данные вшиты в программу и могут меняться только во время компиляции
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[9]: Как не надо делать тестовое задание
От: MikelSV http://www.centerix.ru
Дата: 20.05.07 08:23
Оценка:
M>Время выполнения , время компиляции. У вас данные вшиты в программу и могут меняться только во время компиляции

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


Значит так: (полная версия, для всевозможных вариантов)

Входной файл:
1 minute > (или =, если это равносторонняя функция) 60 second
1 hour = 60 minute
...

из этого делается:
class CONV{
public:
char*type;
double val;
char*totope;
double toval;
bool cmp;
};

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

В конце получается готовая к работе матрица.

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

Насчет функции поиска лучшего пути обмена валют, тут скорее методом перебора по матрице, не проходя по одному пути дважды.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[10]: Как не надо делать тестовое задание
От: minorlogic Украина  
Дата: 20.05.07 08:40
Оценка:
Реально тут мало чего есть оценивать. Вы предложили алгоритм решения , не самый эфективный как уже было показанно.

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

А решение которое вы предложили , можно было и словами в трех строчках описать. Т.е. предсталенный код — это прототип решения , не больше.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Как не надо делать тестовое задание
От: Ka3a4oK  
Дата: 20.05.07 09:48
Оценка:
Здравствуйте, Vitaliy81, Вы писали:

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


V>CQG? Рписал такое... Делал через графы(решение, описанное выше) на шарпе. На тех. собеседование пригласили быстро, после него послали тоже быстро ))))


Почему послали ?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[6]: Как не надо делать тестовое задание
От: Александр Каширин  
Дата: 20.05.07 12:23
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Так, приколисты. В данном коде плохо только одно: он не оптимизирован под время, т.е. выполняется линейно.

MSV>Он с пол пинка расширяется, хотите слонов?

MSV>#define TT_SLON 6

MSV>#define TT_MEGASLON 7

MSV>int tpr[]={1, 24, 60, 60, 1, 10, 1, 1024};


Вы считаете, что переписывать программу каждый раз, когда появляются новые входные данные — это нормально?

MSV>минута = 60 секунд; 1 секунда = 2 минуты — это будет вашей ошибкой. вы это не сможете описать в tpr[]. Не пишите бред и будет вам счастье.

MSV>Хотя, если вы все-таки это напишите, то программа просто пройдет от одного элемента массива до другого. И вернет вам ответ, который получится.

Если программа в ответ на такие входные данные вернет сообщение: "Не пишите бред и будет вам счастье", — можно считать, что Вы справились с заданием контроля корректности входных данных. Если не напишет, а вернет "ответ, который получится" — значит Вам не предложат работу в данной конкретной фирме
Re[6]: Как не надо делать тестовое задание
От: Александр Каширин  
Дата: 20.05.07 12:29
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>На мой взгляд есть куда более интерессная задача.


M>1. Почти тоже самое речь пойдет о валютах и их курсах.

M>2. Курс перевода валют различен для пары , напрмиер гривна в доллар 5.6 а доллар в гривну 5.2. Т.е. в нашем решении ребра графа направленные.
M>3. Задача нафти самый оптимальный (по величине результата) путь обмена валют например выгоднее поменять доллары во франки и потом в евро чем доллары в гривну и потом в евро.

M>Насколько я понимаю специфику , задача не должна иметь линейной сложности решения. Предусмотреть частые изменения курса валют.

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

Почему в лоб не получить? Алгоритм поиска кратчайшего пути поможет.
Re[3]: Как не надо делать тестовое задание
От: Vitaliy81  
Дата: 20.05.07 20:57
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

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


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


V>>CQG? Рписал такое... Делал через графы(решение, описанное выше) на шарпе. На тех. собеседование пригласили быстро, после него послали тоже быстро ))))


KK>Почему послали ?


Потому что "К сожалению, в данный момнет у нас нет вакансии, отвечающей вашему опыту и пожеланиям" и т.д. и т.п. А кто и когда говорит, почему не подошел?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.