Важное редактирование: ранее в примере 1 было неверное значение. Оно было исправлено.
Вам дан двумерный массив, в котором каждая ячейка содержит одно из четырех значений.
Примеры:
1 2 2 2 2 1 @ . . X X V
1 3 1 4 1 4 e . @ I C V
2 3 1 3 4 2 H H @ X I V
1 4 4 2 1 3 V C C
2 2 2 3 2 3 X X X
Четыре значения представляют стрелки направления (вверх, вниз, влево и вправо), хотя вы не знаете, какое значение представляет какое направление.
Стрелки направления образуют непрерывный путь, который включает каждую ячейку в массиве, хотя вы не знаете, где находятся начальная или конечная точки.
Напишите некоторый код, который определяет, какое направление представляет каждое из четырех значений и где находятся начальная и конечная точки.
Приемлемое возвращаемое значение для массива, который содержит значения A, B, C и D, будет выглядеть примерно так:
{ up: A, down: C, left: D, right: B, start: [2, 0], end: [4, 2] }
Поскольку вы можете пройти путь в обоих направлениях (от начала до конца и от конца к началу), всегда будет более одного правильного решения и может быть более двух. Предположим, что входные данные, которые вы получаете (как в приведенных выше примерах), всегда имеют хотя бы одно правильное решение. В тех случаях, когда существует более одного правильного решения, достаточно вернуть только одно из правильных решений.
Самый короткий код выигрывает. Я выберу победителя через 7 дней или 24 часа без новой заявки, в зависимости от того, что произойдет раньше.
Я включаю решения для приведенных выше примеров, но я рекомендую вам проверять их только после написания кода:
Один:
{вверх: 3, вниз: 1, слева: 4, справа: 2, начало: [0,0], конец: [2,5]}
Два:
{вверх: '@', вниз: 'e', слева: '.', справа: 'H', начало: [1,1], конец: [0,0]}
Три:
{вверх: 'I', вниз: 'V', слева: 'C', справа: 'X', начало: [0,2], конец: [4,2]}
Ответы:
C #
РЕДАКТИРОВАТЬ: Исправлено деление и форматирование. И добавил вспомогательный класс.
Это гольф-код, 807 символов
Результаты для трех тестовых случаев:
Это необработанный код без «гольфа», почти 4000 символов:
Вот результаты для трех примеров:
источник
Mathematica 278
Добавлены пробелы для «ясности»
Сессия и вывод:
Который является начальной вершиной, конечной вершиной и правилами перехода, связанными с каждым символом.
Вот дополнительный код для отображения ориентированного графа:
источник
Mathematica (151)
Возвращает начальную точку, конечную точку и правила перехода. Первый индекс - строка, второй - столбец.
Обратите внимание, что мой код работает даже с
{-1,0,1}~Tuples~{4,2}
. Для ускорения вы можете использоватьPermutations@{{1, 0}, {0, 1}, {-1, 0}, {0, -1}}
вместо этого.источник
APL (207)
Я не мог сделать его короче, чем Mathematica, потому что я не мог рассуждать с точки зрения TopologicalSort и тому подобного. Умные люди могут сжимать его дальше.
Golfed:
Ungolfed:
Примеры:
(Индексы начинаются с 1)
источник