Когда я был мальчиком, дети ходили в компьютерные магазины и играли в «Охоту на вумпа», пока персонал не выгнал нас. Это была простая игра, программируемая на домашних компьютерах середины 1970-х годов, машины настолько зачаточные, что вместо микропроцессоров размером с микросхему, я думаю, у некоторых из них были настоящие микросхемы.
Давайте вспомним ту ушедшую эпоху, воспроизведя игру на современном оборудовании.
Игрок начинает игру в случайной комнате на карте икосаэдра (таким образом, всего имеется 20 комнат, связанных друг с другом как лица икосаэдра, и каждая комната имеет ровно три выхода).
Wumpus начинается в случайно выбранной другой комнате. Wumpus воняет, и его запах может быть обнаружен в любой из трех комнат, прилегающих к его месту, хотя направление запаха невозможно определить игроку. Игра сообщает только «ты чувствуешь запах гумуса».
Игрок несет лук и бесконечное количество стрел, которые он может в любой момент выстрелить в комнату перед собой. Если wumpus находится в этой комнате, он умирает, и игрок выигрывает. Если wumpus не было в этой комнате, он поражен и перемещается случайным образом в любую из трех комнат, связанных с его текущим местоположением.
Одна случайно выбранная комната (гарантированно не та, в которой начинается игрок) содержит бездонную яму. Если игрок находится в какой-либо комнате рядом с ямой, он чувствует легкий ветерок, но не понимает, из какой двери дул легкий ветерок. Если он входит в комнату с ямой, он умирает, а Вумпус побеждает. На ямку яма не влияет.
Если игрок входит в комнату Вумпуса или если Вумп входит в комнату игрока, Вумпус побеждает.
Игрок указывает число, на которое он смотрит, числом (1 = вправо, 2 = влево, 3 = назад), а затем действие (4 = стрелять стрелой, 5 = идти в указанном направлении).
В целях подсчета очков каждая игровая строка («Ты чувствуешь бриз», «Ты чувствуешь запах глыбы», «Твоя стрела ничего не попала» и т. Д.) Может считаться одним байтом. Не злоупотребляйте этим, чтобы скрыть код игры в тексте; это только для взаимодействия с игроком.
Вычтите 10% вашего байта для реализации мегабат, которые начинаются в случайной комнате, отличной от игрока (хотя они могут разделить комнату с вумпусом и / или ямой). Если игрок войдет в комнату с летучими мышами, летучие мыши перенесут игрока в другую случайно выбранную комнату (гарантированно не будет комнатой с ямой или вумпусом в ней), прежде чем вылететь в свое новое, случайное место. В трех комнатах, прилегающих к летучим мышам, слышен скрип, но игроку не сообщается, из какой комнаты исходит звук.
Вычтите 35% от вашего количества байтов для реализации графического интерфейса, который показывает карту икосаэдра и некоторую информацию о том, какая информация имеется у игрока о местоположении ямы, кочана и летучих мышей (если применимо), относительно игрок. Очевидно, что если wumpus перемещается или игрок перемещается летучими мышами, карту необходимо соответственно сбросить.
Наименьшее количество байтов, как настроено, побеждает.
ОСНОВНОЙ исходный код для версии игры (не обязательно соответствующей вышеприведенным правилам и, в любом случае, совершенно безглобной) можно найти на этом веб-сайте и, возможно, других.
источник
Ответы:
GolfScript, 163
Оценка получается путем подсчета байтов (290), сложения количества строк, используемых для взаимодействия с пользователем (6), и вычитания общей длины этих строк (133). Перевод строки являются частью строк и влияют на количество байтов.
Основные этапы
Портирован ответ professorfish в от Bash к GolfScript. Счет: 269
Выступал по предложениям Питера Тейлора в комментариях. Оценка: 250
Питер Тейлор реорганизовал весь мой код и помог мне сжать таблицу поиска. Счет: 202
Заменена таблица соответствия соседних комнат с математическим подходом. Оценка: 182
Рефакторинг ввода, вывода и функции, поддерживающей математический подход. Оценка: 163
Большое «Спасибо!» Идет к Питеру Тейлору за всю его помощь.
Как это работает
20 комнат представлены в виде вершин додекаэдра, которым присвоены номера от 0 до 19 следующим образом:
Чтобы найти комнаты, смежные с комнатой N, и расположить их по часовой стрелке, мы должны рассмотреть четыре случая:
Если N ≡ 0 mod 4 (синие вершины), смежные комнаты будут 19 - N , N + 2 mod 20 и N - 2 mod 20 .
Если N ≡ 1 mod 4 (зеленые вершины), смежные комнаты будут 19 - N , N - 4 mod 20 и N + 4 mod 20 .
Если N ≡ 2 mod 4 (желтые вершины), смежные комнаты будут 19 - N , N - 2 mod 20 и N + 2 mod 20 .
Если N ≡ 3 mod 4 (красные вершины), соседние комнаты: 19 - N , N + 4 mod 20 и N - 4 mod 20 .
источник
Q
с19rand 97+
; 2 в@
с97%3*&>
..., еще 1, вставляяQ
как{19rand 97+}2*:,\:H
, несколько путем замены|
на*
, что часто является лучшим способом сделатьif
.B
не имеет смысла, и я думаю, что с помощью стека можно устранить еще несколько переменных.256base 20base
(и, возможно, также исключить несколько +/- 97). Единственным недостатком является то, что это потребует непечатных символов.You were killed by the wumpus
без упоминания об отсутствии стрелки. Вот почему я добавлял в не красивой версии.2*2+
=>)2*
REV0 C ++ (Visual Studio для Windows) 405Ниже прохождение игры, демонстрирующее, что (при условии, что вы не начинаете прямо рядом с опасностью) с правильной игрой вы всегда можете выиграть. Игрок чувствует ветерок, поворачивается назад и делает полный цикл против часовой стрелки. Поскольку ему требуется ровно 5 ходов, чтобы снова почувствовать ветерок, он знает дыру справа и уходит как можно дальше. Точно так же, когда он чувствует запах кочерги, не зная, прав он или налево, он поворачивает назад и делает петлю по часовой стрелке. Ему нужно 5 ходов, чтобы снова почувствовать запах гумуса, поэтому он знает, что он слева, и стреляет с уверенностью.
Если бы он сделал петлю в другую сторону, он бы быстрее обнаружил вумпуса и знал, что он движется в том же направлении.
REV1 C (GCC на Cygwin), бонус 431-35% = 280,15Новые строки добавлены для ясности. Изменения от Rev 0 заключаются в следующем:
Большое спасибо @Dennis за рекомендацию компилятора GCC на эмуляторе Cygwin Linux для Windows. Этот компилятор не требует
include
s в программе rev 0, и он допускаетint
тип по умолчанию для переменных, иmain.
это изменяющий жизнь совет по игре в гольф!Кроме того, запуск в Linux означает, что
\f
курсор перемещается вниз без возврата каретки (в отличие от Windows, где он просто создает печатаемый символ). Это позволило значительно сократить оператор printf, который печатает доску.Несколько дополнительных советов от Денниса в комментариях, и один из моих: изменение условия при проверке, попала ли стрелка в зону:
if(q==w)
>if(q-w)
(..else .. перевернуто)Добавление графического дисплея, показывающего информацию, которую игрок знает о том, где выплавляется червяк / ощущается бриз, требующий 35% бонуса. (Я удалил старую версию отладки, которая показала точное положение wumpus и отверстия. Это можно увидеть в истории редактирования.)
REV2 C (GCC на Cygwin), бонус 389-35% = 252,85
Еще раз спасибо Деннису за рефакторинг моего кода:
Символ константы
m[]
заменен литералами (я не знал, что вы могли бы индексировать литерал.)Заполнение случайных чисел переменной стека (зависит от системы, некоторые системы рандомизируют распределение памяти в качестве меры безопасности).
Макрос с
puts
заменен на макрос сprintf
и дополнительным кодом, который должен выполняться, когда отображаемое сообщение помещается внутриprintf
аргументов (преимущество заключается в том, что printf не печатает последние несколько аргументов, если в строке формата недостаточно спецификаторов формата.)if
заменяется||
Расчет новой позиции игрока / wumpus, помещенного в новый макрос.
Сообщения о победе / поражении размещаются вне
while
цикла.if
заменен условным оператором.Использование условного оператора в строке для стрельбы стрелкой. Если игрок пропускает, это требует как распечатки сообщения, так и настройки положения wumpus. Деннис предложил несколько способов объединения
printf
и вычисления положения wumpus в одном выражении, но я выбрал один из моих собственных.printf
возвращает число напечатанных символов, которые дляYour arrow didn't hit anything\n
на 31 (11111 двоичным.) Итак,31&Q(w)==Q(w)
.Другим моим вкладом в это редактирование было устранение некоторых ненужных скобок.
Выход
Здесь игрок уже нашел, где находится Вумпус, но решает провести тщательное исследование, чтобы точно выяснить, где находится яма. В отличие от моей старой версии отладки, в которой было показано, где находились wumpus и яма на протяжении всей игры, здесь показаны только комнаты, в которых игрок посетил и почувствовал легкий ветерок (1), почувствовал запах wumpus (2) или оба (3). (Если игрок стреляет стрелкой и пропускает, переменная,
a
содержащая информацию о положении wumpus, сбрасывается.)ИКОСАЭДРОН ПРЕДСТАВИТЕЛЬСТВО
Примечание: этот раздел основан на версии 1
Моя звездная особенность! В моем коде нет графика. Чтобы объяснить, как это работает, смотрите карту мира ниже. Любая точка на икосаэдре может быть представлена широтой 0-3 и долготой 0-4 (или одним числом
long*4+lat
.) Линия долготы, отмеченная на карте, проходит только через те грани с нулем долготы, а линия широты проходит через центр граней с широтой ноль.Игрок может быть ориентирован на 3 возможных оси, которые представлены следующими символами: север-юг,
-
северо-восток-юго-запад,\
северо-запад-юго-восток/
. В любой комнате у него есть ровно один выход на каждую из доступных ему осей. На показанном дисплее игрок делает полный цикл по часовой стрелке. Как правило, по маркеру игрока легко определить, откуда он приехал и, следовательно, куда ему разрешено идти.Один случай, который немного труден для непосвященного глаза, является четвертым. Когда вы видите наклон в одном из этих полярных рядов, игрок вышел из полярной ячейки, ближайшей к внешнему концу наклона, и, как правило, обращен к экватору. Таким образом, игрок смотрит на юго-восток, и его варианты: 15 (юг, ячейка справа) 25 (север-восток, ячейка вверху) или 35 (север-запад, ячейка внизу).
Итак, в основном я сопоставляю икосаэдр с сеткой 5x4 с ячейками с номерами от 19 до 0 в порядке их печати. Движение делается путем сложения или вычитания из текущей позиции, в зависимости от широты и направления игрока, согласно таблице ниже.
Если игрок покидает нижнюю (западную) часть доски, он возвращается на верхнюю (восточную) сторону и наоборот, поэтому его позиция принимается по модулю 20. Обычно ходы кодируются в m [] путем добавления ascii 80 (
P
) к необработанному значению, дающему символы, показанные ниже, но принцип, любой кратный 20, может быть добавлен, не затрагивая операцию.Вход игрока (разделенный на 10 для удаления второй цифры) добавляется к его текущему направлению и берется по модулю 3, чтобы получить его новое направление. Это прекрасно работает в большинстве случаев. Однако есть проблема, когда он находится в полярной комнате и движется к полюсу. При сворачивании карты ниже будет ясно, что если он выйдет из комнаты, обращенной к «северо-востоку», он войдет в новый квадрат, обращенный к «юго-востоку», поэтому необходимо внести исправление. Это делается в строке
e=(d+i/10)*m[p%4]%3;
умножением наm[p%4]
. Первые четыре значения m [] выбраны так, что, помимо их функции, указанной выше, они также имеют характеристикуm[1]%3==m[2]%3==1
иm[0]%3==m[3]%3==2
. Это оставляет направление в одиночестве для экваториальных комнат и применяет необходимую коррекцию для полярных комнат.Логическое время для исправления будет после переезда. Однако для сохранения персонажей это делается до переезда. Поэтому определенные значения в m [] должны быть транспонированы. Таким образом, последние 2 символов
LT
вместоTL
согласно таблице выше, например.НЕЗАКОННЫЙ КОД
это код rev 1, который менее запутан, чем rev 2.
Это будет работать на GCC / Linux. Я добавил в комментарии дополнительный код, необходимый для его запуска в Visual studio / Windows. Это большая разница!
ВОПРОСЫ И ЦЕНЫ
Я воспользовался тем, что упомянул @professfishfish, если wumpus и яма начинаются в случайных местах, игроку не нужно начинать в случайном месте. Игрок всегда начинается в комнате 19 лицом к северу.
Я понимаю, что, поскольку яма "не подвержена влиянию ямы", она может начинаться или входить в комнату, где находится яма. В целом это упрощает вещи, за исключением одного момента. У меня нет конкретной переменной, чтобы указать, что игра окончена; это заканчивается, когда игрок совпадает с Wumpus или ямой. Поэтому, когда игрок выигрывает, я отображаю сообщение о победе, но перемещаю яму игроку, чтобы выбить из цикла! Я не могу поставить игрока в яму, потому что там может быть wumpus, и я получу сообщение о wumpus, которое мне не нужно.
Программа rev0program отлично работала в Visual Studio, но IDE сказала "стек поврежден вокруг переменной i" при выходе. Это происходит потому , что зсапЕ пытается Погружает
int
вchar.
Деннис сообщил некорректное поведение на своей машине Linux из - за этого. В любом случае это исправлено использованием правильного типа в Rev 1.Строка для отображения доски в Rev 0 неуклюжа и выглядит немного иначе на других платформах. В
printf(" %c%c%c")
середине% c отображается печатный символ. Последний% c - это либо ASCII 0, либо ASCII 10 (\ n, новая строка с возвратом каретки в Windows.) В Windows отсутствует символ, работающий в консоли, который будет идти вниз по строке без возврата каретки. Если бы это было так, мне не понадобился бы первый символ c% (ASCII 0 или ASCII 9 до символа широты 1. Вкладки общеизвестно неопределены в своем поведении.) Начальное пространство улучшает форматирование (помещает символы широты 3 и 2 ближе к значению широты 1) .) Rev 1 имеет ревизию этой строки, которая использует символ \ formfeed и поэтому не нуждается в символе форматирования в начале printf. Это делает его короче, но \ f не работает в Windows.источник
scanf_s
наscanf
и включите,stdio.h
если я скомпилирую как C ++ чаще, чем C), но это не совсем подходит для меня. Например, если я иду налево, то возвращаюсь вправо в начале (15 35
), я нахожусь в другой комнате, чем та, в которой я начал.i
действительно проблема. Страница man говорит: « d Соответствует необязательному десятичному целому числу со знаком; следующий указатель должен быть указателем на int ». Изменение типа заставляет его работать просто отлично.NULL
на0
иscanf_s
сscanf
, вам не нужноint
раньше,main
и вы можете перемещатьсяi
иd
выходить за пределы основного (они по умолчаниюint
и инициализируются в0
). Кроме того, вы можете определитьp=19,h=rand()%p,w=rand()%p
, заменитьm[]
на*m
и должна быть возможность определить макрос для всех экземпляровif(...==...)puts(...);
.GolfScript, 269 символов
Обратите внимание, что 163 было вычтено из числа символов для жестко закодированных строк. Если вы хотите отладочный вывод с указанием номеров комнат, добавьте следующую строку сразу после первого появления
^
:Пример сеанса (с дополнительным отладочным выводом):
источник
{puts}:|;
, 5 символов путем заменыR
иW
с помощью-
и>
(позволяет исключить окружающие пространства) и 9 символов путем удаления'> 'print
(кажется, что вопрос не требуется).JavaScript (ECMAScript 6) -
21971759 -45% = 967,45 символовПочти закончил игру в гольф ...
Включает графический интерфейс с картой икосаэдра и мега-летучих мышей для полных бонусов.
X
(Яма);B
(мега-летучая мышь);W
(Вумпус); иP
(Ты).W
ИP
кнопки можно нажимать только в комнатах , прилегающих к вашему текущему местоположению.Код:
источник
Баш, 365 (первая рабочая версия 726!)
Догоняете с GOLFSCRIPT?
@Dennis в основном сделал все для меня в гольф. Благодарность!
Программа предполагает корректный ввод. Допустимый ввод - это направление, которое вы выбираете (1 для правого, 2 для левого, 3 для заднего), за которым следует ваше действие (4 для выстрела, 5 для ходьбы).
Некоторое объяснение
Я обычно делаю большие подробные объяснения, но это, вероятно, слишком сложно для меня, чтобы меня беспокоить.
Каждая вершина графа додекаэдра кодируется как буква (a = 1, b = 2, ... t = 20).
Стартовая позиция игрока всегда равна 20 (а они стоят спиной к 18), так как это само по себе не имеет значения, имеют значение только относительные позиции игрока, ямы и вумпуса.
Переменная
$p
хранит местоположение игрока.$r
сохраняет предыдущее местоположение игрока.$w
является wumpus и$h
(H для отверстия) является ямой.Код
История версий
grep -oE
переменную. Сохранено 5 символов.[a-z]{3}
переменную. Сохранено 3 символа.echo
переменную. Сохранено 5 символов.$m
.grep
и немного более разумно.C
как функция поиска регулярных выражений для использования в операторах if, а такжеE
как функция, печатающая «Ты убил глупца» и выходящая из нее.d
, и убрал лишние скобки.Пробный прогон
«In:» является входом, «Out: является выходом».
Игрок немного бродит, нюхает гнойник и стреляет. Они скучают, и глыба входит в их комнату и ест их.
источник
exit
всего на один байт длиннее,g=1
что исключает необходимость проверки ненулевыхg
и некоторыхelif
операторов. 2. Вы можете использовать((i==35))
вместо[ $i = 35 ]
и...&&...
вместоif ... then ... fi
. 3.q(){ L=({a..s});$j ${L[RANDOM%19]};}
иn=`$k $w$m<<<$d`;w=${n:RANDOM%2+1:1}
оба сохраняют несколько байтов.while :;do
...done
наfor((;;);{
...}
для экономии 3 символовd(){ x=npoemfgnshtoksblbtckpdpljqniorelgfhkbqraicadjaghimsmjtqecrdf;s=${x:3*30#$1-30:3};}
позволит вам заменить определенияs
иn
наd $p
иd $w
. Если , кроме того , определитьu=${s#*$r}$s
(и корректировать определенияl
иf
соответственно), вам не нужно будет$k
и$m
больше. Я думаю, что экономит 83 байта. Кроме того, место вq ()
не требуется.c(){ [[ $1 =~ $2 ]];}
и заменив, например, строку с последней на последнююc $r $b||{ $j You missed;d $w;w=${s:RANDOM%2+1:1};}
.b=$p
наd $p;u=u${s#*$r}$s
, строки послеread i
наy=${u:i/10:1};C $i 5&&{ p=$y;r=$b;}||{ d $w;C $y $w&&$j You killed the wumpus&&exit;$j You missed;w=${s:RANDOM%2:1};}
и избавившись от нихE()
.GolfScript (
206198)Наконец догнал версию таблицы поиска Денниса, из которой он заимствует совсем немного. Интересно, что в этой версии нет таблицы соответствия для планировки комнаты.
В 60 вращательные симметрии икосаэдра изоморфны знакопеременной группы по 5 букв, A_5. Попробовав всевозможные подходы к компактному представлению группы, я вернулся к самому простому: каждый элемент является перестановкой четной четности. Группа может быть сгенерирована из двух генераторов несколькими способами: подход, который я использую, использует генераторы
3
и3 1
. Они позволяют нам создавать1 = 3 3 1
,2 = 3 3 1 3 1
и3 = 3
.Обратите внимание, что это направление
3
соответствует элементу порядка 2, потому что, пройдя через дверь позади вас, эта дверь снова окажется позади вас. направление1
соответствует элементу порядка 5, идущему вокруг вершины икосаэдра. (Аналогично элемент2
). И эта комбинация3 1
имеет порядок 3, поскольку она вращается вокруг комнат, смежных с той, которая начинается позади вас.Итак, мы ищем перестановку порядка 2 для представления направления
3
и перестановку порядка 5 для представления направления,1
такого3 1
как порядок 3.Есть 15 перестановок порядка 2 в A_5, и для каждой есть 8 возможных перестановок для
1
(и, следовательно, для3 1
). Существует очевидная привлекательность[4 3 2 1 0]
для3
: изменение массива просто-1%
. Из его возможных сопутствующих перестановок3 1
я выбрал[0 1 3 4 2]
, что допускает довольно короткую реализацию как[~@]
.Ungolfed
источник
10/@3%=
пытается получить доступ к четвертому элементу массива длины 3, если на входе есть35
.9/3%@3%=
.9/
вместо10/
все еще работает, так что спасибо.Wumpus , 384 - 129 (строки) = 255 байт
Попробуйте онлайн!(Конечно, TIO не имеет большого смысла, потому что вы не можете использовать программу там в интерактивном режиме, и как только программа исчерпает инструкции на STDIN, она будет читать
0 0
, что эквивалентно3 4
, так что вы в конечном итоге стреляя стрелами, пока Wumpus не переместится туда или не убьет вас.)При локальном запуске убедитесь, что перевод строки после второго номера каждого входа сбрасывается (потому что Wumpus нуждается в этом, чтобы определить, что число закончено). В Powershell мне как-то нужно ввести еще один символ после перевода строки, чтобы он работал (не имеет значения, какой символ, но я просто использовал двойные переводы строки для тестирования).
Существует много возможностей для игры в гольф, но попытка совершенно новых раскладок занимает некоторое время. Окончательная оценка также во многом зависит от фактических строк, которые я использую, потому что в двумерном языке строка из N байтов имеет тенденцию стоить вам больше, чем N байтов исходного кода, потому что это накладывает значительные ограничения на компоновку кода, и вы часто нужно разбить его на несколько разделов (влекут за собой дополнительные двойные кавычки). В крайнем случае, если бы я сократил каждую строку до одной буквы (и от -129 до -12), я бы, вероятно, сэкономил бы тонну байтов.
объяснение
Во-первых, отказ от ответственности: несмотря на название языка, он не был разработан, чтобы сделать реализацию Hunt the Wumpus особенно простой. Вместо этого я спроектировал язык вокруг темы треугольников, в итоге получил структуру икосаэдра, и из-за этого решил назвать ее Wumpus.
Так что да, хотя Wumpus в основном основан на стеке, он также имеет 20 регистров, которые расположены вокруг граней икосаэдра. Это означает, что мы получаем структуру данных для бесплатного представления карты. Единственное, что мы не можем сделать легко, - это найти конкретные лица на икосаэдре, поэтому для их поиска нам нужно «повернуть d20», пока мы не окажемся на лице, которое ищем. (Это можно сделать детерминистическим способом, но это заняло бы намного больше байтов.) Поиск лиц, подобных этому, почти наверняка завершается (т. Е. С вероятностью 1), поэтому поиск, выполняемый вечно, на практике не является проблемой).
Приведенный выше код представляет собой версию этой первой реализации для гольфа с более разумным макетом:
Поскольку игра в гольф в основном заключалась в сжатии макета, я пока просто объясню эту версию (пока не добавлю какие-либо хитрости в игре в гольф, выходящие за рамки реструктуризации кода).
Давайте начнем с установочного кода:
Первоначально все лица установлены на 0 . Мы закодируем wumpus, установив 1-бит соответствующего лица, а яму - установив 2-бит. Таким образом, они оба могут находиться в одной комнате. Позиция игрока вообще не будет записана на икосаэдре, вместо этого он всегда будет активным лицом (одновременно активен только один из 20 регистров).
Теперь нам нужно найти случайное пустое лицо, чтобы вставить игрока.
В следующем разделе проверяется окружение игрока и выводятся соответствующие предупреждения:
Это цикл, который мы проходим 3 раза. Каждый раз, когда мы смотрим на правильного соседа, выводим соответствующие строки, если есть опасность, а затем поворачиваем икосаэдр на 120 °.
Следующий раздел читает два числа от игрока и затем или перемещает игрока или стреляет стрелой. Первое тривиально, последнее менее. Основная проблема при стрельбе из стрелки - это случай, когда она пропускает. В этом случае нам а) нужно отправиться на поиски wumpus, чтобы переместить его, а затем б) вернуться в комнату игрока и установить правильную ориентацию икосаэдра (чтобы «назад» осталось «назад»). Это самая дорогая часть всей программы.
Точка входа в этот раздел находится
I
слева.Фу, это была сложная часть. Теперь нам просто нужно проверить, умирает ли игрок, и начать все сначала через основной цикл:
Структура этого раздела по существу идентична структуре, которую мы использовали при проверке окружения игрока: мы проверяем 1-бит текущего лица (комната игрока), и если он установлен, мы печатаем
The wumpus ate you.
и завершаем программу. В противном случае, мы проверяем 2-бит, и он установлен, мы печатаемYou fell into the pit.
и завершаем программу. В противном случае мы достигаем2.
перехода, который возвращается к началу основного цикла (в координатах(0, 2)
).источник
awk - большой
Это оказалось не так коротко, как я надеялся, но я использовал немного другой подход к работе с графиком, поэтому я в любом случае выкладываю версию без заглядывания.
Я воспользовался тем фактом, что икосаэдр (20-сторонний многогранник) при ориентации, сохраняющей вращения, изоморфен чередующейся группе степени 5 (5-элементные перестановки, имеющие четное число циклов четной длины). Затем я выбираю две перестановки с длиной цикла 5 как «левая» и «правая», и я выбираю одну перестановку с длиной цикла 2 как «обратная». Используя их, я строю график из одной комнаты, идя по гамильтонову пути (2xRRRLLLRLRL, используя 3xRB в каждой комнате, чтобы захватить 3 возможных направления).
источник