Застревание на уровне «Exclusive Lounge» или «Vending Machine» в Human Resource Machine почти всегда связано с одной причиной: игрок пытается решить задачу «в лоб», не разбив её на цикл чтения, обработки и вывода. Игра от Tomorrow Corporation выстроена как упрощённый ассемблер: у вас есть лента входных данных (INBOX), лента вывода (OUTBOX), ограниченный набор ячеек на полу и несколько команд. Любой уровень решается, если сначала понять, какие данные приходят, а уже потом писать «программу».

Эта статья разбирает базовую механику игры, систему команд, типовые стратегии для сложных уровней и принципы оптимизации по числу шагов и команд. Материал подойдёт и тем, кто только запустил игру, и тем, кто хочет закрыть дополнительные испытания на минимальное количество инструкций.

Что представляет собой Human Resource Machine

Human Resource Machine — головоломка, в которой вы управляете офисным работником, выполняющим инструкции из написанной вами программы. Каждый уровень ставит задачу: например, скопировать все элементы из INBOX в OUTBOX, сложить пары чисел или отсортировать последовательность. Задача решается перетаскиванием команд в список инструкций — по сути, вы пишете программу на визуальном языке, похожем на ассемблер.

Игра вышла на ПК и ряде других платформ и позиционируется как обучающая: она знакомит с базовыми концепциями программирования — циклами, условными переходами, работой с памятью — без необходимости знать реальный язык. Продолжение, 7 Billion Humans, развивает те же идеи, но с параллельным выполнением несколькими работниками.

💡

Human Resource Machine — это визуальный ассемблер: каждый уровень решается составлением программы из простых команд, а не подбором действий наугад

Базовые команды и как они работают

Набор доступных команд растёт по мере прохождения, но ядро остаётся неизменным. Понимание того, что делает каждая инструкция, важнее, чем знание готовых решений — с этим знанием любой уровень раскладывается на знакомые операции.

  • 📥 INBOX — взять следующий элемент с входной ленты. Если лента пуста, программа завершается.
  • 📤 OUTBOX — положить содержимое рук на выходную ленту.
  • 📋 COPYFROM / COPYTO — скопировать значение из ячейки на полу или записать его в ячейку.
  • ADD / SUB — прибавить или вычесть значение ячейки из числа в руках.
  • 🔀 JUMP — безусловный переход на метку, основа циклов.
  • JUMP IF ZERO / JUMP IF NEGATIVE — условные переходы, позволяющие строить ветвления.

На более поздних уровнях появляются BUMPUP и BUMPDN (инкремент и декремент значения в ячейке), что упрощает счётчики. Точный состав команд на конкретном уровне виден в панели инструкций — игра сама ограничивает набор, и это часто является подсказкой к задуманному решению.

Как подходить к решению уровня

Рабочий метод — сначала проанализировать входные данные, и только потом писать код. Посмотрите, что лежит на ленте INBOX: пары чисел, буквы, чередующиеся значения. Определите, что должно попасть в OUTBOX. Затем сформулируйте алгоритм словами: «беру два элемента, складываю, вывожу, повторяю». Только после этого переносите его в команды.

Типовой каркас большинства решений — бесконечный цикл: метка в начале, команда INBOX, обработка, OUTBOX, переход JUMP обратно на метку. Программа завершится сама, когда входная лента опустеет. Этот паттерн стоит освоить первым — он покрывает большую часть уровней игры.

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

Типовые стратегии для сложных уровней

Уровни со сравнением чисел (вывести большее из двух, отфильтровать отрицательные) решаются через SUB и условный переход: вычтите одно число из другого и проверьте знак результата через JUMP IF NEGATIVE. Это ключевой приём всей второй половины игры.

Задачи на умножение и деление выполняются через циклы сложения и вычитания, поскольку отдельных команд умножения в игре нет. Например, умножение — это повторное сложение числа с самим собой заданное количество раз, где счётчик итераций хранится в ячейке и уменьшается через BUMPDN. Сортировки и реверсы последовательностей требуют аккуратной работы с ячейками памяти как с массивом.

