Основы программирования покемонов


#1

Сегодня спрашивал в своей подгруппе, кто играет в Покемон Го: отозвался, кажется, один человек, что повергло меня в глубокое уныние. И я решил предложить студентам первого курса такую задачу на операцию div.

Развитие каждого покемона описывается одной из двух стадий: базовой или продвинутой. Можно переходить из базовой стадии в продвинутую, если собрать определённое количество конфет. Переход происходит не сразу, а когда этого пожелает игрок. При этом во время совершения перехода одну конфету возвращают обратно. Предположим, что игрок накопил C конфет и собирается развивать покемонов базовой стадии, которым для этого требуется по E конфет каждому. Считая, что запас покемонов базовой стадии не ограничен, требуется составить программу для вычисления количества покемонов, которые будут развиты до продвинутой стадии при заданных C и E.

Пример. Для развития покемона Пиджи (базовая стадия) в Пиджеотто (продвинутая стадия) требуется 12 конфет. Игрок собрал

  • 23 конфеты — ответ: 2 покемона,
  • 22 конфеты — ответ: 1 покемон.

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

Ограничение. В решении разрешается использовать только целочисленные операции и вспомогательные переменные. В частности, запрещены условный оператор и операторы цикла.

Замечание. Моё описание несколько упрощено по сравнению с реальной игрой.


(1 курс ФИИТ) CS101. Основы программирования — практика
#2

Вроде бы вот так работает:

begin

    Write('Введите количество конфет (С) и стоимость перехода (Е): ');
    WriteFormat('{0} покемон(а)(ов).',
        (ReadInteger - 1) div (ReadInteger - 1));
  
end.

{
    Введите количество конфет (С) и стоимость перехода (Е): 34 12
    3 покемон(а)(ов).
}

Собственно, если возвращается одна конфета - мы ее заранее не будем отдавать. Только общую сумму уменьшим на единицу, чтобы учесть конечное вычитание, где нам все-таки придется выдать полное число Е.


#3

Отличная идея, спасибо! Видимо, всё верно.

По поводу оформления: я очень не рекомендую совмещать несколько функций Read внутри одного выражения, потому что читающему код неочевидно в каком порядке они будут выполняться.


#4

Я бы не рисковал - ReadInteger сработают не слева направо, а в произвольном порядке. Я могу даже сейчас специально компилятор исправить чтобы порядок выбирался случайный :slight_smile: По стандарту - можно.