Допоможи мені розплутати ці дроти!


12

Мої дроти всі заплутані!

Чи не прикро, коли дроти все заплутуються? Що ж, зі мною щойно сталося, тому я хотів би допомогти мені розплутати їх! Для вашої зручності я від’єднав їх усіх від пристрою, але вони все ще підключені до розетки. Ваше завдання - розібратися, як їх розплутати!

Вхідні дані

Вхід буде складатися з пробілів, труб та Xs (обидва випадки). Вхід буде виглядати приблизно так:

| | | |
 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. :)
James Holderness

Нема проблем. З повагою! Я досить здивований, а також тим, наскільки коротко ви зробили відповідь Befunge. :)
HyperNeutrino

5

Pyth - 26 25 байт

Дуже просто, можливо, я можу переграти фільтрацію.

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

Спробуйте його онлайн тут .


Гарна спроба. На жаль, вихідний символ невірний; здається, що R кожен раз. Хоча спробуйте; цифри виходять правильно!
HyperNeutrino

@AlexL. Я дурний, я перевернув аргументи, щоб inвиправити, і це також врятувало мене байт
Мальтісен

Я бачу. Гарна відповідь! Майте нагороду. :)
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.