Pomóż mi rozplątać te przewody!

12

Moje przewody są splątane!

Czy to nie denerwujące, gdy wszystkie przewody się zaplątują? To właśnie mi się przydarzyło, więc chciałbym pomóc mi je rozwiązać! Dla Twojej wygody odłączyłem je wszystkie od urządzenia, ale nadal wszystkie są podłączone do gniazdka. Twoim zadaniem jest dowiedzieć się, jak je rozwiązać!

Wejście

Dane wejściowe będą składały się ze spacji, potoków i znaków X (oba przypadki). Dane wejściowe będą wyglądać mniej więcej tak:

| | | |
 X  | |
| |  x 
|  X  |
| | | |

Wielka litera X oznacza, że ​​lewy drut przecina prawy drut, a mała litera x oznacza coś przeciwnego. Pierwszy i ostatni wiersz zawsze będą | | | |.... Możesz wziąć dane wejściowe jako ciąg rozdzielany przecinkami, tablicę ciągów itp. Format nie jest ścisły, o ile ma sens i nie zawiera żadnych dodatkowych informacji.

Wynik

Aby sprostać temu wyzwaniu, muszę nie tylko wiedzieć, ile czasu zajmie, ale muszę dokładnie wiedzieć, co robić. Tak więc wypisz listę par liczb całkowitych ze znakiem R lub L, bez rozróżniania wielkości liter, co oznacza, które dwa druty należy rozplątać i w którą stronę (R oznacza od prawej do lewej i odwrotnie dla L). Musisz mi powiedzieć, w jaki sposób je przekreślić; Nie potrafię tego rozgryźć. Dane wyjściowe są również dość elastyczne, pod warunkiem, że wypisujesz wszystkie pary liczb całkowitych + znak we właściwej kolejności i nie wypisujesz żadnego dodatkowego nonsensownego tekstu (nawiasy kwadratowe, przecinki itp. Są w porządku). Druty mogą mieć zero lub jeden indeks, ale indeks musi zaczynać się od lewej. Pamiętaj, że musisz rozplątać od dołu, a nie od góry. Styl wyjściowy musi być spójny, a jeśli nie jest to oczywiste, określ sposób drukowania. Przypadek postaci nie jest spójny,

Przykładowe dane wyjściowe

W powyższym przykładzie dane wyjściowe wyglądałyby następująco:

2 3 R
3 4 L
1 2 R

Format wyjściowy to lista rozdzielonych spacjami wartości nowego wiersza. Jest to indeks 1.

Dalsze specyfikacje

Prawidłowe jest ustawienie X i X pionowo na sobie w dowolnej kolejności. Ponieważ jestem leniwy, nie chcę niepotrzebnie zamieniać przewodów, więc nie wysyłaj niczego w tych przypadkach; jeśli to znajdę, delikatnie pociągnę za przewody, aby wyprostować je.

Prawidłowe jest również ustawienie wielu X i X w stosie w pionie i dopóki żaden drut nie jest zaangażowany w inne skrzyżowania, nie chcę żadnych dodatkowych ruchów (ponieważ jestem leniwy). Tak więc, jeśli znaki X X x X x xpojawiają się w kolumnie bez innych skrzyżowań, dane wyjściowe powinny być puste!

W przypadku, gdy nie jest to jasne, R eliminuje X, a L eliminuje x.

W tym samym rzędzie mogą znajdować się dwa skrzyżowania przewodów, w takim przypadku kolejność tych dwóch zamian nie ma znaczenia. Nigdy nie dostaniesz czegoś takiego | X X |(to nie ma sensu, ponieważ sugeruje, że środkowy drut przecina się po drutach zarówno po jego lewej, jak i prawej stronie).

Nie zawsze są skrzyżowania ...

Wejściem może być pojedyncza rura. Jednak dane wejściowe nigdy nie będą puste.

Najkrótsze ważne rozwiązanie wygrywa 20 grudnia!

Więcej przykładów

Tak jak obiecałam:

Przykład 1

Wejście

| | | | | |
| |  X   x 
 X  |  x  |
|  x  |  X 
 X   X  | |
| | | | | |

Wynik

1 2 R
3 4 R
2 3 L
5 6 R
1 2 R
4 5 L
3 4 R
5 6 L

Przykład 2

Wejście

| | |
 X  |
|  x 
| | |
|  X 
|  x 
| | |

Wynik

2 3 L
1 2 R

Przykład 3

Wejście

|

Dane wyjściowe są puste. Tak, musisz poradzić sobie z tą sprawą.

Przykład 4

Wejście

| |
 X 
 x 
 X 
 x 
 X 
 x 
 X 
 x 
 X 
 x 
| |

Dane wyjściowe są puste. Dla żartu :).

Przykład 5

Wejście

| |
 X 
 X 
 x 
 X 
 x 
 x 
| |

Dane wyjściowe są nadal puste ...

HyperNeutrino
źródło
4
Czy możliwe jest splątanie dwóch par przewodów w tym samym rzędzie?
James Holderness,
1
@JamesHolderness Tak, to prawda. W takim przypadku kolejność nie ma znaczenia. Wyjaśnię to w pytaniu. Dzięki!
HyperNeutrino,
@JamesHolderness Done!
HyperNeutrino,

Odpowiedzi:

1

Befunge, 173 bajtów

