Введение
Всем известно, что вероятность успешного перемещения по полю астероидов составляет примерно 3720 к 1. Но, несмотря на ваше предупреждение, Хан Соло все еще хочет попытать счастья.
Опасаясь за свою искусственную жизнь, вы решаете закодировать на своеобразном диалекте корабля ( читай: предпочитаемый вами язык Code Golf ) программу избегания астероидов, которая решит, какой путь выбрать в лабиринте ASCII поля астероидов.
вход
Millenium Falcon имеет программу картирования астероидного поля, которая дает данные, подобные этим:
| ##### ######### |
| ###### # ### # |
| # # # # #### # |
@ ## ####
|# # # ### ## |
|## ## #### # # |
|#### ##### # ## |
Верхние ряды слева от Сокола, нижние ряды справа от Сокола, а столбцы представляют то, что находится перед кораблем.
- Каждый
#
является препятствием. - Каждое пространство - это пустое пространство, в котором корабль может летать.
- Ввод всегда 7 символов в высоту. Это предел ширины карт астероидов.
- Длина ввода всегда 32 символа (30 для самого поля и 2 для начального и конечного пределов). Это предел глубины отображения астероидов. Вертикальные полосы
|
отмечают начало и конец отображения. @
это сокол Он всегда находится в среднем ряду (4-й ряд) и в первом столбце ввода.- Пространство, оставленное в вертикальных полосах в последнем столбце, является местом, куда должен прибыть корабль. Он всегда находится в среднем ряду (4-й ряд) и последнем столбце ввода.
Входные данные могут быть приняты в виде многострочной строки, массива строк, из STDIN или параметров функции, или считаны из файла.
Возможные маневры
Вас преследуют TIE-Fighters, поэтому вы всегда должны идти вперед. Таким образом, существует три способа, которыми корабль может летать на каждом этапе:
-
Вперед/
Вперед и поверните налево\
Вперед и поверните направо
Например, это допустимые пути:
@---
--
/ \ /
@ -
-
/ \
/ \
@ \
Как видите, в каждом столбце всегда ровно один ход. Сокол - кусок хлама, поэтому он не может совершать насильственные повороты. Это означает, что ходы, такие как /\
или \/
не разрешены . -
Между двумя противоположными поворотами должен быть хотя бы один чистый вперед . С другой стороны, поворот в одну сторону для нескольких шагов подряд возможен, как показано выше.
Сокол падает, если одно движение приводит корабль к тому месту, где находится препятствие. Например, эти шаги приводят к сбоям:
@-#
@
\
#
#
/
@
Обратите внимание, что это не сбой:
@-#
\
-
Выход
Вы должны вывести то же поле астероидов ASCII, с правильным путем до конца. Сокол должен быть напечатан в конечной точке вместо начальной точки.
Например, допустимый вывод для приведенного ранее примера ввода будет:
| ##### ######### |
| ###### #-------- ### # |
| # # #/ # ####\ # |
--------- ## \ #### ----@
|# # # ### \ ## / |
|## ## #### \ #/ # |
|#### ##### #-- ## |
Ваш путь должен только не сокрушить сокола. Это не должен быть кратчайший путь.
Можно предположить, что всегда будет хотя бы один возможный путь до конца.
Вы можете вывести в STDOUT, в файл или любой другой эквивалент, если поле астероида напечатано точно так же, как в этом посте (например, вывод списка координат для пути недопустим).
Контрольные примеры
Нормальное астероидное поле
| ##### ######### | | ###### # ### # | | # # # # #### # | @ ## #### |# # # ### ## | |## ## #### # # | |#### ##### # ## |
Возможный вывод
| ##### ######### | | ###### #-------- ### # | | # # #/ # ####\ # | --------- ## \ #### ----@ |# # # ### \ ## / | |## ## #### \ #/ # | |#### ##### #-- ## |
Гиперрегулярное астероидное поле
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | @ # # # # # # # # # # # # # # |# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # |
Возможный вывод
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | -# #-# #-# #-# #-# #-# #-# #--@ |#\#/#\#/#\#/#\#/#\#/#\#/#\#/# | | #-# #-# #-# #-# #-# #-# #-# #| |# # # # # # # # # # # # # # # |
Ядро звезды смерти
| # # # # | | # # # | | # # # # # | @ # # # # # | # # # # | | # # # # # | | # # # # |
Возможный вывод
| # # # -- # | | --- # # / #\ - | | / #\ # # / # \ /#\ | - # \ # #/ # - # ----@ | # \ # ---- # # | | # \#/ # # # | | # - # # # |
Траншея Звезды Смерти
|##############################| |##############################| |##############################| @ |##############################| |##############################| |##############################|
Выход
|##############################| |##############################| |##############################| ------------------------------@ |##############################| |##############################| |##############################|
Астероидная пещера
|### ##########################| |## # ############### ## ######| |# ### ######## ### ## # #####| @ ###### ###### ### ## ### |######## ### ### ## #########| |########## # ### ## ##########| |########### #####|
Возможный вывод
|###-##########################| |##/#\############### ##-######| |#/###--######## ### ##/#\#####| -######\###### ### ##/###-----@ |########--### ### ##/#########| |##########\# ### ##/##########| |###########-------- #####|
счет
R2D2 занят плаванием в болотах, поэтому вам придется самостоятельно программировать контроллер Falcon, что утомительно. Поэтому самый короткий код выигрывает .
-
на пути на каждом повороте, который определяется как «движение вперед». Но фактические ходы - всегда два диагонали налево, сопровождаемые двумя диагональю направо.Ответы:
JavaScript (ES6), 186
201Запускаемый фрагмент:
Эта функция принимает одну строку с символами новой строки. Функция разбивает строку на массив, используя
...
оператора и получает индекс для(x,y)
координат по(33 * y) + x
.Функция выполняется рекурсивно, проверяя различные возможные ходы для каждого пробела. Когда он сталкивается с препятствием, он возвращает ложное значение, а когда он достигает конечной цели, он возвращает
true
. (В коде игры в гольф этоtrue
создается!console.log(...)
.)Обратите внимание, что этот код не использует длинные серии поворотов вправо, а акцентирует их прямыми движениями. То есть он делает второй вариант ниже, а не первый:
Это кажется законным, поскольку
-
легально может прийти до или после поворота, так почему бы не оба сразу? Это выглядит особенно странно в конце, когда последний ход,\
но отображается как@
:Мой любимый гадкий хакерский глинг здесь - это спор по умолчанию
c=k=" "
. В аргументах(i,l,c=" ")
будет сказано «использовать строку" "
для,c
еслиf
не указан третий аргумент». Однако, делая этоc=k=" "
, мы говорим «еслиc
не предоставлено, сохраните" "
в глобальной переменной,k
а затем сохраните это значение вc
». Поскольку рекурсия начинается только с одного аргумента,k
она всегда инициализируется при первом вызове функции.Слегка разряженный
источник
" "
в переменной), что привело к еще большему снижению моей оценки.С (полная программа),
249247235 байтЭто полная программа, считывающая входные данные из файла и выводящие результат в стандартный вывод. Имя файла передается программе в качестве параметра.
Ungolfed:
Выход:
источник
-
сопровождаемое\
, но\
прикрываются самым@
. (Моя программа делает то же самое.)Common Lisp, 303 байта
Мне было очень весело с этим испытанием, это первое задание Codegolf, которое я сделал. В основном есть простая рекурсивная функция, которая пробует каждое жизнеспособное движение, пока не будет достигнута конечная позиция.
Golfed / Минимизированный
Читает ввод из файла я в рабочем каталоге. Я уверен, что еще есть возможности для улучшения.
Простой код
Образец вывода
источник
ActionScript 3, 364 байта
Я разделил это на две функции; один, чтобы изменить массив в массив массивов, и один рекурсивный, чтобы вычислить траекторию полета.
Необработанная версия в программе с определенным одним образцом астероидного поля:
источник