Представьте себе следующие диаграммы как наборы вертикальных пересекающихся трубок.
1 2 1 2 1 2 3 4
\ / \ / \ / \ /
X | | |
/ \ / \ / \ / \
2 1 1 2 | X |
\ / \ /
X X
/ \ / \
3 1 4 2
На самой левой диаграмме 1
и 2
скользят вниз по соответствующим слешам, пересекаются X
и выходят с противоположных сторон от того места, где они начинались.
Это та же идея на средней диаграмме, но это |
означает, что пути не пересекаются, поэтому ничего не меняется.
Крайняя правая диаграмма показывает более сложную маршрутизацию труб, которая 1 2 3 4
переходит в 3 1 4 2
.
Цель
Ваша цель в этой задаче для игры в гольф кода состоит в том, чтобы нарисовать эти «диаграммы маршрутизации труб» с учетом такой перестановки, как 3 1 4 2
. Самая короткая программа в байтах победит.
Детали
- Входные данные поступают из stdin как любая перестановка чисел от 1 до n, разделенных пробелами, где n - положительное целое число. Вы можете предположить, что все входные данные правильно сформированы.
Вывод диаграммы маршрутизации идет в стандартный вывод.
- «Сброс» чисел от 1 до n по порядку в верхнюю часть диаграммы должен привести к тому, что входная перестановка выходит внизу. (Верх и низ всегда являются слоями слеша.)
- Диаграмма не должна быть оптимально маленькой. Это может быть столько уровней, сколько необходимо, если это правильно.
- Диаграмма должна содержать только символы
\/ X|
и символы новой строки (без цифр). |
всегда следует использовать на самых внешних пересечениях, так как использованиеX
не имеет смысла.- Несколько начальных или конечных пробелов в порядке, если диаграмма правильно выстроена.
Примеры
Ввод 3 1 4 2
может производить (так же, как выше)
\ / \ /
| |
/ \ / \
| X |
\ / \ /
X X
/ \ / \
Вклад 1
может производить
\
|
/
|
\
|
/
Вклад 3 2 1
может производить
\ / \
X |
/ \ /
| X
\ / \
X |
/ \ /
Вклад 2 1 3 4 6 5
может производить
\ / \ / \ /
X | X
/ \ / \ / \
источник
X
подключиться напрямую к|
тому, как это/
делает? ДругомуX
?row of slashes
,row of X's and |'s
,row of slashes
,row of X's and |'s
, ... формат.n
быть больше 10?Ответы:
Python 2, 218
219220222224227243247252259261264Я выбрал немного другой подход: я нахожу свопы, необходимые для сортировки входных данных, а затем вертикально инвертирую их, чтобы получить свопы, необходимые для превращения отсортированного списка во входные данные. В качестве дополнительного бонуса этого подхода он может взять произвольный список чисел и указать путь перестановки, чтобы превратить сортировку входных данных во входные.
Пример:
Улучшения:
264 -> 261: переключил внешний цикл с на на время.
261 -> 259: используется
f%2
вместо(c^m)
, потому что в python арифметические операторы имеют более высокий приоритет, чем побитовые операторы.259 -> 252: переключил внутренний цикл с на на время. Совмещенные
i
иc
переменные.252 -> 247: Изменили сборку, затем перевернули, чтобы построить только в обратном порядке.
247 -> 243: добавлены новые строки вручную, вместо использования объединения.
243 -> 227: Принят метод генерации линии слеша от grc (спасибо grc!) И добавил s.
227 -> 224: перемещена генерация линии слеша до внутреннего цикла while для удаления
%4
и сохранения символа с использованием расширенного среза.224 -> 222: Удалено m.
222 -> 220:
f%2+n%2
->f+n&1
220 -> 219:
| 1<n-1|
->|~i>-n|
(удалено начальное пространство)219 -> 218: Комбинированные инициализации
o
иs
и переместить срез до конца.источник
Python, 290
Я пошел по довольно простому подходу, но оказалось немного дольше, чем я надеялся. Он рассматривает список попарно и решает, нужно ли менять каждую пару. Это повторяется для каждой пересекающейся строки, пока список не будет соответствовать входным данным.
Пример:
источник
HTML JavaScript,
553419Спасибо @izlin и @TomHart за указание на мои ошибки.
Проверьте здесь: http://goo.gl/NRsXEj
источник
Javascript - 395
378, если я не печатаю числа на моем выходе, но это выглядит намного лучше и улучшает удобочитаемость.
Проверьте это здесь . (с негольфированной версией) версия для
гольфа:
объяснение
Сначала я подставляю ввод с порядковым номером и изменяю первую строку с результатами. Например
С помощью этой замены я могу использовать алгоритм сортировки пузырьков, чтобы отсортировать от 2,4,1,3 до 1,2,3,4, и график будет кратчайшим, который мы ищем.
Если у вас есть идеи, как сделать код меньше, просто прокомментируйте :)
пример
источник
<br>
тег и textarea только на jsfiddle, потому что он выглядит намного лучше. Предупреждение не имеет моноширинного шрифта, поэтому вывод выглядит плохо. В моей версии для гольфа я использую оповещения и \ n. Является ли ваша веб-страница общедоступной?Кобра - 334
344356360Он работает, перемещая каждый элемент на место, начиная слева. Из-за этого он часто будет выводить смехотворно большую (хотя все еще правильную) карту путей.
Примеры:
источник