📊 Что для вас самое сложное в Human Resource Machine?
Условные переходы и ветвления
Циклы со счётчиками
Оптимизация по числу команд
Уровни на сортировку и строки
Подсказка по уровням со строками

Буквы в игре — это числа. Сравнение и копирование символов работает теми же командами ADD/SUB и условными переходами, что и с числами. Если застряли на строковом уровне, мысленно замените буквы на их коды и решайте как числовую задачу.

Оптимизация: размер программы и число шагов

Каждый уровень имеет два дополнительных испытания: уложиться в лимит размера программы (число команд) и в лимит шагов выполнения. Эти цели часто противоречат друг другу: короткая программа с циклом может выполняться дольше, чем развёрнутая последовательность команд.

ПриёмЧто даётКогда применять
Развёртывание циклаМеньше шагов выполненияКогда лимит шагов не достигается с циклом
Объединение ветокМеньше командКогда две ветки заканчиваются одинаковыми действиями
Переиспользование ячеекЭкономия памяти и командКогда значение ячейки больше не нужно
Замена ADD цепочкой на циклКомпактный кодПри повторении однотипных операций

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

💡

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

Частые ошибки новичков

Самая распространённая ошибка — забыть, что после OUTBOX руки пустеют. Если следующая команда ожидает значение в руках, программа упадёт. Вторая типичная проблема — условный переход, проверяющий не то значение: JUMP IF ZERO смотрит на то, что в руках, поэтому перед проверкой нужно заново взять требуемое число через COPYFROM.

⚠️ Внимание: метки переходов не выполняются как команды, но занимают место в логике программы. Если программа «прыгает не туда», проверьте, не стоит ли метка внутри ветки, которая должна её пропускать — это классический источник бесконечных циклов.

  • 🔄 Бесконечный цикл без выхода — проверьте, что INBOX стоит внутри цикла и завершит программу при пустой ленте.
  • ✋ Использование пустых рук — после OUTBOX или COPYTO значение нужно взять заново.
  • 🧮 Проверка знака не той величины — перед условным переходом убедитесь, что в руках именно результат вычитания.

Достижения и дополнительные испытания

Помимо основной линии уровней, в игре есть побочные ветки повышенной сложности и скрытые испытания. Они требуют нетривиального применения уже знакомых команд — например, построения счётчиков или обхода ограничения на число ячеек. Проходить их имеет смысл после завершения основной кампании, когда все команды уже освоены.

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

Связь с реальным программированием

Модель Human Resource Machine близка к архитектуре с аккумулятором: «руки» — это регистр-аккумулятор, ячейки на полу — оперативная память, JUMP — машинные переходы. Навыки из игры напрямую переносятся на понимание ассемблера и низкоуровневой логики.

FAQ: частые вопросы по Human Resource Machine

Что делать, если решение работает на первом наборе данных, но уровень не засчитывается?

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

Как выполнить умножение, если такой команды нет?

Умножение реализуется циклом сложения: храните множитель-счётчик в ячейке, уменьшайте его через BUMPDN и на каждой итерации прибавляйте второе число к результату. Цикл завершается, когда счётчик достигнет нуля — это проверяется через JUMP IF ZERO.

Нужно ли проходить испытания на размер и шаги одновременно?

Нет, испытания засчитываются независимо. Обычно проще сделать два разных решения: компактное для лимита команд и развёрнутое для лимита шагов.

Чем Human Resource Machine отличается от 7 Billion Humans?

В 7 Billion Humans программу выполняют одновременно несколько работников, поэтому добавляются задачи на синхронизацию и параллелизм. Базовый набор команд и логика при этом остаются похожими — опыт первой игры напрямую помогает во второй.

Игра подходит тем, кто вообще не знает программирования?

Да, игра рассчитана на новичков и вводит команды постепенно. Первые уровни объясняют каждую инструкцию, а сложность растёт плавно. При этом опытным программистам интересны испытания на оптимизацию.