Тестовое задание на позицию разработчика Android C++

Вакансии

Лимасол, Кипр

Постановка задачи:

Необходимо разработать приложение для Android (минимальная версия Android — 5.0):

  1. Пользователь вводит URL текстового файла, указывает фильтр отбора строк и запускает загрузку (например, нажатие кнопки).
  2. Приложение подгружает файл, отбирает строки, удовлетворяющие фильтру, и отображает их в виде списка.


Принцип отбора строк:

Предполагается, что текстовый файл является текстовым ANSI-файлом (закладываться на UTF-8 не нужно).

Отбор строк осуществляется по условиям простейшего regexp: (как минимум операторы * и ?):

  • cимвол '*' - последовательность любых символов неограниченной длины;
  • cимвол "?" - один любой символ;
  • должны корректно отрабатываться маски: *Some*, *Some, Some*, *****Some*** - нет никаких ограничений на положение * в маске.


Результатом поиска должны быть строки, удовлетворяющие маске.

Например:

  1. Маска *abc*  отбирает все строки, содержащие abc и начинающиеся и заканчивающиеся любой последовательностью символов.
  2. Маска abc*  отбирает все строки, начинающиеся с abc и заканчивающиеся любой последовательностью символов.
  3. Маска abc?  отбирает все строки, начинающиеся с abc и заканчивающиеся любым дополнительным символом.
  4. Маска abc   отбирает все строки, которые равны этой маске.


Требования к реализации:

  1. Отбор строк должен быть реализован на С++ в составе отдельного класса. Класс не будет расширяться и не будет базовым классом. Единственная задача: сканирование и поиск текстовых строк. При реализации С++ части запрещено использование сторонних библиотек и STL. В частности запрещено использовать <regex> и <ifstream>. Весь парсинг должен быть реализован на С++.

    Класс должен иметь следующий публичный интерфейс:

    class CLogReader
      {
    public:
               CLogReader(...);
              ~CLogReader(...);

       bool    SetFilter(const char *filter);   // установка фильтра строк, false - ошибка

       bool    AddSourceBlock(const char* block,const size_t block_size); // добавление очередного блока текстового файла
      };

    Способ передачи результирующих строк в Java остаётся на усмотрение автора.

  2. Размер исходного текстового файла (и, возможно, результатов) может быть от сотен мегабайт.
  3. Для реализации загрузки и отображения данных должен использоваться Java. Использование Kotlin запрещено.
  4. Затраты памяти должны быть минимальны (в разумных пределах).
  5. Результаты парсинга должны писаться в файл results.log в каталоге приложения.
  6. Результат должен быть представлен в виде списка (ListView), который должен наполняться во время парсинга по мере нахождения новых строк, удовлетворяющих условию. Должна быть возможность выделить одновременно несколько строк с последующим их копированием в буфер обмена.
  7. Интерфейс не должен блокироваться (приводить к ANR) во время скачивания и обработки данных.
  8. Код должен быть абсолютно «неубиваемым» и защищённым от ошибок.


Требования к оформлению:

  1. Код должен быть максимально простым.
  2. Код должен быть максимально чистым, красивым и понятным.
  3. Результатом должен быть готовый проект приложения в Android Studio, помещённый в ZIP-архив.