Что если у нас есть коридор, состоящий из двух параллельных зеркал?
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
Теперь мы светим лазером ...
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \|
| /|
| / |
О, посмотри. Это подпрыгнуло, к концу, там.
Что если мы нарисуем два лазера НО, идущих в противоположном направлении?
| \ / |
| \ / |
| \/ |
| /\ |
| / \ |
| / \ |
| / \ |
|/ \|
|\ /|
| \ / |
Хм, похоже, они там не встречались. Это удобно Что произойдет, если оба лазера займут одно и то же место?
| \ / |
| \ / |
| \ / |
| X |
| / \ |
| / \ |
| / \ |
| / \|
|/ /|
|\ / |
Я думаю, это было довольно очевидно, а?
Рисование этих диаграмм вручную довольно трудоемко (поверьте мне). Возможно, какой-то код мог бы сделать это для нас?
- Напишите некоторый код для вывода двух параллельных зеркал с двумя пересекающимися лазерами.
- Ввод (все целые числа):
- Ширина коридора
- Длина коридора
- Начальная позиция правого лазера (с нулевым индексом, должна быть меньше ширины)
- Начальная позиция левого лазера (с нулевым индексом, должна быть меньше ширины)
- Процесс
- Если лазер работает правильно, он будет нарисован на одну клетку вправо на следующей линии.
- Если лазер оставлен включенным, он будет нарисован на одну клетку слева на следующей линии.
- Если лазер не может сделать свой шаг в сторону, он изменит свое направление, но не его положение.
- Если оба лазера имеют одинаковый индекс, выведите в верхнем регистре X с этим индексом.
- Выход
- Строка с несколькими строками
- Каждая строка начинается и заканчивается символом канала (|)
- Правый лазер обозначается обратной косой чертой (\)
- Левый лазер обозначается косой чертой (/)
- Пересечение двух лазеров обозначается буквой X в верхнем регистре.
- Любой язык
- Я хотел бы видеть ссылки TIO
- Попытка исправить это в наименьшем количестве байтов
Контрольные примеры
ширина: 6 длина: 10 направо: 1 налево: 4
| \ / |
| \/ |
| /\ |
| / \ |
|/ \|
|\ /|
| \ / |
| \/ |
| /\ |
| / \ |
ширина: 6 длина: 10 направо: 0 налево: 1
|\/ |
|/\ |
|\ \ |
| \ \ |
| \ \ |
| \ \|
| \/|
| /\|
| / /|
| / / |
ширина: 4 длина: 10 направо: 2 направо: 0
|/ \ |
|\ \|
| \ /|
| X |
| / \|
|/ /|
|\ / |
| X |
|/ \ |
|\ \|
ширина: 20 длина: 5 направо: 5 налево: 15
| \ / |
| \ / |
| \ / |
| \ / |
| \ / |
ширина: 5 длина: 6 направо: 2 направо: 2
| X |
| / \ |
|/ \|
|\ /|
| \ / |
| X |
ширина: 1 длина: 2 направо: 0 направо: 0
|X|
|X|
Ответы:
Stax , 40 байт
Запустите и отладьте его
Попробуйте онлайн!
Уверен, что это может быть дальше в гольфе.
Вход дан в виде
width [right-going left-going] length
(за комментарий @EngineerToast).ASCII эквивалент:
источник
width [right-going left-going] length
JavaScript (ES6), 149 байт
Принимает ввод в синтаксис карри
(w)(h)([a,b])
.Попробуйте онлайн!
комментарии
источник
Python 2 , 119 байт
Попробуйте онлайн!
источник
\\/
в гольф\/
? Даже если обратная косая черта интерпретируется дважды, она все равно не избежит косой черты.Python 2 , 168 байт
Попробуйте онлайн!
источник
d
!Python 2 ,
187181179177174172171 байтПопробуйте онлайн!
Рекурсивный:
Python 2 , 172 байта
Попробуйте онлайн!
Рекурсивная альтернативная печать:
Python 2 , 172 байта
Попробуйте онлайн!
источник
C (лязг) ,
240236208 байтПопробуйте онлайн!
f () принимает параметры следующим образом:
x
= ширина,y
= длина,r
= изначально начальная позиция правой линииl
= изначально начальная позиция левой линии-4 байта. кредиты Кевина Круйссена. Спасибо
источник
while
a,for
чтобы удалить{}
точку с запятой. И еще 1 байт, изменивc&&d
наc&d
. Попробуйте онлайн 236 байт .Холст ,
6640 байтовПопробуй это здесь!
источник
Древесный уголь ,
5650 байтПопробуйте онлайн! Ссылка на подробную версию кода. Изменить: Сохранено 6 байтов за счет уменьшения зависимости от поворота. Объяснение:
Распечатать стороны.
Обмотайте два лазера.
Двигайтесь к началу лазера.
Цикл по высоте.
Нарисуйте
\
или/
в соответствующем направлении, если квадрат не пустой, в этом случае нарисуйтеX
.Мы ударили в сторону?
Если это так, то сделайте один шаг в сторону и измените направление движения.
источник
Java (JDK 10) , 186 байт
Попробуйте онлайн!
источник
PHP,
177 169166 байттребует PHP 7.1 для отрицательных строковых индексов, PHP 5.5 или новее для индексации строковых литералов.
для PHP <7.1 , удалить
^L
, заменить"X\/"
с"/X\\"
,:0
с+1:1
,[$e]
с[$e+1]
, удалить."|"
и вставить|
до конца строки. (+3 байта)для PHP <5.5 , заменить
"/X\\"
на$p
и вставить$p="/X\\";
в начале. (+2 байта)принимает входные данные из аргументов командной строки. Запустите
-nr
или попробуйте их онлайн .источник
Python 3 , 162 байта
Попробуйте онлайн!
источник
Рубин , 117 байт
Попробуйте онлайн!
Анонимная лямбда, принимающая входные данные как ширину
w
, высотуh
и массив начальных точекa
.источник
PowerShell ,
243233222205 байтПопробуйте онлайн!
Oooof. эти логические блоки большие и грязные и в основном дублируются. Следующим шагом будет их переписывание, чтобы они не нуждались в выражении else.
источник
Python 2,
165164 байтаСохранил байт благодаря Джонатану Фреху.
Попробуйте онлайн!
источник
\\/
эквивалентно\/
.К (нгн / к) , 58 байт
Попробуйте онлайн!
анонимная функция, которая принимает три аргумента:
x
ширина,y
длина,z
пара начальных позиций для лазеровисточник
C (gcc) , 169 байтов
Попробуйте онлайн!
источник
Котлин ,
322311302 байтаИзменено, как я поместил лазерное направление в строку для 11 байтов. Перемещено назначение из когда для 9 байтов.
Попробуйте онлайн!
источник