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


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 
| |

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


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

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


Хорошая попытка К сожалению, выводимый символ неверен; кажется, что 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']]


@JamesHolderness Должно быть исправлено сейчас.
TFeld

Похоже, что теперь он работает правильно!
HyperNeutrino

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

@AlexL. Должно быть исправлено сейчас
TFeld
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.