Добавить комментарий

Тесты для программистов

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

Задача 1. Табло бегущей справа налево строки вмещает до 20 символов. Сама строка может иметь размер до 60 символов. Вывести на экран бегущую строку (достаточно одной прокрутки и печати последовательных состояний табло).

Programming test 1

Задача 2. Информационное табло размером 8х7 состоит из ячеек. Текстовая строка по-прежнему ограничена 60 символами. Требуется пошагово запустить строку по спирали, начиная с левой нижней ячейки вверх, пока она не дойдет до конечной ячейки. Вывести на экран финальное состояние.

Programming test 2

Мои решения приведены ниже, не сомневаюсь, что их можно улучшить. Программирование заняло около 20 минут на первой задаче и почти час на второй (решил оформить код как для учебного примера). Таким образом первая задача годна для любого короткого теста, вторая должна укладываться в полутора-двухчасовое интервью. Необязательно давать соискателю обе задачки, можно предлагать сделать любую на выбор.

Решение 1.

#include <iostream>
 
using namespace std;
 
const int MAX_STR = 60;
const int MAX_PANEL = 20;
 
typedef char Panel[MAX_PANEL + 1];
 
int main(int argc, char* argv[])
{
  Panel panel;
  for (int i = 0; i < MAX_PANEL; i++)
    panel[i] = ' ';
  panel[MAX_PANEL] = 0;
  char s[MAX_STR] = "This is a scrolling text test\x0";
  int len = strlen(s);
  for (int i = 0; i < len + MAX_PANEL - 1; i++)
  {
    for (int j = 0; j < MAX_PANEL - 1; j++)
      panel[j] = panel[j + 1];
    panel[MAX_PANEL - 2] = s[i];
    cout << panel << endl;
  }
  getchar();
	return 0;
}

Решение 2.

#include <iostream>
 
using namespace std;
 
const int MAX_STR = 60;
const int MAX_X   = 8;
const int MAX_Y   = 7;
 
enum Direction
{
  dirUp,
  dirRight,
  dirDown,
  dirLeft
};
 
int main(int argc, char* argv[])
{
  char s[MAX_STR] = "The quick brown fox jump over the lazy dog\x0";
  char t[MAX_X][MAX_Y];
  // Clear table
  for (int i = 0; i < MAX_X; i++)
    for (int j = 0; j < MAX_Y; j++)
      t[i][j] = ' ';
 
  int len = strlen(s);
  int lim_s = len > MAX_X * MAX_Y ? len - MAX_X * MAX_Y : 0;
  for (int i = len - 1; i >= lim_s; i--)
  {
     // Shift the spiral and push back the character
     Direction dir = dirUp;
     int x = 0, y = 0;
     int lim_x0 = 1, lim_x1 = MAX_X - 1;
     int lim_y0 = 0, lim_y1 = MAX_Y - 1;
     char prev = ' ';
     for (int j = 0; j < MAX_X * MAX_Y; j++)
     {
       char curr = t[x][y];
       t[x][y] = prev;
       prev = curr;
//       cout << j << ": " << x << ", " << y << " Lim: " << lim_x0 << ".." << lim_x1 << ", " << lim_y0 << ".." << lim_y1 << " Dir: " << dir << endl;
       switch (dir)
       {
         case dirUp:
           if (y == lim_y1)
           {
             dir = dirRight;
             lim_y1--;
             if (x < lim_x1)
               x++;
           }
           else
             y++;
           break;
         case dirRight:
           if (x == lim_x1)
           {
             dir = dirDown;
             lim_x1--;
             if (y > lim_y0)
               y--;
           }
           else
             x++;
           break;
         case dirDown:
           if (y == lim_y0)
           {
             dir = dirLeft;
             lim_y0++;
             if (x > lim_x0)
               x--;
           }
           else
             y--;
           break;
         case dirLeft:
           if (x == lim_x0)
           {
             dir = dirUp;
             lim_x0++;
             if (y < lim_y1)
               y++;
           }
           else
             x--;
           break;
       }
     }
     t[0][0] = s[i];
  }
  // Print string and table
  cout << s << endl << endl;
  for (int y = 6; y >= 0; y--)
  {
    for (int x = 0; x < 8; x++)
      cout << t[x][y] << " ";
    cout << endl;
  }
  getchar();
	return 0;
}