Ligue os pontos

13

Dada uma série de os representando pontos, conecte-os na vertical ou na horizontal

Exemplos

Entrada:

o   o

o

Resultado:

o---o
|
|
o

Entrada:

o   o    o

    o

Resultado:

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

Spec

  • Se você deseja que a entrada seja preenchida com espaços para formar um retângulo, especifique isso na sua resposta

  • Só haverá oespaços e novas linhas na entrada

  • Sempre haverá um par de pontos para conectar
  • Nenhum dois os será diretamente adjacente
  • Os pontos devem ser conectados com |e -, para conexões verticais e horizontais, respectivamente
  • Nenhuma conexão de ponto se sobrepõe
Downgoat
fonte
Você precisa conectar todos os pares legais ou apenas conectar os pontos em um componente? Os pontos sempre podem ser conectados em um componente? "Sempre haverá pelo menos dois pontos para conectar" faria mais sentido se eu entender direito. Alguns casos de teste também podem esclarecer isso.
Aleatório
@randomra você tem t conectar cada par legal, eles não serão sempre 1 componente
Downgoat
@Downgoat Que tal mais alguns casos de teste que abrangem componentes desconectados e loops em um único componente? ;)
Martin Ender

Respostas:

2

Japonês, 33 29 bytes

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

Teste online!

Como 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
fonte
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'?|','?-'}

Isso é absolutamente horrível. Ainda tentando jogar golfe.

Insira como um retângulo acolchoado, por favor.

Nova linha para "legibilidade":

eval"s.split($/).map(&:chars)#{".map{|x|x.join.gsub(/o +(?=o)/){|x|x.tr' ',?|}
.chars}.transpose"*2}.map(&:join)*$/".sub'?|','?-'
Maçaneta da porta
fonte
4
Tudo bem, eu vou inserir como um retângulo acolchoado, mas apenas porque você pediu muito bem.
Alex A.
Você pode usar em \bvez de (?=o)?
Justin
@ Justin Não parece funcionar. : /
Maçaneta da porta
2

Retina , 80 bytes

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

A entrada precisa ser preenchida.

Experimente online!

Explicação

O primeiro estágio é bem simples, apenas transforma todos os espaços em hífens, que são encontrados entre dois os na mesma linha.

O segundo estágio abrange os |s. Isso é um pouco mais complicado e requer grupos de equilíbrio . O olhar para trás

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

verifica se há um oanterior na mesma coluna. Lembre-se de que os lookbehinds devem ser lidos da direita para a esquerda. (.)*armazena a posição horizontal da correspondência, \D*¶verifica pulos para qualquer caractere nas linhas anteriores,o corresponde literalmente. Em seguida, (?(1)!)^(?<-1>.)*garante que a posição horizontal disso oseja a mesma.

The lookahead

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

Faz exatamente a mesma coisa na direção oposta.

Martin Ender
fonte