Мои провода все запутаны!
Разве это не раздражает, когда провода запутываются? Ну, это только что случилось со мной, поэтому я хотел бы помочь мне распутать их! Для вашего удобства я отключил их все от устройства, но все они все еще подключены к розетке. Ваша задача - понять, как их распутать!
вход
Ввод будет состоять из пробелов, каналов и X (оба случая). Ввод будет выглядеть примерно так:
| | | |
X | |
| | x
| X |
| | | |
Прописная буква X означает, что левый провод пересекает правый провод, а строчная буква x означает противоположное. Первая и последняя строки всегда будут | | | |...
. Вы можете использовать входные данные в виде строки, разделенной запятыми, массива строк и т. Д. Формат не является строгим, если он имеет смысл и не содержит никакой дополнительной информации.
Выход
Для этого испытания мне нужно не только знать, сколько времени я займу, но и точно знать, что делать. Итак, выведите список целочисленных пар с символом R или L, без учета регистра, представляющих, какие два провода распутывать и в каком направлении (R означает справа налево, и наоборот для L). Вы должны сказать мне, какой способ их скрещивать; Я не могу понять это сам. Вывод также довольно гибкий, если вы выводите все пары целых чисел + символ в правильном порядке, и вы не выводите лишний бессмысленный текст (скобки, запятые и т. Д. В порядке). Проводники могут быть нулевыми или индексированными, но индекс должен начинаться слева. Обратите внимание, что вы должны распутать снизу, а не сверху. Стиль вывода должен быть согласованным, и, если он неочевиден, укажите способ вывода. Случай персонажа не должен быть последовательным,
Пример вывода
Для приведенного выше примера ввода результат будет примерно таким:
2 3 R
3 4 L
1 2 R
Выходной формат здесь представляет собой разделенный пробелами список значений, разделенных пробелами. Это 1-индексированный.
Дополнительные спецификации
Допустимо, чтобы X и x располагались вертикально друг над другом в любом порядке. Поскольку я ленивый, я не хочу переключать провода без необходимости, поэтому ничего не выводите для этих случаев; если я найду это, я просто осторожно потяну за провода, чтобы они были прямыми.
Также допустимо, чтобы несколько X и x были сложены вертикально, и пока ни один из проводов не задействован в других переходах, я не хочу никаких дополнительных ходов (потому что я ленивый). Таким образом, если символы X X x X x x
отображаются в столбце без каких-либо других пересечений, выходные данные все равно должны быть пустыми!
В случае, если это не ясно, R исключает X, а L устраняет x.
В одном ряду может быть два пересечения проводов, и в этом случае порядок этих двух перестановок не имеет значения. Вы никогда не получите что-то подобное | X X |
(это не имеет смысла, поскольку подразумевает, что средний провод пересекается по проводам как слева, так и справа).
Там не всегда переходы ...
На входе может быть одна труба. Однако ввод никогда не будет пустым.
Самое короткое действительное решение выиграет 20 декабря!
Больше примеров
Как я и обещал:
Пример 1
вход
| | | | | |
| | X x
X | x |
| x | X
X X | |
| | | | | |
Выход
1 2 R
3 4 R
2 3 L
5 6 R
1 2 R
4 5 L
3 4 R
5 6 L
Пример 2
вход
| | |
X |
| x
| | |
| X
| x
| | |
Выход
2 3 L
1 2 R
Пример 3
вход
|
Выход пуст. Да, вы должны разобраться с этим делом.
Пример 4
вход
| |
X
x
X
x
X
x
X
x
X
x
| |
Выход пуст. Просто для удовольствия :).
Пример 5
вход
| |
X
X
x
X
x
x
| |
Выход по-прежнему пуст ...
Ответы:
Befunge, 173 байта
Входные данные читаются из stdin в точном формате, указанном в описании вызова, хотя очень важно, чтобы каждая строка имела правильную длину, а последняя строка должна включать новую строку (т.е. не только EOF в конце этой строки).
Попробуйте онлайн!
Основная идея этого решения заключается в том, что у нас есть «массив», отслеживающий количество витков для каждого провода. Поэтому каждый раз, когда мы сталкиваемся с поворотом в одном направлении, мы увеличиваем счет для связанного провода, в то время как поворот в другом направлении уменьшает счет.
В то же время, когда мы обрабатываем скручивание для конкретного провода, мы также смотрим на количество скручивания для проводов слева и справа от него. Если любой из них не равен нулю, нам нужно «сбросить» эти скручивания в стек, так как они больше не смогут быть распутаны последующими скручиваниями в противоположном направлении.
После последней строки ввода поток ввода несколько раз возвращает EOF, и эти символы EOF интерпретируются как закрутки в каждом проводе, по крайней мере, для очистки. Это вынуждает программу сбрасывать все ожидающие подсчеты в массиве, но не будет генерировать новые подсчеты закручивания.
Как только мы закончим обработку ввода, все команды для распутывания проводов теперь будут в стеке. Это означает, что мы можем просто вытолкнуть их в обратном порядке, чтобы вывести инструкции, необходимые для распутывания проводов снизу вверх.
источник
Pyth -
2625 байтОчень просто, может быть, я смогу сыграть в гольф.
Попробуйте это онлайн здесь .
источник
in
, исправил, и это тоже спасло мне байтJavaScript (ES6), 178 байт
Принимает ввод в виде массива строк, представляющих строки, и возвращает массив массивов значений, например
[[2, 3, "R"], [3, 4, "L"], [1, 2, "R"]]
. Обратный порядок помогает в устранении.источник
s
? Я запускаю его на repl.it, и он говорит мне, что естьReferenceError: s is not defined
.Python 2,
244241 байтПринимает ввод как список строк
Пример:
Входные данные:
['| | | |', ' X | |', '| | x ', '| X |', ' x | |']
Выход:
[[1, 2, 'L'], [2, 3, 'R'], [3, 4, 'L'], [1, 2, 'R']]
Изменить: Исправлено для случая:
Входные данные:
['| | |', ' X |', ' X |', ' x |', '| X', ' X |', ' x |', ' x |', '| | |']
Выход:
[[1, 2, 'L'], [2, 3, 'R'], [1, 2, 'R']]
источник