Hilf mir, diese Drähte zu entwirren!

12

Meine Drähte sind alle verwickelt!

Ist es nicht ärgerlich, wenn sich die Drähte verheddern? Nun, das ist mir gerade passiert, also möchte ich mir helfen, sie zu entwirren! Zur Vereinfachung habe ich sie alle vom Gerät getrennt, aber sie sind immer noch mit der Steckdose verbunden. Ihre Herausforderung besteht darin, herauszufinden, wie Sie sie entwirren können!

Eingang

Die Eingabe besteht aus Leerzeichen, Pipes und Xs (beide Fälle). Die Eingabe sieht ungefähr so ​​aus:

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

Ein großes X bedeutet, dass die linke Leitung die rechte Leitung kreuzt und ein kleines x das Gegenteil bedeutet. Die erste und letzte Zeile wird immer sein | | | |.... Sie können die Eingabe als durch Kommas getrennte Zeichenfolge, als Array von Zeichenfolgen usw. interpretieren. Das Format ist nicht streng, solange es sinnvoll ist und keine zusätzlichen Informationen enthält.

Ausgabe

Für diese Herausforderung muss ich nicht nur wissen, wie lange ich brauche, sondern auch genau wissen, was zu tun ist. Geben Sie also eine Liste von ganzzahligen Paaren mit dem Zeichen R oder L aus, wobei die Groß- und Kleinschreibung nicht berücksichtigt wird. Dabei wird angegeben, welche beiden Drähte auf welche Weise entwirrt werden sollen (R bedeutet rechts über links und umgekehrt für L). Sie müssen mir sagen, wie ich sie auflösen soll. Ich kann das nicht selbst herausfinden. Die Ausgabe ist auch ziemlich flexibel, solange Sie alle Ganzzahlpaare + Zeichen in der richtigen Reihenfolge ausgeben und keinen zusätzlichen Unsinntext ausgeben (Klammern, Kommas usw. sind in Ordnung). Die Drähte können null oder eins sein, der Index muss jedoch von links beginnen. Beachten Sie, dass Sie von unten, nicht von oben entwirren müssen. Der Ausgabestil muss konsistent sein. Wenn dies nicht offensichtlich ist, geben Sie bitte an, wie Sie ausgeben. Der Fall des Zeichens muss nicht konsistent sein,

Beispielausgabe

Für die obige Beispieleingabe würde die Ausgabe ungefähr so ​​aussehen:

2 3 R
3 4 L
1 2 R

Das Ausgabeformat ist hier eine durch Zeilenumbrüche getrennte Liste von durch Leerzeichen getrennten Werten. Dies ist 1-indiziert.

Weitere Spezifikationen

Es ist gültig, X und x in beliebiger Reihenfolge vertikal übereinander zu stapeln. Da ich faul bin, möchte ich die Kabel nicht unnötig vertauschen. Geben Sie für diese Fälle nichts aus. Wenn ich das finde, ziehe ich leicht an den Drähten, um sie gerade zu machen.

Es ist auch gültig, mehrere X und x vertikal zu stapeln, und solange kein Draht an anderen Kreuzungen beteiligt ist, möchte ich keine zusätzlichen Bewegungen (weil ich faul bin). Wenn also die Zeichen X X x X x xin einer Spalte ohne andere Kreuzungen angezeigt werden, sollte die Ausgabe immer noch leer sein!

Falls dies nicht klar ist, eliminiert R X und L eliminiert x.

In derselben Reihe können sich zwei Drahtkreuzungen befinden. In diesem Fall spielt die Reihenfolge dieser beiden Tauschvorgänge keine Rolle. Sie werden niemals so etwas bekommen | X X |(dies ist nicht sinnvoll, da dies impliziert, dass der mittlere Draht sowohl links als auch rechts über den Drähten gekreuzt wird).

Es gibt nicht immer Kreuzungen ...

Die Eingabe kann eine einzelne Pipe sein. Die Eingabe wird jedoch niemals leer sein.

Kürzeste gültige Lösung gewinnt am 20. Dezember!

Mehr Beispiele

Wie ich es versprochen habe:

Beispiel 1

Eingang

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

Ausgabe

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

Beispiel 2

Eingang

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

Ausgabe

2 3 L
1 2 R

Beispiel 3

Eingang

|

Die Ausgabe ist leer. Ja, Sie müssen sich mit diesem Fall befassen.

Beispiel 4

Eingang

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

Die Ausgabe ist leer. Nur zum Spaß :).

Beispiel 5

Eingang

| |
 X 
 X 
 x 
 X 
 x 
 x 
| |

Die Ausgabe ist noch leer ...

HyperNeutrino
quelle
4
Ist es möglich, zwei Adernpaare in einer Reihe zu verwickeln?
James Holderness
1
@ JamesHolderness Ja, das ist es. In diesem Fall spielt die Reihenfolge keine Rolle. Ich werde das in der Frage klarstellen. Vielen Dank!
HyperNeutrino
@ JamesHolderness Fertig!
HyperNeutrino

Antworten:

0

Befunge, 173 Bytes

Die Eingabe wird von stdin in dem genauen Format gelesen, das in der Challenge-Beschreibung angegeben ist. Es ist jedoch entscheidend, dass jede Zeile die richtige Länge hat und die letzte Zeile eine neue Zeile enthält (dh nicht nur EOF am Ende dieser Zeile).

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

