Hubungkan Dots

13

Dengan serangkaian otitik yang mewakili, sambungkan secara vertikal atau horizontal

Contohnya

Memasukkan:

o   o

o

Keluaran:

o---o
|
|
o

Memasukkan:

o   o    o

    o

Keluaran:

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

Spec

  • Jika Anda ingin input yang diisi dengan spasi membentuk persegi panjang, harap tentukan ini di jawaban Anda

  • Hanya akan ada ospasi dan baris baru di input

  • Akan selalu ada sepasang titik untuk dihubungkan
  • Tidak ada dua os yang berbatasan langsung
  • Titik-titik harus dihubungkan dengan |dan -, masing-masing untuk koneksi vertikal dan horizontal
  • Tidak ada koneksi dot yang akan tumpang tindih
Downgoat
sumber
Apakah Anda harus menghubungkan setiap pasangan resmi atau hanya menghubungkan titik-titik ke dalam 1 komponen? Bisakah titik-titik itu selalu dihubungkan ke 1 komponen? "Akan selalu ada setidaknya dua titik untuk dihubungkan" akan lebih masuk akal jika saya memahaminya dengan benar. Beberapa uji kasus juga dapat menghapus ini.
randomra
@randomra Anda tidak harus menghubungkan setiap pasangan yang sah, mereka tidak akan selalu menjadi 1 komponen
Downgoat
@Downgoat Bagaimana dengan beberapa kasus uji lagi yang mencakup komponen yang terputus dan loop dalam satu komponen saja? ;)
Martin Ender

Jawaban:

2

Japt, 33 29 byte

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

Uji secara online!

Bagaimana itu bekerja

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.
Produksi ETH
sumber
2

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

Ini benar-benar mengerikan. Masih berusaha bermain golf.

Masukan sebagai kotak empuk, silakan.

Baris baru untuk "keterbacaan":

eval"s.split($/).map(&:chars)#{".map{|x|x.join.gsub(/o +(?=o)/){|x|x.tr' ',?|}
.chars}.transpose"*2}.map(&:join)*$/".sub'?|','?-'
Gagang pintu
sumber
4
Baiklah, saya akan masukan sebagai persegi panjang empuk, tetapi hanya karena Anda bertanya dengan sangat baik.
Alex A.
Bisakah Anda menggunakan \bbukan(?=o) ?
Justin
@Justin Tampaknya tidak berfungsi. : /
Gagang Pintu
2

Retina , 80 byte

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

Input harus diisi.

Cobalah online!

Penjelasan

Tahap pertama cukup sederhana, itu hanya mengubah semua ruang menjadi tanda hubung yang ditemukan antara dua os di baris yang sama.

Tahap kedua meliputi |s. Ini agak sulit dan membutuhkan kelompok penyeimbang . Terlihat di belakang

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

memeriksa apakah ada yang osebelumnya di kolom yang sama. Ingatlah bahwa tampilan harus dibaca dari kanan ke kiri. (.)*menyimpan posisi horizontal pertandingan, \D*¶memeriksa lompatan ke karakter apa pun di baris sebelumnya, ococok secara harfiah. Kemudian (?(1)!)^(?<-1>.)*memastikan posisi horizontal yang osama.

Penampang kepala

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

Melakukan hal yang persis sama ke arah yang berlawanan.

Martin Ender
sumber