Форум программистов, компьютерный форум CyberForum.ru

Небольшое тестовое задание в финской компании. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.97
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 17:51     Небольшое тестовое задание в финской компании. #1
Привествую всех жителей форума.
Сразу отмечу, что решения просить не хочу, а просто хочу показать задание, которая давала компания суунто (Suunto, Finland) на должность программиста (кто не в курсе, компания занимается производством компьютеров для спортсменов, дайверов ... ) в далеком 2005 году.

Тема перенесена от сюда:
Удалить комментарии из строки

(кстати там же картинка - не могу опять ее же прицепить)

http://www.cyberforum.ru/attachment....p;d=1316092021

-----

кстати когда проходил там собеседование на программера задание было в написании парсера следующего (до сих пор храню)

(К сожалению оригинал задания не сохранился, да и толку от него нет -- он на финском.)

C++
1
2
3
4
"\n[[+-{$(width)}]{$(rows)}+"
"[\\n|[$(space){$(width)}|]"
"{$(rows)}]{$(height)}\\n]"
"{$(lines)}[+-{$(width)}]{$(rows)}+\\n"
Это строка
в строке:
[] - цикл
{число} количество повторений цикла []{10}, либо единичного сивола !{10}
пример: 1{5} = 11111
[12]{5} = 1212121212
[!] = !
[!]{0} = пусто
\x0000 - символ по хекс коду (\x0F0)
\x - экранированный символ (n, t, \, итд по списку + [] {} $)
$(переменная) переменная, получаемая ран-тайм. переменные могут передаваться в [] и {}
например count = 10
sym = !
[$(sym)]{$(count)} = !!!!!!!!!!
парсер должен из всего этого безобразия собрать строку
(результат в аттаче) принимая, что
"height" = 2;
"width" = 13;
"rows" = 10;
"lines" = 5;
"space" = пробел или что другое

Но! запрещены регулярные выражения, запрещен С++, запрещены функции типа strXXX. Только голый С, допускаются функции памяти (выделить/освободить) (статические буферы так же допускаются), указатели. На решение неделя.
----------------
Вдруг кому тоже интересно будет

Что будет не ясно, спрашивайте.

Тут сразу стоит отметить, что из 4 человек, которые, все ж, принесли задание на проверку никто не решил ее в полном объеме.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2011, 17:51     Небольшое тестовое задание в финской компании.
Посмотрите здесь:

работа с файлами + небольшое шифрование C++
C++ Небольшое задание по матрицам
C++ Небольшое исправление
C++ Небольшое исправление (2)
C++ Небольшое уточнение
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.09.2011, 21:05     Небольшое тестовое задание в финской компании. #21
silent_1991, а если читать переменную в обработчике простейших (у меня это lexema), и там же заменять на значение? Только lexema изменить и всё. Хотя, подводные грабли - это штука великая. Сейчас узнаем наверняка.

Добавлено через 13 секунд
Да, рекурсией
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.09.2011, 21:06     Небольшое тестовое задание в финской компании. #22
talis, тоже буду рекурсией делать.
Сейчас только начну))
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
15.09.2011, 21:33     Небольшое тестовое задание в финской компании. #23
Цитата Сообщение от Deviaphan Посмотреть сообщение
На брэйнфак немного похоже.) И такой же фак для брэйна.)))

А что значит strXXX? Я таких функций не знаю.)
strlen(), strchr(), strtok() ... и т.д.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.09.2011, 23:55     Небольшое тестовое задание в финской компании. #24
Блин, всё работает, проблема только с этим выражением:

$(space){$(width)}

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

[$(space)]{$(width)}

работает отлично. Причём если в первом варианте вместо переменной поставить просто символ, то работает без проблем...
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.09.2011, 00:22     Небольшое тестовое задание в финской компании. #25
Не знаю я, что не так. Вот как есть проект, потом ещё поковыряю.
Вложения
Тип файла: zip test_c.zip (4.9 Кб, 23 просмотров)
агерон
 Аватар для агерон
265 / 264 / 33
Регистрация: 12.10.2009
Сообщений: 1,030
16.09.2011, 01:14     Небольшое тестовое задание в финской компании. #26
ребята тут строиться дерево LL(1) (ну или LR(1), непомню точно) контекстно независимой грамматики а уж потом на его основе собирается результат. сейчас решать задачу влом если будет делать нечего дня через 2-3 постараюсь выложить решение
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.09.2011, 10:17  [ТС]     Небольшое тестовое задание в финской компании. #27
Не знаю я, что не так.
ну, а я говорил, что справишься.