Probieren Sie es online!

Die Grundidee für diese Lösung ist, dass wir ein "Array" haben, das die Verdrillungszahlen für jeden Draht verfolgt. Jedes Mal, wenn wir auf eine Verdrehung in eine Richtung stoßen, erhöhen wir den Zählwert für den zugehörigen Draht, während eine Verdrehung in die andere Richtung den Zählwert verringert.

Während wir die Verdrillung für einen bestimmten Draht verarbeiten, prüfen wir auch die Verdrillungszahl für die Drähte links und rechts davon. Wenn einer von ihnen nicht Null ist, müssen wir diese Drehungen auf den Stapel "spülen", da es nicht länger möglich ist, dass sie durch spätere Drehungen in die entgegengesetzte Richtung entwirrt werden.

Nach der letzten Eingabezeile gibt der Eingabestream wiederholt EOF zurück, und diese EOF-Zeichen werden zumindest zum Zwecke des Spülens als Verdrehungen in jeder Leitung interpretiert. Dadurch wird das Programm gezwungen, alle ausstehenden Zählungen im Array zu löschen, es werden jedoch keine neuen Verdrehungszählungen generiert.

Sobald wir die Eingabe verarbeitet haben, befinden sich alle Befehle zum Entwirren der Drähte auf dem Stapel. Dies bedeutet, dass wir sie einfach in umgekehrter Reihenfolge entfernen können, um die Anweisungen zum Entwirren der Drähte von unten nach oben auszugeben.

James Holderness
quelle
Dies scheint perfekt zu funktionieren. Gut gemacht!
HyperNeutrino
Dies ist die gewinnende Antwort. Gut gemacht! Vielen Dank auch, dass Sie die anderen Antworten für mich überprüft haben! :)
HyperNeutrino
@AlexL. Vielen Dank. Dies ist meine erste gewinnende Antwort auf der Website. Hätte nicht gedacht, dass das mit Befunge jemals möglich sein würde. :)
James Holderness
Kein Problem. Herzlichen Glückwunsch zum Sieg! Ich bin ziemlich überrascht, wie kurz Sie eine Befunge-Antwort gemacht haben. :)
HyperNeutrino
4

Pyth - 26 25 Bytes

Sehr einfach, vielleicht kann ich die Filterung spielen.

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

Probieren Sie es hier online aus .

Maltysen
quelle
Guter Versuch. Leider ist das ausgegebene Zeichen nicht korrekt. es scheint jedes Mal R zu sein. Guter Versuch aber; die zahlen kommen richtig raus!
HyperNeutrino
@AlexL. Ich bin dumm, ich hatte die Argumente umgedreht in, behoben, und es hat mir auch ein Byte gespart
Maltysen
Aha. Gute Antwort! Habe eine Gegenstimme. :)
HyperNeutrino
2
Wenn ich mich nicht irre, scheint dies nicht den Fall zu behandeln, in dem Sie X und x vertikal gestapelt haben. Es sagt Ihnen, dass Sie die Drähte unnötigerweise hin und her tauschen müssen.
James Holderness
4

JavaScript (ES6), 178 Byte

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

Nimmt Eingaben als ein Array von Zeichenfolgen, die Linien darstellen, und gibt ein Array von Arrays von Werten zurück, z [[2, 3, "R"], [3, 4, "L"], [1, 2, "R"]]. Die umgekehrte Reihenfolge hilft bei den Eliminierungen.

Neil
quelle
Woher kommst du s? Ich führe es auf repl.it aus und sage mir, dass es eine gibt ReferenceError: s is not defined.
HyperNeutrino
@AlexL. Hoppla, ich habe versehentlich die vorherige Version meines Codes eingefügt, die ich noch nicht zu Ende gespielt hatte. Sollte jetzt behoben sein.
Neil
@JamesHolderness Die Frage wurde geändert, seitdem ich meine Antwort gesendet habe. Ich muss sie aktualisieren.
Neil
@ JamesHolderness Yep. Tut mir leid, Neil. Ich musste nur einige Teile der Frage klären, die ich vorher nicht geklärt hatte.
HyperNeutrino
@JamesHolderness Mir ist klar, dass ich meine Antwort als nicht konkurrierend markiert habe, da sie eine vorherige Iteration der Frage beantwortet hat, bis ich sie auf die aktuellen Anforderungen aktualisieren kann.
Neil
2

Python 2, 244 241 Bytes

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

Übernimmt die Eingabe als Liste von Zeichenfolgen

Beispiel:

Eingang: ['| | | |', ' X | |', '| | x ', '| X |', ' x | |']

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

Bearbeiten: Für den Fall behoben:

Eingang: ['| | |', ' X |', ' X |', ' x |', '| X', ' X |', ' x |', ' x |', '| | |']

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

TFeld
quelle
@ JamesHolderness Sollte jetzt behoben sein.
TFeld
Das sieht so aus, als würde es jetzt richtig funktionieren!
HyperNeutrino
@ JamesHolderness Ja, das scheint ein Problem zu sein. Bitte beheben Sie das, TFeld. Ansonsten netter Versuch!
HyperNeutrino
@AlexL. Sollte jetzt behoben sein
TFeld