Unisci i punti


13

Data una serie di o punti che rappresentano i punti, collegarli verticalmente o orizzontalmente

Esempi

Ingresso:

o   o

o

Produzione:

o---o
|
|
o

Ingresso:

o   o    o

    o

Produzione:

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

Spec

  • Se vuoi che l'input riempito di spazi formi un rettangolo, specifica questo nella tua risposta

  • Ci sarà solo o spazi e newline nell'input

  • Ci saranno sempre un paio di punti da collegare
  • No due o ci saranno secondi direttamente adiacenti
  • I punti devono essere collegati con |e- , rispettivamente per connessioni verticali e orizzontali
  • Nessuna connessione punto si sovrapporrà

Devi connettere ogni coppia legale o semplicemente collegare i punti in 1 componente? I punti possono sempre essere collegati in 1 componente? "Ci saranno sempre almeno due punti da collegare" avrebbe più senso se lo capissi bene. Un paio di casi di test potrebbero chiarire anche questi.
randomra,

@randomra non devi connettere ogni coppia legale, non saranno sempre 1 componente
Downgoat

@Downgoat Che ne dici di altri casi di test che coprono componenti e loop disconnessi all'interno di un singolo componente? ;)
Martin Ender,

Risposte:


2

Japt, 33 29 byte

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

Provalo online!

Come funziona

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.

2

Rubino, 137 133 byte

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

Questo è assolutamente orribile. Sto ancora cercando di giocare a golf.

Inserisci come un rettangolo imbottito, per favore.

Newline per "leggibilità":

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

4
Bene, inserirò un rettangolo imbottito, ma solo perché me l'hai chiesto così bene.
Alex A.

Puoi usare \binvece di (?=o)?
Giustino,

@Justin Non sembra funzionare. : /
Maniglia della porta

2

Retina , 80 byte

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

L'ingresso deve essere imbottito.

Provalo online!

Spiegazione

Il primo stadio è piuttosto semplice, trasforma semplicemente tutti gli spazi in trattini che si trovano tra due o secondi nella stessa linea.

La seconda fase riguarda la |s. Questo è un po 'più complicato e richiede gruppi di bilanciamento . Lo sguardo dietro

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

controlla che ci sia un oprecedente nella stessa colonna. Ricorda che i lookbehinds dovrebbero essere letti da destra a sinistra. (.)*memorizza la posizione orizzontale della corrispondenza, \D*¶controlla il passaggio a qualsiasi carattere nelle righe precedenti, le opartite letteralmente. Poi(?(1)!)^(?<-1>.)* assicura che la posizione orizzontale osia la stessa.

Lo sguardo

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

Fa esattamente la stessa cosa nella direzione opposta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.