вход
- Бинарная матрица представляющая стены подземелья.
- Положение игрока в подземелье.
- Направление которым в данный момент сталкивается игрок (0 = север, 1 = восток, 2 = юг, 3 = запад)
Выход
Псевдо-3D представление стен, находящихся в поле зрения игрока, в виде ASCII-изображения символов.
Ниже приведены несколько возможных выходных кадров, а также соответствующая карта и компас, чтобы помочь им освоиться (но рисование карты и компаса не является частью задачи).
Спецификация
Поле зрения
Игрок имеет стен в его поле зрения, меченном от до . Ниже приведены положения стен относительно игрока (желтым цветом) во всех возможных направлениях.
Рисование стен
Предполагается, что стены должны быть нарисованы от до в этом точном порядке, учитывая, что любая ранее нарисованная часть может быть перезаписана более близкими стенами. Конечно, вы можете реализовать его по-разному, если конечный результат будет таким же.
Весь объем обращается с 7 различными символами: " "
, "'"
, "."
, "|"
, "-"
, "_"
и ":"
.
Поскольку детализация форм стен в теле этой задачи сделает его слишком длинным, вместо этого они представлены в следующей ссылке TIO:
Символы, которые не являются частью данной стены, отмечены значком на "?"
этих диаграммах. Они должны рассматриваться как «прозрачные» символы, которые вообще не рисуются. С другой стороны, все пространства внутри стены являются «сплошными» и должны перезаписывать любые другие символы, которые могли быть нарисованы ранее.
правила
О входе
- Вы можете использовать либо 0-индексированные, либо 1-индексированные координаты.
- Вы можете использовать 4 различных значения по вашему выбору для направления.
- Вы можете предположить, что по краям всегда будут окружающие стены.
- Игрок гарантированно находится на пустом поле.
- Вклад гарантированно будет действительным.
О выходе
- Стены должны быть нарисованы точно так, как описано.
- Тем не менее, формат вывода также гибкий: одиночная строка, массив строк, матрица символов и т. Д.
- Начальные и конечные пробелы приемлемы, если они последовательны.
Это код-гольф .
Контрольные примеры
Все контрольные примеры используют следующую матрицу:
[ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
[ 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 ],
[ 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1 ],
[ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 ],
[ 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ]
x=3, y=3, d=0
x=6, y=4, d=3
x=4, y=4, d=1
x=1, y=5, d=2
x=7, y=7, d=3
x=6, y=6, d=1
x=8, y=1, d=2
x=7, y=6, d=1
Ожидаемые результаты:
------------------------------ ------------------------------
x=3, y=3, d=0: x=6, y=4, d=3:
------------------------------ ------------------------------
__ __ '. .'
|'. .'| | |
| '.--------------.' | |----. |
| | | | | | '.--------. |
| | | | | | | | |
| | | | | | | | |
| | | | | | .'--------' |
| .'--------------'. | |----' |
__|.' '.|__ | |
.' '.
------------------------------ ------------------------------
x=4, y=4, d=1: x=1, y=5, d=2:
------------------------------ ------------------------------
.' __ ________________________ .'
| | |
-------. .----| | |
| '.--------.' | | | |
| | | | | | |
| | | | | | |
| .'--------'. | | | |
-------' '----| | |
| __|________________________|
'. '.
------------------------------ ------------------------------
x=7, y=7, d=3: x=6, y=6, d=1:
------------------------------ ------------------------------
'. '.
|'. |'.
| '. | '.
| | '. .- | |--.--------.--------.-
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '- | |--'--------'--------'-
| .' | .'
|.' |.'
.' .'
------------------------------ ------------------------------
x=8, y=1, d=2: x=7, y=6, d=1:
------------------------------ ------------------------------
'. __ '.
|'. .'| |
| '. .' | |----.--------------.-------
| | '. .' | | | | |
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '. | | | | |
| .' '. | |----'--------------'-------
|.' '.|__ |
.' .'
Связанная проблема:
Эта проблема 2013 года тесно связана. Но он имеет другой критерий выигрыша (вызов кода), гораздо более слабую спецификацию вывода и требует интерактивного ввода-вывода.
источник
Ответы:
Чистый (с Snappy ),
800785670644 байта460402 байта кода +360242-байтового строкового литерала(здесь и на TIO экранированы, потому что это недопустимый UTF-8)
Вы можете проверить длину литерала здесь.
Попробуйте онлайн!
В этом случае сжатие Snappy работает довольно хорошо, несмотря на то, что оно фокусируется на скорости, потому что в сжимаемой строке очень много односимвольных циклов.
Несжатая строка (с
#
заменой\n
для ясности):Это кодирует левосторонние версии различных компонентов экрана с
!
вместо новых строк и~
вместо?
, которые затем дополняются правыми~
до 30 символов перед добавлением их самих и обращений строк в список поиска.Оставшаяся часть кода просто обрабатывает поиск координат, игнорируя случаи за пределами границ.
источник
Python 2 ,
864854848826810 байтПопробуйте онлайн!
источник
Древесный уголь ,
500332 байтаПопробуйте онлайн! Ссылка на подробную версию кода. Боюсь, скучный подход; много печати сжатых строковых литералов. Объяснение:
Дополните массив двумя дополнительными символами
0
с каждой стороны.Разрезать
7x7
подраздел массива с центром по заданным координатам.Поверните массив в соответствии с заданным направлением.
(обратите внимание на конечный пробел) Нарисуйте пустое
30×10
поле, чтобы выходные данные всегда имели постоянный размер.Нарисуйте каждую половину отдельно, отражая между ними.
Возьмите массив дескрипторов стен, разбейте их на фрагменты (string, y-координата, x-координата), отфильтруйте те фрагменты, у которых есть стена в соответствующей позиции в соответствующей половине массива, и зациклите на стенах. Положение рассчитывается путем извлечения 12 стен из массива и индексации их с использованием индекса чанка, так как это сложнее, чем определение местоположения стены напрямую с использованием индекса чанка.
Перепрыгните на координаты стены и распечатайте ее. Обратите внимание, что отражение отрицает X-координаты от
[0, 30)
до,(-30, 0]
так что за один проход холст эффективно смещается на 29 символов влево.источник
Рубин ,
412 391 385383 байтаПопробуйте онлайн!
Принимает входные данные в виде массива истинных / ложных значений (примечание
0
верно в Ruby, ноnil
неверно).Выводит массив символов.
объяснение
Блоки рисуются спереди назад, с
n
уменьшением расстояния и из стороны в сторону,m
циклически проходя-1,1,0
слева, справа, посередине. Средний блок E в самом дальнем ряду фактически рисуется дважды, потому что нам нужно проверить как блоки A / B, так и блоки C / D.n,m
иd
используется для измененияx
иy
значения для поиска массиваa
. Если значениеx
выходит за пределы диапазонаnil
, возвращается для ячейки вне диапазона, и не выдается ошибка, но если значениеy
выходит за пределы диапазонаnil
будет возвращаться строка, и Ruby выдаст ошибку типа, когда попытается найти ячейку. Чтобы избежать этого, массив повторяется в вертикальном направлении перед поиском. Если истинное значение найдено, блок рисуется.Выходные данные построены в массиве
b
из 10 элементов, представляющих столбцы выходных данных, и транспонированы в 10 строк в конце функции. Отрисовывается полная лицевая сторона всех блоков (отображается ли она в окне просмотра или нет), поэтому в массиве требуется дополнительное пространство, чтобы избежать ошибок вне диапазона. Диапазонj
значений в области просмотра от,-15
до+14
, он смещается на 15 при сохранении в массив, чтобы задать диапазон0
до29
. Для каждого нарисованного блока вычисляются три значения:p
иq
для левого и правого углов передней стенки соответственно иr
для задней части боковой стенки.j
повторяется от минимума до максимума этих трех значений, рисуя столбцы по очереди.Существует 3 типа линий: горизонтальная
-
или_
вертикальная|
или:
диагональная с повторяющимся" .'"
узором. Гдеp < j < q
столбцы, содержащие пробелы, ограничены-
или_
нарисованы, чтобы сформировать переднюю грань. Гдеj
находится за пределами этого диапазона, столбцы, содержащие пробел,|
или:
нарисованы с символами,t=" .'"
образующими края и / или боковую грань. Это управляется переменнойk=j
гдеj
положительно илиk=-j-1
гдеj
отрицательно. Количество символов между верхней и нижней заглавными буквами равноk/3*2
. Чтобы правильно обрабатывать внешние края самых дальних блоков, гдеn=3
,k
должно быть взято по модулю 9, но это не должно быть сделано для меньших значенийn
,k
Поэтому берется по модулю36/-~n
, где-~n
оцениваетсяn+1
.Код без правил
источник