Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 16.10.2015
Сообщений: 27

Проверить и прокомментировать вариант решения тестового задания при приёме на работу

16.10.2015, 21:07. Показов 7512. Ответов 87
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!
Сделал тестовое задание, которое попросил сделать один работодатель, на что получил отказ и комментарий о том, что "оно сделано неидеально". Как вы думаете, что могло там не понравиться, чтобы знать на будущее? Это работодатель такой капризный или я такой кривой программер, что там действительно сделано так нехорошо? Несколько шероховатостей я вижу, но могли ли они быть основанием для отказа?

Ниже привожу свои варианты решения задач.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2015, 21:07
Ответы с готовыми решениями:

Проверить и прокомментировать вариант решения тестового экзаменационного задания по теории C++ и Си
Уважаемые профессионалы,на днях мне предстоит сдавать экзамен по программированию, если не затруднит - посмотрите вопросы, которые я...

Тесты, вопросы и задания при приеме на работу
Давайте делится - если кто в недавнем времени устраивался и проходил собеседования....

Какого уровня тестовые задания при приеме на работу ребят без опыта
Всем привет. Краткая предыстория: высшее образование у меня гуманитарное, но чёрт дернул меня идти в программисты (всегда хотел в IT,...

87
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.10.2015, 02:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну зачем же std::? Кроме std:: еще и С++ существует.
Затем, что без std это будет велосипед в квадрате.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
а результат парсинга вы куда деваете? Часом не в динамическую память?
Причем тут результаты? Автомат должен обрабатывать любое количество вложенных скобок. Поэтому, он должен хранить где-то историю своих переходов. Иначе как он из вложенных скобок вылезет? В моем случае это хранение реализовано на аппаратном уровне. В вашем - через велосипед. Аппаратная реализация заведомо выигрывает.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Затем что в штатный стеке нельзя сортировать.
res->list.push_back(parse_value(stream)); res->set.insert(parse_value(stream));
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 03:22

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
Затем, что без std это будет велосипед в квадрате.
Новый патент на колесо выдают примерно раз в 10 лет. Новый патент на гусеницу - примерно раз в год. Как думаете, насколько часто выдают патент на такое сложное устройство как велосипед? В одном из свежих патентов передача зубчатая и привод на оба колеса.



Добавлено через 2 минуты
Цитата Сообщение от Renji Посмотреть сообщение
Автомат должен обрабатывать любое количество вложенных скобок.
Ошибка номер раз. Не любое а такое которое юзер не напишет. Достаточно один раз распределить буфер под стек.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.10.2015, 03:34
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение

Не по теме:

Новый патент на колесо выдают примерно раз в 10 лет.

Не по теме:

...Одному из семи миллиардов землян.


Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ошибка номер раз. Не любое а такое которое юзер не напишет. Достаточно один раз распределить буфер под стек.
В аппаратной реализации стека так и сделали. Но разговор не о предельной глубине стека, а о том что совсем без него автомат не заведется. И о том что вместо вашего написанного пусть даже за месяц велосипеда, у нас есть аппаратная реализация стека, которую вылизывали десятки лет. И оптимизировали процессор именно под этот вылизанный стек, а не под ваш велосипед.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 03:53
Цитата Сообщение от Renji Посмотреть сообщение
res->set.insert(parse_value(stream));
А если два одинаковых куска попадутся? А при открытии скобок создаем новый set который динамически создает буфер а при закрытии удаляем тоже с удалением динамического буфера? А при вставке насколько часто он будет перераспределять память?

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
И оптимизировали процессор именно под этот вылизанный стек
А про стек вызовов никто не говорит. Тут по всей видимости можно вообще только inline "вызовами" обойтись. Во всяком случае того что будет касаться сортировки и стека скобок. А для определения символа по всей видимости удобнее таки таблица indirect call будет чем if-ы, современные процы ветвления не любят. Хотя при таком количестве символов в алфавите это стрельба из пушки по воробъям.

Добавлено через 7 минут
Цитата Сообщение от Renji Посмотреть сообщение
Но разговор не о предельной глубине стека
Как раз разговор об этом. Стек скобок не может быть длине строки, а в синтаксически правильной строке - половины длины строки. Поэтому динамически растущий он не нужен.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.10.2015, 04:38
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А если два одинаковых куска попадутся? А при открытии скобок создаем новый set который динамически создает буфер а при закрытии удаляем тоже с удалением динамического буфера? А при вставке насколько часто он будет перераспределять память?
Если два одинаковых куска попадутся, то std::multiset спасет отца русской демократии. Сверху втыкается аллокатор на основе пула, с константным временем работы. Причем, не велосипедный, а готовый из буста. Аппаратному стеку он, конечно, не соперник, но вот с вашим велосипедным стеком вполне посоперничает.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А про стек вызовов никто не говорит. Тут по всей видимости можно вообще только inline "вызовами" обойтись. Во всяком случае того что будет касаться сортировки и стека скобок.
Ага, здесь можно обойтись только inline вызовами, раскиданными по разлапистому switch(stack.pop()) или его аналогам. Только вот функционал этого switch(stack.pop()) будет абсолютно идентичен функционалу стека вызовов. С единственным отличием - тормозить будет. Архитектура процессора не под это оптимизирована.
Про читаемость C++ кода в который втиснули indirect call я вообще молчу тихонько. Ну а че, в Си вон вообще делают longjmp из одной функции в другую и не жалуются.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 05:21
Цитата Сообщение от Renji Посмотреть сообщение
Про читаемость C++ кода в который втиснули indirect call я вообще молчу тихонько.
Прекрасно читается. лучше чем ифы. Код классов с виртуальными методами читается же нормально? а это список indirectcall
Цитата Сообщение от Renji Посмотреть сообщение
Сверху втыкается аллокатор на основе пула, с константным временем работы.
Аллокатор с константным временем работы - это шутка такая или те кто это написал в доке не в курсе как менеджер кучи ищет память для выделения? Или выделяем кусок побольше а потом переставляем номер последнего? Для стека самое то, но я и без буста так умею.
Здесь можно обойтись вообще без динамического распределения в процессе работы. Достаточно выделить буфера на старте. И возможно вообще без ветвлений. Хотя stack underflow все равно проверять надо. а если indirect call в этом месте прикрутить то гудбай inline pop()
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.10.2015, 05:27
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Прекрасно читается. лучше чем ифы. Код классов с виртуальными методами читается же нормально? а это список indirectcall
Виртуальные методы, это все тоже "побить автомат на подфункции".
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Аллокатор с константным временем работы - это шутка такая или те кто это написал в доке не в курсе как менеджер кучи ищет память для выделения?
Это такая оптимизация под конкретный класс. Свободная память режется на равные ломтики, ломтики соединяются в список, выделение сводится к извлечению ломтика из списка. Размер ломтика при этом строго фиксирован, но что поделаешь, за скорость надо платить.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 05:46
Цитата Сообщение от Renji Посмотреть сообщение
Архитектура процессора не под это оптимизирована.
Ты в курсе что некоторые switch(i) вот так ассемблируются: jmp [casetable[i]] ? Cам jmp для проца не проблема, спотыкается проц на ветвлении, потому что откатывается ветка предвычислений несработавшего варианта.

Добавлено через 2 минуты
Цитата Сообщение от Renji Посмотреть сообщение
Это такая оптимизация под конкретный класс. Свободная память режется на равные ломтики, ломтики соединяются в список, выделение сводится к извлечению ломтика из списка. Размер ломтика при этом строго фиксирован, но что поделаешь, за скорость надо платить.
сколько глупостей вместо банального Stack[StakPtr++]=Value;
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.10.2015, 05:54
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ты в курсе что некоторые switch(i) вот так ассемблируются: jmp [casetable[i]] ? Cам jmp для проца не проблема, спотыкается проц на ветвлении, потому что откатывается ветка предвычислений несработавшего варианта.
Ты в курсе что переход по ret процессор нормально предскажет, а вот переход по jmp [casetable[i]], по понятным причинам - нет? Ты в курсе что ret одновременно выполняет jmp SS:[ESP] И удаляет значение из макушки стека?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
сколько глупостей вместо банального Stack[StakPtr++]=Value;
Можешь делать банальное Stack[StakPtr++]=Value, с банальным ручным вызовом процедуры сортировки. Это как бы не оправдывает отказа от разбиения парсера на отдельные функции, вызывающие друг друга штатным call, а не велосипедами.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 06:59
Цитата Сообщение от Renji Посмотреть сообщение
Это как бы не оправдывает отказа от разбиения парсера на отдельные функции, вызывающие друг друга штатным call, а не велосипедами.
А вызова они всегда штатным call или indirect call идут. Вопрос в том что свой стек данных всегда работает быстрее чем рекурсия. Возьми хотя бы тоже вычисление факториала или фибоначи, а закраска с затравкой - так вообще. А здесь в стек нужно заносить только положение скобки.

Цитата Сообщение от Renji Посмотреть сообщение
Это как бы не оправдывает отказа от разбиения парсера на отдельные функции
Ну функции возможно, только принцип разбиения абсолютно другой. и смысл разбиения - заменить ветвления на indirect call
Цитата Сообщение от Renji Посмотреть сообщение
с банальным ручным вызовом процедуры сортировки
Какой процедуры сортировки? Ты о чем? Здесь не сортировка нужна а добавление в упорядоченный список с сохранением упорядоченности. Да кстати а в бусте что Ктулху автоматически сортировку вызывает?

Цитата Сообщение от Renji Посмотреть сообщение
а вот переход по jmp [casetable[i]], по понятным причинам - нет
Ну сбросит L1 кеш инструкций. При L2 на борту не критично, а тем более при L3. Так же как при call, но ветку вычислений откатывать не придется.
Поэтому call [proctable[i]] 1 раз на символ сработает лучше чем по несколько if-ов на символ. Если при этом учесть что подмена состояния осуществляется подменой таблицы, то еще веселее, потому как даже для проверки синтаксиса вместо кучи ифов просто переписывается один указатель.

Добавлено через 16 минут
Табличка функций правда будет скорее всего больше обрабатываемой строки в разы. но за скорость приходится платить.
0
1 / 1 / 0
Регистрация: 16.10.2015
Сообщений: 27
17.10.2015, 08:03  [ТС]
Спасибо, товарищи. Я думаю, что вопрос исчерпан с той задачей.
Если уж "пошла такая пьянка", то вот вам вторая моя тестовая задача и решение (результат пока не известен, но что-то мне подсказывает, что он не радужный, судя по тому, что работодатель молчит уже вторую неделю).
Задание:
Sort a binary file of unsigned 32-bit integers in ascending order in the assumption that the file size is significantly larger than available memory.

Expected result

C++ source code with a project or a make file of a console application, that is built with VS 2010/2013 or gcc(g++) 4.6/4.8

The application may assume the execution on a semi-idle multi-core 64bit OS with plenty of HD space.

Bonus features:

Use of C++11, STL or Boost(1.51 or 1.55)
Cross-platform solution
Production-level code

Решение приложено.
Вложения
Тип файла: zip FileSort.zip (7.3 Кб, 13 просмотров)
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 08:06
Цитата Сообщение от a_shy Посмотреть сообщение
Если уж "пошла такая пьянка"
Пъянка пошла такая что все бросил и сел писать этот чертов автомат
0
1 / 1 / 0
Регистрация: 16.10.2015
Сообщений: 27
17.10.2015, 08:10  [ТС]
)))
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 08:37
Цитата Сообщение от a_shy Посмотреть сообщение
Решение приложено.
Нормально. В нашем ликбезе у автоматчиков на втором курсе такая лаба была, примерно так же делал, правда на паскале и процедурно, а то бы объяснить не смогли. Одно непонятно на кой ляд тут баст или STL? Ну разве что qsort оттуда попользовать для сортировки фрагментов, оно обшаблоненное быстрее должно быть чем с каллбэком для сравнения элементов.

