Эта задача происходит в сетке.
+----------+
| |
| |
| |
| |
| |
| |
| |
| |
| |
+----------+
Это 10 х 10, но это может быть любой прямоугольной формы.
На этой сетке четыре направления. Вверх, вниз, влево и вправо.
Задача состоит в том, чтобы нарисовать путь, начинающийся с заглавной буквы. В этом примере будет идти прямо вверх от U.
+----------+
| |
| |
| |
| |
| |
| |
| |
| |
| U |
+----------+
Путь будет идти вверх и будет состоять из символов полной остановки (.), Пока он не коснется стены, а завершится звездочкой (*).
+----------+
| * |
| . |
| . |
| . |
| . |
| . |
| . |
| . |
| U |
+----------+
В дополнение к запускам траектории есть также переключатели направлений, представленные строчными буквами начального направления.
+----------+
| |
| |
| |
| r.....*|
| . |
| . |
| . |
| . |
| U |
+----------+
Кроме того, верхний регистр X - это препятствие, которое прекратит путь.
+----------+
| |
| |
| |
| |
| r...*X |
| . |
| . |
| . |
| U |
+----------+
правила
- Входные данные представляют собой строку, состоящую из кадра (состоящего из символов |, - и +), содержащего символы, обозначающие начало пути, переключатели направления и препятствия.
- Ваш код должен добавлять символы полной остановки, чтобы следовать пути, описанному при запуске и переключателях направления, и звездочку, когда / если путь встречает стену или препятствие.
- Может быть несколько стартов пути.
- Код будет по-прежнему завершаться без ошибок, если путь описывает цикл.
- Если путь встречается с началом пути, он действует как переключатель направления.
- Это код гольфа, код младшего байта и никаких стандартных лазеек, пожалуйста.
- Я всегда предпочитаю ссылки на онлайн переводчика.
Тестовые случаи
1: Простой
+----------+
| |
| |
| |
| |
| |
| |
| |
| |
| U |
+----------+
+----------+
| * |
| . |
| . |
| . |
| . |
| . |
| . |
| . |
| U |
+----------+
2: правый поворот
+----------+
| |
| |
| |
| r |
| |
| |
| |
| |
| U |
+----------+
+----------+
| |
| |
| |
| r.....*|
| . |
| . |
| . |
| . |
| U |
+----------+
3: Перекресток
+----------+
| |
| |
| |
| r d |
| |
| u l |
| |
| |
| U |
+----------+
+----------+
| * |
| . |
| . |
| . r..d |
| . . . |
| u....l |
| . |
| . |
| U |
+----------+
4: 4 Пересекающиеся пути
+----------+
| D |
| |
| |
|R |
| |
| L|
| |
| |
| U |
+----------+
+----------+
| * D |
| . . |
| . . |
|R........*|
| . . |
|*........L|
| . . |
| . . |
| U * |
+----------+
5: Первый цикл
+----------+
| |
| |
| |
| r d |
| |
| u l |
| |
| |
| U |
+----------+
+----------+
| |
| |
| |
| r..d |
| . . |
| u..l |
| . |
| . |
| U |
+----------+
6: Стартер как изменитель
+----------+
| |
| |
| |
| L |
| |
| |
| |
| |
| U |
+----------+
+----------+
| |
| |
| |
|*..L |
| . |
| . |
| . |
| . |
| U |
+----------+
7: прямой цикл
+----------+
| |
| |
| |
| |
| r l |
| |
| |
| |
| U |
+----------+
+----------+
| |
| |
| |
| |
| r..l |
| . |
| . |
| . |
| U |
+----------+
8: узкий узел
+----------+
| |
| |
| |
| d l |
| r u |
| r u |
| |
| |
| U |
+----------+
+----------+
| * |
| . |
| . |
| d..l |
| .r.u |
| r.u |
| . |
| . |
| U |
+----------+
9: препятствие
+----------+
| |
| |
| |
| |
| r X |
| |
| |
| |
| U |
+----------+
+----------+
| |
| |
| |
| |
| r...*X |
| . |
| . |
| . |
| U |
+----------+
Форма 10: S
+----------+
|r d |
| |
| XXXXXXXX|
| d l |
|ul |
|XXXXXXX |
| |
|R u |
| |
+----------+
+----------+
|r.....d |
|. * |
|. XXXXXXXX|
|.d......l |
|ul . |
|XXXXXXX . |
| . |
|R.......u |
| |
+----------+
11: 4-х сторонний узел
+----------+
| D |
| |
| r |
|R d |
| |
| u L|
| l |
| |
| U |
+----------+
+----------+
| * D |
| . . |
| r.....*|
|R....d. |
| .... |
| .u....L|
|*.....l |
| . . |
| U * |
+----------+
12: занятые развязки
+----------+
|rrrrr rrrd|
| rlrl |
|ul rrd |
|ruX X |
|udl ll |
|ull |
|rlr |
|rdr d |
|Uruull |
+----------+
+----------+
|rrrrr.rrrd|
|.rlrl .|
|ul rrd .|
|ruX.X. .|
|udl.ll .|
|ull. .|
|rlr. .|
|rdr..d .|
|Uruull *|
+----------+
13: начинается в край
+----------+
| U |
| |
| |
| |
| |
| |
| |
| |
| |
+----------+
+----------+
| U |
| |
| |
| |
| |
| |
| |
| |
| |
+----------+
14: Пересечение Мертвых Путей
+----------+
| |
| |
| |
| R |
| |
| |
| |
| |
| U|
+----------+
+----------+
| *|
| .|
| .|
| R..*|
| .|
| .|
| .|
| .|
| U|
+----------+
Ответы:
JavaScript (ES6),
191 183181 байтСпасибо @tsh за помощь в исправлении ошибки
Принимает ввод в виде матрицы символов. Выходы путем изменения входа.
Попробуйте онлайн!
комментарии
источник
[...""+a].map
может создать массив, по крайней мере, 2x длиной. Я не уверен, поможет ли это.(a+0)[n]
действительно сохраняет байт, хотяn
теперь его нужно инициализировать.Python 2 ,
283279293288279 байтПопробуйте онлайн!
Принимает список списков.
Выходы путем изменения входного массива.
источник
Perl 5,
203188166 байтTIO
Как это работает
$s=$_
чтобы сохранить ввод,$s
чтобы восстановить строчные чейнджеры.$_|=$s
потому что побитовое или с пробеломне изменится,
.
и*
строчные буквыurld
будут восстановлены с побитовым или операционным./\n/;$n='.'x"@-"
чтобы получить "ширину" и$n
соответствовать любому символу "ширина" раз$l='\K[ a-z](?=';$t='([-|X])?'
уменьшить длину регулярного выражения;$l
чтобы соответствовать строчной буквеurld
или пробелу на пути,$t
чтобы соответствовать терминатору.После замены:
(?| R[.*]*\K[ a-z](?=([-|X])?) | ([-|X])?\K[ a-z](?=[.*]*L) | D$n(?:[.*]$n)*\K[ a-z](?=$n([-|X])?) | ([-|X])?$n\K[ a-z](?=$n([.*]$n)*U) )
/e
на eval,/s
чтобы.
(внутри$n
) совпадал также с символом новой строки$&eq$"?$1?'*':'.':uc$&
если совпало, это пробел, если совпал терминатор, в*
противном.
случае заглавными буквами.источник
$s
в нижнем колонтитуле.$s
используется для сохранения ввода и восстановления строчных букв, потому что при рисовании пути они переключаются на прописныеЧисто , 409 байт
Попробуйте онлайн!
источник
Python 2 , 250 байт
Попробуйте онлайн!
Принимает список списков из 1-символьных строк, как явно разрешено OP.
Изменяет список на месте.
Для более легкого ввода / вывода используйте это .
источник