Barnaul Enterra Campus Match Описание работы с наноботом

advertisement
Barnaul Enterra Campus Match
Описание работы с наноботом Herbert
Введение
Участие в Barnaul Enterra Campus Match состоит в программировании нанобота по имени
Herbert. Тебе надо будет составлять небольшие по объему программы для управления этим
наноботом. Чем проще и чем элегантнее будет твой код, тем больше очков ты заработаешь.
Ты можешь работать над своими решениями в течение всего периода Barnaul Enterra Campus
Match. Каждый раз при закрытии Herbert твои текущие решения будут загружаться на сервер
Campus Match. Каждый раз при запуске Herbert заново твои решения будут загружаться, и ты
будешь продолжать свою работу с того же места, на котором закончил. В итоге к
рассмотрению принимается твой лучший результат, поэтому ты можешь смело
экспериментировать со своими решениями!
Herbert требует подключения к Интернет при его запуске и завершении, для того, чтобы
скачивать и закачивать на сервер твои решения.
Правила игры с Herbert
Campus Match состоит из 25 уровней. На каждом уровне расположено несколько белых
кнопок — для того, что пройти уровень тебе надо нажать все белые кнопки. Тебе надо
запрограммировать нанобота Herbert, используя язык программирования "h" так, чтобы он
нажал на все белые кнопки. При этом надо обходить встречающиеся на пути стены и избегать
нажатия на серые кнопки (стены не дают пройти Herbert, а серые кнопки сбрасывают все
нажатые белые кнопки в их первоначальное состояние). Азарт состоит в том, что на каждом
уровне тебе выделяется определенное количество байт и длина твоей программы не должна
превышать это число. Это ограничение не столь критично для начальных уровней, в которых
цель — написать программу, которая работает. Однако для прохождения более сложных
уровней тебе придется писать более изящные, хорошо продуманные и маленькие
программы. На каждом уровне очки начисляются за каждую нажатую белую кнопку, бонус
предоставляется за прохождение уровня, и дополнительные очки начисляются, если размер
программы меньше, чем выделенное количество байт на данном уровне.
Язык "h"
Barnaul Enterra Campus Match
Программирование Herbert осуществляется с помощью простого, но мощного языка "h". "h"
содержит традиционные элементы современных языков программирования высокого уровня:
операторы, процедуры, параметры, аргументы и рекурсию. Однако, язык программирования
"h" имеет более простой синтаксис и содержит некоторые особенности (процедурные
аргументы), которые отличают его от других языков программирования.
Ниже перечислены базовые элементы языка "h":
Элемент
Синтаксис
Пример
Оператор
s (go straight — сделать шаг вперед), r (turn right — повернуть s
направо), l (turn left — повернуть налево), вызов процедуры или
параметр процедуры
Определени x[(P1,P2,...,Pk)]:y1y2y3...yn, где x — любая строчная буква a:ssss
е процедуры латинского алфавита (кроме s, l и r), Pi — параметр, yi — любой b(C,D):sra(B)
оператор, 0 <= k <=15 и n >= 0. Если k = 0 (нет параметров), то C
скобки не используются.
Параметр
X, где X — любая прописная буква латинского алфавита
A
Выражение
[-] X [(+ or -) X [(+ or -) X [(+ or -) X ... ]]], где каждый X — 5
числовой параметр или число.
A-5
-A-B-C+1
Аргумент
Любое число, выражение или последовательность нуля или 4
более операторов
rsr
A-1
Вызов
процедуры
x[(a1,a2,...,ak)], где x — имя процедуры и ai — аргумент (по a(1,B-1,srs)
одному для каждого параметра). Если k = 0 (нет параметров), то b
скобки не используются. Вызов не осуществляется, если любой
числовой аргумент равен нулю или меньше.
Рекурсия
x[(P1,P2,...,Pk)]:y1y2y3...ymx[(a1,a2,a3,..,ak)]ym+1ym+2ym+3...yn a(A):sa(A-1)
, где x — любая строчная буква латинского алфавита (кроме s, r b:sssrb
и l), Pi — параметр, ai — аргумент, yi — любой оператор, 0<=
k <= 15, m >= 0 и n >= 0.
Главная
процедура
y1y2y3...yn, где yi — любой оператор и n >= 1.
sa(1,rsr)r
Программа
<определение процедуры>
:
:
<главная процедура>
a:ssssra
sssa
Байт
Любая строчная или прописная буква латинского алфавита или s
Barnaul Enterra Campus Match
любое число
A
123
Тест-драйв
В данном руководстве мы научимся программировать на "h" путем написания программы,
которая заставит нанобота Herbert ходить по траектории "квадрат". Мы начнем с самого
простого решения, а затем покажем, как процедуры и параметры могут быть использованы
для упрощения и/или обобщения нашего решения.
Наша первая задача — заставить Herbert ходить по квадрату со стороной в 5 единиц, и в конце
остановиться в начальной позиции в начальном направлении.
Загрузи Herbert.exe, зайди под свои аккаунтом, который ты зарегистрировал на сайте
http://www.wildnoodle.com/ic2008campus/UI/home.aspx , и выбери категорию "Tutorial".
Категория "Tutorial" состоит из одного уровня (уровень № 0), на котором нет кнопок и
препятствий. Зайди в меню "Options", включи "Trace" и убедись, что "Path" включен — так ты
лучше поймешь, что твоя программа делает. В любое время ты можешь изменить скорость
передвижения Herbert, перемещая скроллбар, который находится внизу окна. Для того чтобы
лучше управлять процессом отладки, ты можешь прервать выполнение твоей программы в
любое время, нажав "Halt" из меню "Run", нажав кнопку "Halt (Pause)" на панели
инструментов или нажав левой кнопкой мыши по полю с текстом программы. Ты также
можешь поставить | (точку останова, или breakpoint) в любой части программы, где ты хочешь
остановиться. Когда твоя программа остановлена, ты можешь начать исполнять ее по шагам
("Step" в меню "Run" или на панели инструментов), продолжить выполнение ("Resume") или
переместить Herbert в начальную точку ("Reset").
Напиши следующий код в поле текста программы:
sssssrsssssrsssssrsssssr
Нажми "Go" в меню "Run". Команда "s" заставляет Herbert сделать шаг вперед, "r" заставляет
его повернуть вправо на 90°, "l" заставляет его повернуть налево. Herbert понимает только
эти три команды.
Нажми "Reset" из меню "Run" (или просто продолжай редактировать текст программы, тогда
Herbert вернется в начальное состояние автоматически) и набери в поле текста программы
следующее:
a:ssssr
aaaa
Здесь мы определили процедуру с именем "a", которая выполняет команды "ssssr" при
каждом своем вызове. Вызывая ее 4 раза подряд, мы достигли того же результата, что и в
нашей первой программе. Но теперь наша программа стала меньше — 11 байт против 24!
Любая строчная буква латинского алфавита является корректным именем процедуры (кроме
"s", "r" и "l", которые уже кое-что значат для Herbert).
Еще более простое решение нашей задачи будет таким:
a:ssssra
Barnaul Enterra Campus Match
a
В данном примере "a" выполняет "ssssr", как и раньше, а затем вызывает себя (что приводит к
выполнению "ssssr" и вызову опять-таки себя...). Это пример бесконечной рекурсии — Herbert
не остановится, когда нарисует свой квадрат. В этом нет ничего страшного, т.к. стек Herbert
бесконечен. Ты можешь остановить его, выбрав команду "Halt" из меню "Run". Ты можешь
ограничить глубину рекурсии для того, чтобы Herbert мог сделать что-то еще после того, как
нарисует квадрат. Для этого тебе нужно использовать параметр:
a(A):sssssra(A-1)
a(4)
Параметром может являться только прописная буква латинского алфавита. Когда происходит
вызов процедуры с параметром, ты должен предоставить аргументы для каждого параметра
(в данном примере аргументом для "A" сначала является 4, затем 3, затем 2 и т. д.). Правила
языка "h" таковы, что если любой числовой аргумент становится 0 или меньше, то
дальнейший вызов не производится.
Ты также можешь использовать второй параметр для того, чтобы изменять длину стороны
квадрата:
a(A,B):f(B)ra(A-1,B)
f(A):sf(A-1)
a(4,5)
Теперь измени "5" на "8" и посмотри, что изменится. Обрати внимание на процедуру "f" ("f"
значит "forward") в данном примере — она очень важна и будет часто появляться в твоих
дальнейших решениях.
Помимо чисел параметрами могут быть и процедурные аргументы.
a(A,B,C):f(B)Ca(A-1,B,C)
f(A):sf(A-1)
a(4,5,r)
Теперь попробуй изменить "r" на "l".
А теперь запускай Herbert.exe, заходи под своим аккаунтом, выбирай категорию “Campus
Match” — и выигрывай!
Download