Połącz kropki

13

Biorąc pod uwagę serię os reprezentujących kropki, połącz je pionowo lub poziomo

Przykłady

Wejście:

o   o

o

Wynik:

o---o
|
|
o

Wejście:

o   o    o

    o

Wynik:

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

Spec

  • Jeśli chcesz, aby dane wejściowe były wypełnione spacjami i tworzyły prostokąt, podaj to w swojej odpowiedzi

  • Na owejściu będą tylko spacje i znaki nowej linii

  • Zawsze będzie para kropek do połączenia
  • Żadne dwa onie będą bezpośrednio przylegać
  • Kropki należy łączyć odpowiednio z, |i -dla połączeń pionowych i poziomych
  • Żadne połączenia kropkowe nie będą się nakładać
Downgoat
źródło
Czy musisz połączyć każdą legalną parę, czy po prostu połączyć kropki w 1 komponencie? Czy kropki można zawsze połączyć w 1 element? „Zawsze będą co najmniej dwie kropki do połączenia” miałoby większy sens, jeśli dobrze to rozumiem. Kilka przypadków testowych również mogłoby to wyjaśnić.
randomra
@ randomra, musisz połączyć każdą legalną parę, nie zawsze będzie to 1 element
Downgoat
@Downgoat Co powiesz na kilka innych przypadków testowych, które obejmują odłączone komponenty i pętle w ramach jednego komponentu? ;)
Martin Ender

Odpowiedzi:

2

Japt, 33 29 bajtów

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

Przetestuj online!

Jak to działa

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.
ETHprodukcje
źródło
2

Rubin, 137 133 bajtów

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

To jest absolutnie okropne. Wciąż próbuję grać w golfa.

Proszę podać jako wypełniony prostokąt.

Nowa linia dla „czytelności”:

eval"s.split($/).map(&:chars)#{".map{|x|x.join.gsub(/o +(?=o)/){|x|x.tr' ',?|}
.chars}.transpose"*2}.map(&:join)*$/".sub'?|','?-'
Klamka
źródło
4
W porządku, wprowadzę jako wyściełany prostokąt, ale tylko dlatego, że tak ładnie prosiłeś.
Alex A.
Czy możesz użyć \bzamiast (?=o)?
Justin
@Justin Nie wydaje się działać. : /
Klamka
2

Siatkówka , 80 bajtów

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

Dane wejściowe należy uzupełnić.

Wypróbuj online!

Wyjaśnienie

Pierwszy etap jest dość prosty, po prostu zamienia wszystkie spacje w łączniki, które znajdują się między dwoma os w tej samej linii.

Drugi etap obejmuje |s. Jest to nieco trudniejsze i wymaga równoważenia grup . Spojrzenie

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

sprawdza, czy jest owcześniej w tej samej kolumnie. Pamiętaj, że za spojrzeniami należy czytać od prawej do lewej. (.)*zapamiętuje poziomą pozycję dopasowania, \D*¶sprawdza przeskakiwanie do dowolnego znaku w poprzednich liniach, odopasowuje dosłownie. Następnie (?(1)!)^(?<-1>.)*zapewnia, że ​​jego położenie w poziomie ojest takie samo.

Spojrzenie w przyszłość

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

Robi dokładnie to samo w przeciwnym kierunku.

Martin Ender
źródło