Добавлено через 16 минут
Цитата Сообщение от a_shy Посмотреть сообщение
he application may assume the execution on a semi-idle multi-core 64bit OS with plenty of HD space.
Так, а слона то мы и не заметили. Куски очень неплохо бы было сортировать в разных потоках. т.е. макс отведенное место делишь на количество конвейеров, сортируешь такие куски в памяти параллельно, а потом слияешь их прямо во временный кусочный файл . причем один поток слияет, другие в это время следующую порцию кусков сортируют. Ну а потом файлы слияешь в один.
0
1 / 1 / 0
Регистрация: 16.10.2015
Сообщений: 27
17.10.2015, 09:24  [ТС]
Да, я это заметил, но поленился отсортировать многопоточно, написал это в todo. Честно говоря было вломак много времени на эту задачу расходовать.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.10.2015, 09:41
a_shy, сразу же бросается в глаза бардак с генерацией исключений: в одной и той же функции в одних случаях throw, в других — throw new.

Цитата Сообщение от a_shy Посмотреть сообщение
Темплейты - сам понимаю - там абсолютный оверкилл, но я их использовал, чтобы показать, что я не совсем лошара какой-нибудь и их тоже знаю.
Я не возьмусь оценивать насколько тут нужны шаблоны (т.к. дерево само по себе хочет быть шаблоном, и это нормально), но использование возможностей языка по принципу «чтобы было» негативно сказывается на тестовом задании. Адекватность кода важнее. Это так, на будущее.

