Підключіть точки


13

Дано серію os, що представляє точки, з'єднайте їх вертикально або горизонтально

Приклади

Вхід:

o   o

o

Вихід:

o---o
|
|
o

Вхід:

o   o    o

    o

Вихід:

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

Спец

  • Якщо ви хочете, щоб на вкладеному вкладеному пробілом вигляді було прямокутник, укажіть це у своїй відповіді

  • У oвході будуть лише пробіли та нові рядки

  • Завжди знайдеться пара крапок для підключення
  • Ні два os не будуть безпосередньо суміжними
  • Точки повинні бути пов'язані з |і -, для вертикальних і горизонтальних з'єднань відповідно
  • Жодні точкові з'єднання не перекриватимуться

Чи потрібно підключати кожну законну пару або просто з'єднувати точки в 1 компонент? Чи завжди точки можна з'єднати в 1 компонент? "Завжди знайдеться принаймні дві крапки для підключення", було б більше сенсу, якщо я правильно це зрозумію. Кілька тестових випадків теж можуть їх усунути.
randomra

@randomra у вас немає підключення кожної законної пари, вони не завжди будуть 1 компонентом
Downgoat

@Downgoat Як щодо ще декількох тестових випадків, які охоплюють відключені компоненти та петлі в межах одного компонента? ;)
Мартін Ендер

Відповіді:


2

Japt, 33 29 байт

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

Перевірте це в Інтернеті!

Як це працює

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

Рубі, 137 133 байт

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

Це абсолютно жахливо. Ще намагаюся займатися гольфом.

Введіть, будь ласка, прямокутник із забиткою.

Новий рядок "читабельності":

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

4
Добре, я буду вводити прямокутник, але тільки тому, що ви так красиво запитали.
Алекс А.

Ви можете використовувати \bзамість (?=o)?
Джастін

@Justin, здається, не працює. : /
Дверна ручка

2

Сітківка , 80 байт

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

Вхідні дані повинні бути прокладені.

Спробуйте в Інтернеті!

Пояснення

Перший етап досить простий, він просто перетворює всі пробіли в дефіси, які знаходяться між двома oв одному рядку.

Другий етап охоплює |s. Це трохи складніше і вимагає балансування груп . Погляд позаду

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

перевіряє наявність oраніше в цьому ж стовпці. Пам’ятайте, що погляд ззаду слід читати справа наліво. (.)*зберігає горизонтальне положення сірника, \D*¶перевіряє перехід до будь-якого символу в попередніх рядках, oзбігається буквально. Потім (?(1)!)^(?<-1>.)*переконайтесь, що горизонтальне положення того oсамого.

Локахед

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

Робить точно те саме у зворотному напрямку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.