Kết nối các dấu chấm


13

Cho một loạt các odấu chấm đại diện, kết nối chúng theo chiều dọc hoặc chiều ngang

Ví dụ

Đầu vào:

o   o

o

Đầu ra:

o---o
|
|
o

Đầu vào:

o   o    o

    o

Đầu ra:

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

Thông số kỹ thuật

  • Nếu bạn muốn đầu vào được đệm bằng khoảng trắng để tạo thành một hình chữ nhật, vui lòng chỉ định điều này trong câu trả lời của bạn

  • Sẽ chỉ có o, khoảng trắng và dòng mới trong đầu vào

  • Sẽ luôn có một cặp dấu chấm để kết nối
  • Không có hai os sẽ liền kề nhau
  • Các dấu chấm phải được kết nối với |-, cho các kết nối dọc và ngang tương ứng
  • Không có kết nối chấm sẽ chồng chéo

Bạn có phải kết nối mọi cặp hợp pháp hoặc chỉ kết nối các dấu chấm thành 1 thành phần? Các dấu chấm luôn có thể được kết nối thành 1 thành phần? "Sẽ luôn có ít nhất hai dấu chấm để kết nối" sẽ có ý nghĩa hơn nếu tôi hiểu đúng. Một vài trường hợp thử nghiệm cũng có thể làm rõ những điều này.
Randomra

@randomra bạn không kết nối được mọi cặp hợp pháp, chúng sẽ không luôn là 1 thành phần
Downgoat

@Downgoat Làm thế nào về một số trường hợp kiểm tra bao gồm các thành phần và vòng lặp bị ngắt kết nối trong một thành phần sau đó? ;)
Martin Ender

Câu trả lời:


2

Japt, 33 29 byte

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

Kiểm tra nó trực tuyến!

Làm thế nào nó hoạt động

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

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

Điều này là hoàn toàn khủng khiếp. Vẫn đang cố chơi golf.

Đầu vào như một hình chữ nhật đệm, xin vui lòng.

Dòng mới cho "khả năng đọc":

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

4
Được rồi, tôi sẽ nhập dưới dạng hình chữ nhật có đệm, nhưng chỉ vì bạn hỏi quá hay.
Alex A.

Bạn có thể sử dụng \bthay vì (?=o)?
Justin

@Justin Không xuất hiện để làm việc. : /
Doorknob

2

Võng mạc , 80 byte

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

Đầu vào cần phải được đệm.

Hãy thử trực tuyến!

Giải trình

Giai đoạn đầu tiên khá đơn giản, nó chỉ biến tất cả các không gian thành dấu gạch nối được tìm thấy giữa hai o s trên cùng một dòng.

Giai đoạn thứ hai bao gồm các |s. Đây là một chút phức tạp hơn và đòi hỏi các nhóm cân bằng . Cái nhìn

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

kiểm tra xem có osớm hơn trong cùng một cột. Hãy nhớ rằng lookbehind nên được đọc từ phải sang trái. (.)*lưu trữ vị trí ngang của trận đấu, \D*¶kiểm tra bỏ qua bất kỳ ký tự nào trong các dòng trước, okhớp theo nghĩa đen. Sau đó, (?(1)!)^(?<-1>.)*đảm bảo rằng vị trí ngang của đó olà như nhau.

Cái nhìn

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

Không chính xác điều tương tự theo hướng ngược lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.