Соедините точки


13

Учитывая последовательность os, представляющих точки, соедините их вертикально или горизонтально

Примеры

Входные данные:

o   o

o

Выход:

o---o
|
|
o

Входные данные:

o   o    o

    o

Выход:

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

спекуляция

  • Если вы хотите, чтобы ввод с пробелами образовывал прямоугольник, укажите это в своем ответе

  • На oвходе будут только пробелы и переводы строк

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

Вы должны соединить каждую легальную пару или просто соединить точки в 1 компонент? Могут ли точки всегда быть соединены в 1 компонент? «Всегда будет по крайней мере две точки для подключения» было бы более разумно, если я правильно понял. Пара тестовых примеров тоже может их прояснить.
Рандомра

@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)!))

Ввод должен быть дополнен.

Попробуйте онлайн!

объяснение

Первый этап довольно прост, он просто превращает все пробелы в дефисы, которые находятся между двумя os в одной строке.

Второй этап охватывает |с. Это немного сложнее и требует балансировки групп . Сзади

(?<=(?(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.