Dane wejściowe są odczytywane ze standardowego wejścia w dokładnym formacie podanym w opisie wyzwania, chociaż ważne jest, aby każda linia miała prawidłową długość, a ostatnia linia musi zawierać nową linię (tj. Nie tylko EOF na końcu tej linii).

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

Wypróbuj online!

Podstawową ideą tego rozwiązania jest to, że mamy „tablicę” śledzącą liczbę skrętów dla każdego drutu. Tak więc za każdym razem, gdy napotkamy skręt w jednym kierunku, zwiększamy liczbę powiązanych drutów, podczas gdy skręt w drugim kierunku zmniejsza liczbę.

W tym samym czasie, gdy przetwarzamy skręt dla konkretnego drutu, patrzymy również na liczbę skrętów dla drutów po jego lewej i prawej stronie. Jeśli którykolwiek z nich nie jest równy zero, musimy „spłukać” te zwroty na stosie, ponieważ nie będzie już możliwe ich odkręcenie przez późniejsze zwroty w przeciwnym kierunku.

Po ostatnim wierszu wejścia strumień wejściowy zwraca EOF wielokrotnie, a te znaki EOF są interpretowane jako skręty w każdym przewodzie, przynajmniej do celów płukania. Zmusza to program do opróżnienia wszystkich zaległych zliczeń w tablicy, ale nie wygeneruje żadnych nowych zliczeń skrętów.

Po zakończeniu przetwarzania danych wejściowych wszystkie polecenia rozplątywania przewodów będą teraz na stosie. Oznacza to, że możemy je po prostu zdjąć w odwrotnej kolejności, aby wyświetlić instrukcje potrzebne do rozplątania przewodów od dołu do góry.

James Holderness
źródło
To wydaje się działać idealnie. Dobra robota!
HyperNeutrino,
To jest zwycięska odpowiedź. Dobra robota! Dziękujemy również za sprawdzenie innych odpowiedzi dla mnie! :)
HyperNeutrino,
@AlexL. Dzięki. To moja pierwsza zwycięska odpowiedź na stronie. Nie sądziłem, że kiedykolwiek będzie to możliwe dzięki Befunge. :)
James Holderness
Nie ma problemu. Gratulujemy wygranej! Jestem raczej zaskoczony, jak krótko odpowiedziałeś Befunge. :)
HyperNeutrino,
5

Pyth - 26 25 bajtów

Bardzo prosto, może uda mi się pograć w filtrowanie.

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

Wypróbuj online tutaj .

Maltysen
źródło
Dobra próba. Niestety wyprowadzany znak jest nieprawidłowy; za każdym razem wydaje się być R. Dobra próba; liczby wychodzą poprawnie!
HyperNeutrino,
@AlexL. Jestem głupia, przerzuciłam argumenty na in, naprawiłam i to też uratowało mi bajt
Maltysen
Widzę. Niezła odpowiedź! Zyskaj głos. :)
HyperNeutrino
2
Jeśli się nie mylę, nie wydaje się, aby zajmowało się przypadkiem, w którym X i X są ułożone pionowo. Mówi ci, aby niepotrzebnie zamieniać przewody tam iz powrotem.
James Holderness
5

JavaScript (ES6), 178 bajtów

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

Pobiera dane wejściowe jako tablicę ciągów reprezentujących linie i zwraca tablicę tablic wartości, np [[2, 3, "R"], [3, 4, "L"], [1, 2, "R"]]. Odwrotna kolejność pomaga w eliminacjach.

Neil
źródło
Skąd się bierzesz s? Używam go na repl.it i to mówi mi, że jest ReferenceError: s is not defined.
HyperNeutrino,
@AlexL. Ups, przypadkowo wkleiłem w poprzedniej wersji mojego kodu, którego nie skończyłem grać w golfa. Powinien zostać teraz naprawiony.
Neil,
@JamesHolderness Pytanie zostało zmienione, ponieważ przesłałem odpowiedź, musiałbym ją zaktualizować.
Neil,
@JamesHolderness Yep. Przepraszam za to, Neil. Musiałem tylko wyjaśnić niektóre części pytania, których wcześniej nie wyjaśniłem.
HyperNeutrino,
@JamesHolderness Zdaję sobie z tego sprawę i dlatego oznaczyłem swoją odpowiedź jako niekonkurencyjną, ponieważ odpowiedziała na poprzednią iterację pytania, dopóki nie będę w stanie zaktualizować jej do obecnych wymagań.
Neil,
3

Python 2, 244 241 bajtów

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

Pobiera dane wejściowe jako listę ciągów

Przykład:

Wejście: ['| | | |', ' X | |', '| | x ', '| X |', ' x | |']

Wynik: [[1, 2, 'L'], [2, 3, 'R'], [3, 4, 'L'], [1, 2, 'R']]

Edycja: Naprawiono dla przypadku:

Wejście: ['| | |', ' X |', ' X |', ' x |', '| X', ' X |', ' x |', ' x |', '| | |']

Wynik: [[1, 2, 'L'], [2, 3, 'R'], [1, 2, 'R']]

TFeld
źródło
@JamesHolderness Należy teraz naprawić.
TFeld
Wygląda na to, że teraz działa poprawnie!
HyperNeutrino,
@JamesHolderness Tak, to wydaje się problemem. Proszę to naprawić, TFeld. W przeciwnym razie niezła próba!
HyperNeutrino,
@AlexL. Powinien zostać teraz naprawiony
TFeld