Relier les points

13

Étant donné une série de os représentant des points, connectez-les verticalement ou horizontalement

Exemples

Contribution:

o   o

o

Production:

o---o
|
|
o

Contribution:

o   o    o

    o

Production:

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

Spec

  • Si vous souhaitez que l'entrée remplie d'espaces forme un rectangle, veuillez le spécifier dans votre réponse

  • Il n'y aura que des oespaces et des nouvelles lignes dans l'entrée

  • Il y aura toujours une paire de points pour se connecter
  • Aucun deux one sera directement adjacent
  • Les points doivent être connectés avec |et -, pour les connexions verticales et horizontales respectivement
  • Aucune connexion par points ne se chevauchera
Downgoat
la source
Devez-vous connecter chaque paire légale ou simplement connecter les points en 1 composant? Les points peuvent-ils toujours être connectés en 1 composant? "Il y aura toujours au moins deux points à connecter" aurait plus de sens si je comprends bien. Quelques cas de test pourraient également les éclaircir.
randomra
@randomra vous n'avez pas à connecter toutes les paires légales, elles ne seront pas toujours à 1 composant
Downgoat
@Downgoat Que diriez-vous alors de plus de cas de test qui couvrent les composants déconnectés et les boucles dans un seul composant? ;)
Martin Ender

Réponses:

2

Japt, 33 29 octets

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

Testez-le en ligne!

Comment ça fonctionne

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
la source
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'?|','?-'}

C'est absolument horrible. J'essaie toujours de jouer au golf.

Saisissez un rectangle rembourré, s'il vous plaît.

Nouvelle ligne pour la "lisibilité":

eval"s.split($/).map(&:chars)#{".map{|x|x.join.gsub(/o +(?=o)/){|x|x.tr' ',?|}
.chars}.transpose"*2}.map(&:join)*$/".sub'?|','?-'
Poignée de porte
la source
4
D'accord, je vais saisir un rectangle rembourré, mais uniquement parce que vous l'avez demandé si gentiment.
Alex A.
Pouvez-vous utiliser à la \bplace de (?=o)?
Justin
@Justin ne semble pas fonctionner. : /
Poignée de porte
2

Rétine , 80 octets

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

L'entrée doit être complétée.

Essayez-le en ligne!

Explication

La première étape est assez simple, elle transforme simplement tous les espaces en traits d'union qui se trouvent entre deux os sur la même ligne.

La deuxième étape porte sur l' |art. C'est un peu plus délicat et nécessite des groupes d'équilibrage . Le regard derrière

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

vérifie qu'il y a un oprécédent dans la même colonne. N'oubliez pas que les regards arrière doivent être lus de droite à gauche. (.)*stocke la position horizontale de la correspondance, \D*¶vérifie le saut à n'importe quel caractère dans les lignes précédentes, ocorrespond littéralement. (?(1)!)^(?<-1>.)*S'assure ensuite que la position horizontale de celui-ci oest la même.

Le lookahead

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

Fait exactement la même chose dans la direction opposée.

Martin Ender
la source