Могу свой вариант выложить, если кому интересно.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.09.2011, 14:25     Небольшое тестовое задание в финской компании. #28
агерон, можно, конечно, и в эту степь углубиться, но язык тут настолько простой, что можно обойтись и без грамматик и специальных парсеров, а воспользоваться обычным рекурсивным спуском.

Добавлено через 55 минут
Кстати говоря, такой вопрос: можно ли использовать sprintf для более простого формирования строк?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.09.2011, 14:29  [ТС]     Небольшое тестовое задание в финской компании. #29
sprintf для более простого формирования строк?
в каком случае?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.09.2011, 14:29     Небольшое тестовое задание в финской компании. #30
villu, скажем, для формирования из var_name строки &(var_name).
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.09.2011, 14:31  [ТС]     Небольшое тестовое задание в финской компании. #31
аа, да можно. переменную можно хоть откуда брать. хоть из mysql базы
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.09.2011, 14:34     Небольшое тестовое задание в финской компании. #32
villu, не, я имею ввиду при парсинге. Т.е. переменная лежит в таблице переменных в виде пары имя-значение. Я при предварительном проходе заменяю все имена переменных их значениями (из таблицы), так вот, чтобы заменить в коде подстроку "$(var_name)" на значение из таблицы, мне надо из имени из той же ячейки таблицы сформировать соответствующую строку, т.е. в её начало дописать символы "$(", а в конец - ")". Можно ли для этого воспользоваться функцией sprintf в виде
C
1
sprintf("$(%s)", vars[i].name);
?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.09.2011, 14:37  [ТС]     Небольшое тестовое задание в финской компании. #33
ну а почему нет? таблица - это ж внешний фактор. Как туда попало значение переменной неважно.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.09.2011, 14:39     Небольшое тестовое задание в финской компании. #34
villu, речь не о таблице, а о запрете в задании на всё то, что помогает программисту и лишает его удовольствия изобретать велосипеды. Меня смущает запрет на использование элементарной strlen (аналог которой пишется в 30 секунд) и в то же время разрешение использовать такую мощную вещь, как sprintf (которая, по сути, представляет собой форматированный вывод не в поток, а в буфер).
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.09.2011, 14:47  [ТС]     Небольшое тестовое задание в финской компании. #35
я не понимаю тогда.
есть парсер, который заменяет одно на другое. чтоб это было возможно нужно это "другое" предоставить. в этом случае - это таблица. А как таблица сформирована не имеет значения.

Коллега, который делал через таблицу (лист структур), вообще заполнял руками прям в main().
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.09.2011, 14:50     Небольшое тестовое задание в финской компании. #36
villu, имеется ввиду не то, как была сформирована таблица, а можно ли после чтения из таблицы для формаирования необходимых кусков текст использовать sprintf, или всё нужно делать ручками.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.09.2011, 14:51     Небольшое тестовое задание в финской компании. #37
villu, забудьте о таблице))) Речь о рутинной работе формирования строки и о запретах на использование всего, что облегчает жизнь. При использовании sprintf формирование строки (которая является просто образцом для замены одного на другое) занимает одну строку, а если же sprintf нельзя использовать наряду с
Цитата Сообщение от villu Посмотреть сообщение
запрещены регулярные выражения, запрещен С++, запрещены функции типа strXXX
, то надо сначала в строку скопировать "$", затем "(", затем посимвольно имя переменной, а затем ")" и "\0".
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
16.09.2011, 14:53     Небольшое тестовое задание в финской компании. #38
Цитата Сообщение от silent_1991 Посмотреть сообщение
Можно ли для этого воспользоваться функцией sprintf в виде
Я думаю можно, но я тоже не понимаю как ты собираеьшся использовать printf в таком виде
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.09.2011, 14:55  [ТС]     Небольшое тестовое задание в финской компании. #39
а, в этом смысле. Не, "велосипеды и только велосипеды".
Хотя я тоже не вижу особого смысла извращаться.

я без этого делал. Но у меня не таблица, а колбек, который принимает строку (char*) и строку возвращает (char*).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2011, 14:56     Небольшое тестовое задание в финской компании.
Еще ссылки по теме:

Тестовое задание на Junior C++ dev C++
ООП. Тестовое задание собеседования. C++
C++ Тестовое задание для трудоустройства

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.09.2011, 14:56     Небольшое тестовое задание в финской компании. #40
fasked, да говорю же, просто сформировать строку замены. Т.е. в таблице имеется var_name, а в исходном коде брэйнфака надо заменить подстроку вида $(var_name) на значение. Вот и надо сформировать из var_name из таблицы строку $(var_name), чтобы в функцию замены (самописный велосипед) передать эту сформированную строку.
Yandex
Объявления
16.09.2011, 14:56     Небольшое тестовое задание в финской компании.
Ответ Создать тему
Опции темы

Текущее время: 00:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru