Conecta los puntos

13

Dada una serie de os que representan puntos, conéctelos vertical u horizontalmente

Ejemplos

Entrada:

o   o

o

Salida:

o---o
|
|
o

Entrada:

o   o    o

    o

Salida:

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

Especificaciones

  • Si desea que la entrada se rellene con espacios para formar un rectángulo, especifique esto en su respuesta

  • Solo habrá oespacios y líneas nuevas en la entrada

  • Siempre habrá un par de puntos para conectar
  • No ohabrá dos s directamente adyacentes
  • Los puntos deben estar conectados con |y -, para conexiones verticales y horizontales respectivamente
  • No se superpondrán las conexiones de puntos
Downgoat
fuente
¿Tiene que conectar cada par legal o simplemente conectar los puntos en 1 componente? ¿Pueden los puntos estar siempre conectados en 1 componente? "Siempre habrá al menos dos puntos para conectar" tendría más sentido si lo entiendo bien. Un par de casos de prueba también podrían aclararlos.
randomra
@randomra no tienes que conectar cada par legal, no siempre serán 1 componente
Downgoat
@Downgoat ¿Qué tal algunos casos de prueba más que cubren componentes desconectados y bucles dentro de un solo componente? ;)
Martin Ender

Respuestas:

2

Japt, 33 29 bytes

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

¡Pruébalo en línea!

Cómo funciona

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
fuente
2

Rubí, 137133 bytes

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

Esto es absolutamente horrible. Sigo intentando jugar al golf.

Ingrese como un rectángulo acolchado, por favor.

Nueva línea para "legibilidad":

eval"s.split($/).map(&:chars)#{".map{|x|x.join.gsub(/o +(?=o)/){|x|x.tr' ',?|}
.chars}.transpose"*2}.map(&:join)*$/".sub'?|','?-'
Pomo de la puerta
fuente
44
Muy bien, ingresaré como un rectángulo acolchado, pero solo porque lo preguntaste muy bien.
Alex A.
¿Se puede usar en \blugar de (?=o)?
Justin
@Justin no parece funcionar. : /
Pomo de la puerta
2

Retina , 80 bytes

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

La entrada debe ser acolchada.

Pruébalo en línea!

Explicación

La primera etapa es bastante simple, simplemente convierte todos los espacios en guiones que se encuentran entre dos os en la misma línea.

La segunda etapa abarca el |s. Esto es un poco más complicado y requiere grupos de equilibrio . La mirada atrás

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

comprueba que haya una oanterior en la misma columna. Recuerde que las retrospectivas deben leerse de derecha a izquierda. (.)*almacena la posición horizontal de la coincidencia, \D*¶verifica los saltos a cualquier carácter en las líneas anteriores, ocoincide literalmente. Luego (?(1)!)^(?<-1>.)*asegura que la posición horizontal de eso osea ​​la misma.

El lookahead

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

Hace exactamente lo mismo en la dirección opuesta.

Martin Ender
fuente