Помоги мне распутать эти провода!

12

Мои провода все запутаны!

Разве это не раздражает, когда провода запутываются? Ну, это только что случилось со мной, поэтому я хотел бы помочь мне распутать их! Для вашего удобства я отключил их все от устройства, но все они все еще подключены к розетке. Ваша задача - понять, как их распутать!

вход

Ввод будет состоять из пробелов, каналов и 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 
| |

Выход по-прежнему пуст ...

HyperNeutrino
источник
4
Можно ли запутать две пары проводов в одном ряду?
Джеймс Холдернесс
1
@JamesHolderness Да, это так. В этом случае порядок не имеет значения. Я уточню это в вопросе. Благодарность!
HyperNeutrino
@JamesHolderness Готово!
HyperNeutrino

Ответы:

1

Befunge, 173 байта

Входные данные читаются из stdin в точном формате, указанном в описании вызова, хотя очень важно, чтобы каждая строка имела правильную длину, а последняя строка должна включать новую строку (т.е. не только EOF в конце этой строки).

$1>>05p~$~:55+-#v_
$_^#`"N":+1g50$<>:2+3%1-05g6g+0v>!#:v#
vg50-1*2p51:-1_^#:<*2!!-*84p6g5<
 +#,.#$"R"\#\-#+5<^g51$_:0`6*\25g\v@_:#!.#:1#,
>+::25p6g\48*\6p48 *-:!^!:--1*2`0:<

Попробуйте онлайн!

Основная идея этого решения заключается в том, что у нас есть «массив», отслеживающий количество витков для каждого провода. Поэтому каждый раз, когда мы сталкиваемся с поворотом в одном направлении, мы увеличиваем счет для связанного провода, в то время как поворот в другом направлении уменьшает счет.

В то же время, когда мы обрабатываем скручивание для конкретного провода, мы также смотрим на количество скручивания для проводов слева и справа от него. Если любой из них не равен нулю, нам нужно «сбросить» эти скручивания в стек, так как они больше не смогут быть распутаны последующими скручиваниями в противоположном направлении.

После последней строки ввода поток ввода несколько раз возвращает EOF, и эти символы EOF интерпретируются как закрутки в каждом проводе, по крайней мере, для очистки. Это вынуждает программу сбрасывать все ожидающие подсчеты в массиве, но не будет генерировать новые подсчеты закручивания.

Как только мы закончим обработку ввода, все команды для распутывания проводов теперь будут в стеке. Это означает, что мы можем просто вытолкнуть их в обратном порядке, чтобы вывести инструкции, необходимые для распутывания проводов снизу вверх.

Джеймс Холдернесс
источник
Похоже, это работает отлично. Молодец!
HyperNeutrino
Это победный ответ. Молодец! Кроме того, спасибо за проверку других ответов для меня! :)
HyperNeutrino
@AlexL. Благодарю. Это мой первый победный ответ на сайте. Не думал, что это будет возможно с Befunge. :)
Джеймс Холдернесс
Нет проблем. Поздравляю с победой! Я довольно удивлен тем, как коротко вы ответили на Befunge. :)
HyperNeutrino
5

Pyth - 26 25 байт

Очень просто, может быть, я смогу сыграть в гольф.

fhhT_m+hB/xrdZ\x2@"RL"}\x

Попробуйте это онлайн здесь .

Maltysen
источник
Хорошая попытка К сожалению, выводимый символ неверен; кажется, что R каждый раз. Хорошая попытка, хотя; номера выходят правильно!
HyperNeutrino
@AlexL. Я тупой, я перевернул аргументы in, исправил, и это тоже спасло мне байт
Maltysen
Понимаю. Хороший ответ! Имейте upvote. :)
HyperNeutrino
2
Если я не ошибаюсь, это не относится к случаю, когда у вас X и x сложены вертикально. Он говорит вам, чтобы менять провода назад и вперед без необходимости.
Джеймс Холдернесс
5

JavaScript (ES6), 178 байт

f=([t,...a],r=[])=>a[0]?t.replace(/x/gi,(c,i)=>(c=c<'x'?'R':'L',i=++i/2,r.reduce((f,[j,,d],n)=>f||i<j+2&&j<i+2&&(j-i|c==d||r.splice(n,1)&&2),0)<2?r=[[i,i+1,c],...r]:r))&&f(a,r):r

Принимает ввод в виде массива строк, представляющих строки, и возвращает массив массивов значений, например [[2, 3, "R"], [3, 4, "L"], [1, 2, "R"]]. Обратный порядок помогает в устранении.

Нил
источник
Откуда ты s? Я запускаю его на repl.it, и он говорит мне, что есть ReferenceError: s is not defined.
HyperNeutrino
@AlexL. Ой, я случайно вставил предыдущую версию своего кода, которую я еще не закончил. Должно быть исправлено сейчас.
Нил
@JamesHolderness Вопрос изменился, так как я отправил свой ответ, мне придется обновить его.
Нил
@JamesHolderness Да. Извини за это, Нил. Мне просто нужно было уточнить некоторые части вопроса, которые я не прояснил ранее.
HyperNeutrino
@JamesHolderness Я понимаю, что именно поэтому я отметил свой ответ как неконкурентный, поскольку он ответил на предыдущую итерацию вопроса, до того момента, пока я не смогу обновить его до текущих требований.
Нил
3

Python 2, 244 241 байт

m=[]
for l in input():
 for i in range(len(l)):
  c=l[i];a=i/2+1;L,R=[a,a+1,'LR'[c>'v']],[a,a+1,'RL'[c>'v']];x=m.index(L)if L in m else-1;M=zip(*m[:x+1])
  if c in'xX':
   if x>=0and(a in M[1]or a+1in M[0])<1:del m[x]
   else:m=[R]+m
print m

Принимает ввод как список строк

Пример:

Входные данные: ['| | | |', ' 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']]

TFeld
источник
@JamesHolderness Должно быть исправлено сейчас.
TFeld
Похоже, что теперь он работает правильно!
HyperNeutrino
@JamesHolderness Да, это похоже на проблему. Пожалуйста, исправь это, TFeld. В противном случае, хорошая попытка!
HyperNeutrino
@AlexL. Должно быть исправлено сейчас
TFeld