Verbinde die Punkte

13

oVerbinde sie mit einer Reihe von s, die Punkte darstellen, vertikal oder horizontal

Beispiele

Eingang:

o   o

o

Ausgabe:

o---o
|
|
o

Eingang:

o   o    o

    o

Ausgabe:

o---o----o
    |
    o

Spec

  • Wenn Sie möchten, dass die mit Leerzeichen aufgefüllte Eingabe ein Rechteck bildet, geben Sie dies in Ihrer Antwort an

  • oDie Eingabe enthält nur Leerzeichen und Zeilenumbrüche

  • Es wird immer ein Paar Punkte geben, um eine Verbindung herzustellen
  • Keine zwei os werden direkt benachbart sein
  • Für vertikale und horizontale Verbindungen sollten Punkte mit |und -verbunden werden
  • Es werden keine Punktverbindungen überlappen
Downgoat
quelle
Müssen Sie jedes legale Paar verbinden oder nur die Punkte in 1 Komponente verbinden? Können die Punkte immer zu einer Komponente verbunden werden? "Es werden immer mindestens zwei Punkte zu verbinden sein" wäre sinnvoller, wenn ich es richtig verstehe. Ein paar Testfälle könnten auch diese aufklären.
Randomra
@ Randomra Sie müssen nicht jedes legale Paar verbinden, sie werden nicht immer 1 Komponente sein
Downgoat
@Downgoat Wie wäre es dann mit einigen weiteren Testfällen, die getrennte Komponenten und Schleifen innerhalb einer einzelnen Komponente abdecken? ;)
Martin Ender

Antworten:

2

Japt, 33 29 Bytes

Uy eV="o +o"_rS'|} y eV,_rS'-

Online testen!

Wie es funktioniert

Uy         // Transpose rows with columns in the input.
eV="o +o"  // Set V to the regex-string "o +o", and recursively replace each match Z with:
_rS'|}     //  Z with spaces replaced with "|"s.
y          // Transpose again.
eV,        // Recursively replace matches Z of V with:
_rS'-      //  Z with spaces replaced with "-"s.
ETHproductions
quelle
2

Ruby, 137 133 Bytes

->s{eval"s.split($/).map(&:chars)#{".map{|x|x.join.gsub(/o +(?=o)/){|x|x.tr' ',?|}.chars}.transpose"*2}.map(&:join)*$/".sub'?|','?-'}

Das ist absolut schrecklich. Ich versuche immer noch Golf zu spielen.

Bitte als gepolstertes Rechteck eingeben.

Neue Zeile für "Lesbarkeit":

eval"s.split($/).map(&:chars)#{".map{|x|x.join.gsub(/o +(?=o)/){|x|x.tr' ',?|}
.chars}.transpose"*2}.map(&:join)*$/".sub'?|','?-'
Türknauf
quelle
4
Okay, ich gebe es als gepolstertes Rechteck ein, aber nur, weil du so nett gefragt hast.
Alex A.
Können Sie \banstelle von verwenden (?=o)?
Justin
@Justin Scheint nicht zu funktionieren. : /
Türklinke
2

Netzhaut , 80 Bytes

T` `-`o.+o
Tm` `|`(?<=(?(1)!)^(?<-1>.)*o\D*¶(.)*) (?=(.)*¶\D*o(?<-2>.)*$(?(2)!))

Die Eingabe muss gepolstert werden.

Probieren Sie es online!

Erläuterung

Die erste Stufe ist ziemlich einfach, sie verwandelt einfach alle Leerzeichen in Bindestriche, die zwischen zwei gefunden werden o s in derselben Zeile befinden.

Die zweite Stufe umfasst die |s. Dies ist etwas kniffliger und erfordert Bilanzkreise . Der Lookbehind

(?<=(?(1)!)^(?<-1>.)*o\D*¶(.)*)

prüft, ob oin derselben Spalte eine frühere steht. Denken Sie daran, dass Lookbehinds von rechts nach links gelesen werden sollten. (.)*Speichert die horizontale Position der Übereinstimmung, \D*¶prüft, ob in den vorhergehenden Zeilen Zeichen vorkommen, und ostimmt buchstäblich überein. Dann wird (?(1)!)^(?<-1>.)*sichergestellt, dass die horizontale Position davon ogleich ist.

Der Lookahead

(?=(.)*¶\D*o(?<-2>.)*$(?(2)!))

Tut genau das Gleiche in die entgegengesetzte Richtung.

Martin Ender
quelle