Соревнование
Дана прямоугольная сетка символов
ABCDE FGHIJ KLMNO PQRST
и сетка с одинаковыми размерами точек и пробелов
, , , , , , , , , , ,
Выведите строку, которая генерируется, следуя точкам через сетку, начиная с верхнего левого угла. Этот пример дастABGLQRSNIJE
Заметки
- Вы можете использовать входные сетки как 2D-массивы или как ближайшую альтернативу на вашем языке вместо многострочной строки.
- Вы можете использовать значение NULL вашего языка вместо пробелов. Но вы должны использовать точки, чтобы отметить путь.
- Вам не нужно разделять точки на одной строке пробелами. Я просто добавил их для удобства чтения.
- Наименьшая возможная сетка имеет размер 1х1.
- Начальная и конечная точка будут иметь только одного соседа. Точки между ними всегда будут иметь ровно двух вертикальных или горизонтальных соседей. Это гарантирует, что путь однозначен.
- Путь не будет идти по диагонали.
- Символы в сетке будут состоять из прописных или строчных букв в диапазоне,
[a-z]
как вам удобнее. - Путь всегда начинается в верхнем левом углу.
правила
- Функция или полная программа разрешены.
- Правила по умолчанию для ввода / вывода.
- Применяются стандартные лазейки .
- Это код-гольф , поэтому выигрывает меньшее количество байт. Tiebreaker является более ранним представлением.
Контрольные примеры
Сетка № 1
ABCABCW DEFGHUQ XLUSDQZ ASUKWXI WUKOAIM AIAIOUP
, , , , , , , , , , , , => ABEFGSKUSAWA
, , , , , , , , , , , , , , , , , , , , , , , , , => ABCABCWQZIMPUOIAIAWAXLUUK
Сетка № 2
Обратите внимание на тройные пробелы во вторых строках первого и второго примеров.
AB CD
, => А
, , => AB
, , , => ACD
Сетка № 3
, => А
Удачного кодирования!
ABCABCUQXIUOIAIAWAXLUUK
.Ответы:
APL, 63 байта
Это функция, которая принимает две символьные матрицы (они должны быть матрицами), символьную сетку в качестве левого аргумента и точечную сетку в качестве правого аргумента. Матрица точек может быть меньше матрицы символов.
Объяснение:
(,⍵='.')/,⍳⍴⍵
: получить позиции точек в порядке строк-столбцов1↓
: отбросить первый (как известно, в1 1
)(⊂1 1){
...}
: начиная с1 1
, запустите следующую функцию, которая следует по пути (ее левый аргумент - это текущая позиция, а правый аргумент - не посещенные позиции). Это работает, выбирая ближайшую непосещенную точку каждый раз. (Если предположения из вопроса верны, это правильно.)×≢⍵:
: если есть еще не посещенные позиции:+/¨2*⍨⍺-⍵
: найти манхэттенское расстояние между каждой позицией и текущей позициейV←(+=⌊/)
: для каждой позиции посмотрите, равно ли ее расстояние наименьшему расстоянию, и сохраните его вV
.⍵/⍨~
: выберите все позиции, для которых это не так, это поля для посещения далее(V/⍵)
: найти позицию, для которой это имеет место, это будет следующее поле∇
: снова запустите функцию с этими новыми аргументами⍺,
: результатом является текущая позиция, за которой следует результат выполнения остальной части списка⋄⍺
: в противном случае просто верните текущую позицию и остановитесь (это последняя)⍺[
...]
: для каждой позиции выберите соответствующий элемент в сетке символов.Тестовые случаи:
источник
JavaScript (ES6), 122 байта
объяснение
Принимает сетки как многострочные строки.
Чувствуется как приличная попытка, но у меня не хватило времени, когда я играл в гольф, так что, возможно, это можно улучшить.
источник
APL (Dyalog Classic) , 43 байта
Попробуйте онлайн!
источник