Простая проверка на компетентность программиста

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

Мне кажется, у меня получилось придумать интересную задачу для проверки такой способности у программистов. Мне кажется, ничего подобного я никогда не видел, или, по крайней мере прямо сейчас не помню, может кто-то напомнит.

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


Задание для программирования

Задача состоит из двух элементарных частей, и вся загвоздка, естественно, отнесена ко второй части.

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

  1. для этого должны случайным образом генерироваться два числа от 2 до 9 (фактически цифры);

  2. выводить такой случайный пример на умножение для решения второклассником;

  3. ждать ответа, или команды на завершение программы, если решили зациклить программу (пускай по нажатию клавиш "Enter" и "Esc" соответственно, суть совершенно не в этом);

  4. похвалить в случае правильного ответа или сообщить правильный результат в случае ошибки.

  5. Можно вывести статистику по завершении программы, но это не обязательное требование, это так сказать на пять с плюсом, в статистику можно включить среднее время на ответ, например, но это уже на 6+ (на шесть с плюсом по пятибалльной системе, но это все еще не суть, это не имеет отношения к заковырке запланированной во второй части задачи :).

Часть вторая, заковыристая

Тут мы подходим, неожиданно(!), к возможности расширения программы. А ведь, казалось бы, что же можно расширить в программе, которая уже может быть написана на "Шесть с плюсом" по пятибалльной системе?

И тут следует вот такое задание для второй части задачи:

необходимо расширить пункт 2 первой части задания разбивкой на подпункты, следующим образом:

2. выводить пример для решения второклассником

a.      на умножение

b.      на деление (целочисленное, по той же таблице умножения, все также для второклассника)

Но в таком виде разбор задания и его решения было бы через чур сложным для данной статьи. Разбор такого расширения требований к программе вместе с требованиями на оценку выше 5 баллов потребует еще одной статьи. Здесь я предлагаю разобрать простую замену пункта 2 на пункт 2 в виде:

2. выводить пример на деление для решения второклассником

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

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

Итак, по заданию из первой части,

1.     программа генерирует два случайных числа Х и У в заданных пределах, в любом языке есть соответствующая библиотечная функция генерации случайных чисел, с этим нет проблем!

2.     Запоминаем произведение (Х * У) в переменную Res;

3.     Программа выводит на экран переменные Х и У с помощью форматированной строки, например как-то так:

«7 * 3 = введите ответ ниже»

4.      Введенный ответ сохраняется в переменную Z и сравнивается с Res,

5.      По результатам сравнения выводим либо поздравление, либо правильный результат из Res.

 При попытке замены операции умножения на операцию деления там, где мы запоминаем произведение чисел, теперь это будет(?) частное от деления – то есть вместо

 Res  = (Х * У)

Кажется, нам просто нужно сделать

Res  = (Х / У),

но, оказывается, так это работать не будет (неожиданно?), потому что дроби второклассник знать совершенно не обязан! К тому же нам все равно придется изменить то, что называется гордо «интерфейс взаимодействия с пользователем» - заменить знак умножения на знак деления в строке, отображающей задание. Оказывается, программу (функцию) надо как-то переписывать, нельзя просто поменять умножение на деление! В этот момент начинающий программист (или некомпетентный?) понимает, что он пока еще (по крайней мере!) не совсем программист и начинает барахтаться в поисках подходящего варианта. В этой необходимости изменить программу и заключается заковырка, которая позволяет оценить компетентность программиста.

Я припоминаю попытки что-то изобретать с процедурой генерации случайных чисел у студентов, которым я задавал такую задачку и это было абсолютно ложное направление решения проблемы, которое я вынужден был пресечь как неконструктивное, когда вы знаете правильное решение (то есть не то, чтобы знаете – это решение, само собой разумеется).

Правильное решение

Очевидным является то, что не надо особо придумывать, как известно. Если не менять формулу:

Res  = (Х * У)

А просто вывести на экран вместо переменных Х и У, переменные Res и У (например, можно использовать Х) с помощью чуть измененной форматированной строки (заметим еще раз форматированную строку все равно придется менять!), например это будет выглядеть как-то так:

21 / 3 = введите ответ ниже

То далее еще придется изменить переменную для сравнения, вместо:

4. Введенный ответ сохраняется в переменную Z и сравнивается с Res,

Надо переписать (заменить переменную Res на Х)

4. Введенный ответ сохраняется в переменную Z и сравнивается с Х,

И все опять будет работать, но уже для примеров с делением.

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

Интересно было бы прочитать описания чего-то подобного (условно заковыристых задач и их решений) из чужой практики.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Смогли бы вы решить задачу-загвоздку самостоятельно?
53.85% Решил (как в статье) 7
0% Не решил 0
0% решил (свой вариант изложу в комментариях) 0
46.15% бестолковая, глупая,… плохая задача (почему, изложу в комментариях) 6
Проголосовали 13 пользователей. Воздержались 3 пользователя.
Источник: https://habr.com/ru/articles/745326/


Интересные статьи

Интересные статьи

Методический разбор для специалистов DataScience по применению критерия Дарбина-Уотсона для проверки автокорреляции средствами python
Имеется большое разнообразие языков программирования, но больше всего наши пользователи хотят, чтобы анализатор PVS-Studio поддержал один из самых популярных языков – Javascript. Одним из проектов, к...
Когда будут устранены все проблемы в программе?Как нам удалось это сделать?Когда ты уже сделаешь задачу?Вы будете на нас тренироваться?Почему программа постоянно тормозит?Когда вы начнёте...
Ребята, всем привет!!!Выдалась у меня свободная минута и решил я собрать небольшой гайд на прохождение собеседования по направлению программиста 3D графики для GameDev ко...
Привет! Меня зовут Денис Довженко, и я уже несколько лет провожу технические собеседования с кандидатами на позиции инженера-программиста C/C++. Если с кандидатами на позиции Senior SW Engineer и...