Не знаю критериев, по которым конкретная контора оценивает задание, но я бы отменил высокую степень велосипедизма: свои структуры данных, свой парсер. Могу сослаться на Андрея Аксенова (неточная цитата):
…известная байка про производительность программиста, когда она отличается в двадцать раз. Она не в двадцать раз отличается, она отличается в сто раз. Живой пример — тестовое задание «Калькулятор». Специально обученный человек этот калькулятор пишет за тридцать минут. Причем аккуратненько, на yacc+lex (…). Специально обученный тупой баран пишет его за двое суток. (…) Почему за тридцать минут? Потому что человек знает классические инструменты, которым 50 лет и которые позволяют решать широкий спектр задач.
Доклад, примерно на 38 минуте.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 10:52
Цитата Сообщение от 0x10 Посмотреть сообщение
Не знаю критериев, по которым конкретная контора оценивает задание, но я бы отменил высокую степень велосипедизма
А мне например первое что сказали когда на работу устроился после универа - "Забудь все стандартные библиотеки и алгоритмы которые применял раньше, особенно буфера. Они здесь не работают. Тут мозгами думать надо а не библиотеки искать. Их подходящих нету. Это тебе не бабки в банке считать и не даже не САПР сопромутить. Здесь АСУТП а не сборище говнокода."
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.10.2015, 11:02
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Забудь все стандартные библиотеки
Если явно оговорено — претензий нет. В исходном задании ограничений не было.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 11:13
Цитата Сообщение от 0x10 Посмотреть сообщение
Если явно оговорено — претензий нет. В исходном задании ограничений не было.
Я к тому что велосепедизм штука полезная. Всегда находится 10% функционала из за которых приходится свое пилить, а не либу пользовать. Или как минимум что то свое допиливать. Сейчас к примеру сижу полностью перепиливаю борландовскую обертку WinHTTP, при том что штука обалденная. Одна беда - WebSocket туда не приделан и куки изнутрей не вытащить, чтоб отдельно сделанному сокету дать. вот и приходится полностью перепиливать.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.10.2015, 11:30
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А вызова они всегда штатным call или indirect call идут.
В схеме ТС с дословной реализацией автомата, никаких indirect call нету. Есть явно объявленная переменная состояния, определяющая какая ветка алгоритма будет выполнена и подменяющая собой штатный механизм call. И самопальный std::stack, подменяющий собой штатный механизм возврата. Я так понял, вы ратовали именно за это чудо-юдо. И да, вы в курсе что indirect call будет тормознутее call, из-за все того же предсказания переходов?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Какой процедуры сортировки? Ты о чем? Здесь не сортировка нужна а добавление в упорядоченный список с сохранением упорядоченности. Да кстати а в бусте что Ктулху автоматически сортировку вызывает?
Сортировка вставкой в отсортированный список, все равно остается сортировкой. Ну а вызывают ее потроха шаблона.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну сбросит L1 кеш инструкций. При L2 на борту не критично, а тем более при L3. Так же как при call, но ветку вычислений откатывать не придется.
Ну да, подумаешь, спекулятивное выполнение инструкций отвалилось, так как процессор не знает чего там спекулятивно считать надо. Главное что кеш на месте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.10.2015, 11:30

Не взяли на работу из-за неправильно выполненного тестового задания, посмотрите?
Привет. Устраиваюсь в одну контору на Junior Python 40 тыс.р до вычета. Сегодня ответили: “Бла бла бла…На данный момент не готовы...

Задание при приёме на работу
Всем привет! Мне дали на собеседовании задание по access. Я его до этого не изучал, а сейчас сижу и усиленно читаю мануалы для...

Тесты при приёме на работу
Какие примерно тестовые задания могут дать по ООП и по самому синтаксису языка PHP?

Задание при приеме на работу
Здравствуйте, уважаемые форумчане! При устройстве на работу получила перечень заданий, с большинством из которых уже справилась. Осталось...

Задача при приеме на работу
Офигенская задача, я ее давно услышал. Сейчас Вам повествую о ней Пришел один человек для приема на работу. Ему задают 4...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru