Описание
Задача этой задачи - разработать программу или функцию, которая отслеживает данный объект в пространстве .
I / O
Ваша программа будет иметь 3 входа, которые могут быть приняты любым разумным способом :
n
будет размер стороны самолета. (таким образом, для ваша плоскость будет ). Вы можете предположить, что всегда будет нечетным целым числом.n
s
будет начальной позицией объекта, заданной в виде пары координат.
D
будет вектором упорядоченных пар. D
будет следовать формату , где всегда будет одним из , для кардинального и основного межкардинальных направлений, а будет целое число для числа «тиков».'N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'
Учитывая эти входные данные, ваша программа должна вывести отслеживание объекта в плоскости.
правила
Выходные данные должны содержать границы плоскости. Например:
- 21012 + + ┌─────┐ 2│ │ 1│ │ 0│ │ 1│ │ 2│ │ -└─────┘
будет примером пустой плоскости . Числа выше и сбоку предназначены только для справки и не должны быть напечатаны.
Вы можете использовать любой символ (ы) для границ, если он не является пробелом (или отображается как пробел). Выбранные символы должны очертить всю плоскость, что означает, что между ними не должно быть промежутков.
Некоторые приемлемые самолеты включают в себя: ┌──┐ .... ---- + - + │ │. , | | | | │ │. , | | | | └──┘; ....; ----; + - + Недопустимые самолеты включают в себя: .... .... ++++. , , , + +. , , + +. , ; ....; ....; + +; , ,
Отслеживаемый объект может быть любым выбранным вами символом, если он занимает только 1 место на плоскости и отличается от пограничных символов.
В качестве следа отслеживаемого объекта также могут использоваться любые выбранные вами символы, если они занимают только 1 место на плоскости и отличаются от объекта.
Для каждого элемента в объект должен переместиться на пробелов в направлении и оставить след позади.
Если объект достигнет границы, это будет отражено. Если объект все еще имеет какие-либо движения, он будет продолжать двигаться в том направлении, в котором он был отражен.
Для справки, эти направления отражают друг друга:
→ когда встречается верхняя или нижняя граница;
→ когда встречается боковая граница;
Окончательный вывод будет содержать новейшие возможные трассы, то есть, если объект оставит трассу в пространстве, где уже есть трасса, более новый символ трассировки заменит более старый.
Как обычно, стандартные лазейки по умолчанию запрещены .
Подсчет очков:
Это вызов для игры в гольф .
Примеры:
Ввод: , ,
Разрабатывая это:
0 ┌─────┐ │ │ │ │ 0│ ○ │ │ │ │ │ └─────┘
0 ┌─────┐ ○ ○ │ │ \ │ 0│ \ │ │ │ │ │ └─────┘
0 ┌─────┐ │∧ │ │ | \ │ 0│ ○ \ │ │ │ │ │ └─────┘
, который будет выходным.
0 ┌─────┐ │∧ │ │ | \ │ 0│└ ○ \ │ │ │ │ │ └─────┘
(0 для справки, и они не должны быть в конечном выводе.)
Ввод: , ,
Обратите внимание, что при :
0 ┌─────────┐ │ │ │ │ │ │ │ ∧ │ 0│ / | │ ○ ○ / | │ │⟨ / │ │ \ / │ │ ∨ │ └─────────┘
Объект был отражен дважды : один раз при достижении дна плоскости при движении к , где он отражается к ; затем еще раз при достижении левой стороны плоскости, где отражает .
Окончательный результат получается при :
0 ┌─────────┐ ○ ○ │ │ \ │ │ \ │ │ \ │ 0│ / | ⟩│ ∧ ∧ / / │ │⟨ \ / / │ │ \ \ / │ │ ∨ ∨ │ └─────────┘
Тестовые случаи:
Ввод: , ,
Выход:
0 ┌─────┐ │∧ │ │ | \ │ 0│└ ○ \ │ │ │ │ │ └─────┘
Ввод: , ,
Выход:
0 ┌─────────┐ ○ ○ │ │ \ │ │ \ │ │ \ │ 0│ / | ⟩│ ∧ ∧ / / │ │⟨ \ / / │ │ \ \ / │ │ ∨ ∨ │ └─────────┘
Ввод: , ,
Выход:
0 ┌───┐ │ | │ 0│- ○ ┐│ │ | │ └───┘
Ввод: , ,
Выход:
0 ┌───────────┐ │ ∧ │ │ / \ │ │┌ - / - \ \ │ | \ | / \ \ │ │ \ | \ \ │ 0│ | / ⟩│ │ | \ / / │ │ | / ○ │ │ | / \ │ ∨ ∨ \ │ │ \ │ └───────────┘
'N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'
вместо этого 0-индексированное (или 1-индексированное) целое число? Так[('NW',2),('S',2),('E',1)]
делается[[7,2],[4,2],[2,1]]
например.Ответы:
JavaScript (ES6), 228 байт
(n,x,y,[[dir,len],[dir,len],...])
Выводит строку с
0
границей,1
трассой и3
конечной позицией.Попробуйте онлайн!
Как?
Инициализация и рисование в «canvas» (то есть в матрице символов) немного утомительно и долго в JavaScript.
В этом коде используется другая стратегия: вместо сохранения выходных данных в двумерном массиве он строит строку за символом слева направо и сверху вниз. На каждой итерации:
0
если мы находимся за границей.1
либо,3
если это делает, либо пробел в противном случае.В общем, это не самый короткий подход, но я подумал, что стоит попробовать.
источник
Java 10,
350343340336 байтовD
является целым числом 2D-массив , в котором направление 0-индексированные целые числа:N=0, NE=1, E=2, SE=3, S=4, SW=5, W=6, NW=7
. Начальныеx,y
координаты будут двумя отдельными параметрамиs
иS
. Выход представляет собой символьную матрицу.Он использует
#
как границу,*
как след, иO
как конечную позицию (но все три могут быть любыми символами ASCII в диапазоне Юникода[33,99]
для того же количества байтов, если вы хотите).Попробуйте онлайн.
-4 байта благодаря @ceilingcat .
Определенно можно сыграть в гольф еще больше, упрощая движения и в каком направлении мы еще путешествуем.
Объяснение:
y<2&i<2|y>=n&i>2&i<5?4-i:x<2&i>4|x>=n&i>0&i<4?8-i:y<2&i>6?5:y<n|i!=5?i:7
приведена ниже версия для игры в гольф с использованием4-i
и8-i
для большинства изменений направления:источник
Древесный уголь , 74 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Принимает входные данные в формате n, x, y, d, где d - это массив массивов пар [расстояние, направление], где направление представляет собой числовую кодировку 0 = юг по часовой стрелке до 7 = юго-восток. Объяснение:
Введите
n
и нарисуйте рамку, внутренняя часть которой соответствует размеру с центром в начале координат.Введите и перейдите к
x
иy
(но отрицайте,y
потому что ось Y древесного угля увеличивается вниз).Переберите записи в
d
.Извлеките начальное направление.
Повторите для желаемого расстояния.
Сохраните направление.
Сделайте экспериментальный шаг в этом направлении.
Если это происходит по сторонам, переверните направление по горизонтали.
Если это идет сверху или снизу, переверните направление по вертикали.
Уменьшите направление по модулю 8 (команды Pivot принимают значения только от 0 до 7).
Отменить экспериментальный ход.
Поверните в правильном направлении, затем напечатайте трассировку и двигайтесь.
Поверните лицо в направлении по умолчанию и распечатайте объект в текущей позиции.
источник
JavaScript, 206 байт
Принимает ввод как (n, x, y, [[dir, len], [dir, len], ...]), где направления кодируются с использованием битовых масок:
Выводит строку с
Различные значения границ используются для оценки следующего направления
Меньше гольфа
ТЕСТ
источник
C (gcc) ,
352323 байтаГольф упал на 29 байт, благодаря потолку.
Попробуйте онлайн!
Программа принимает ввод в качестве аргументов командной строки (например
a.out 10 1 1 3 5 0 4 7 2
):E
объяснение
источник