점들을 이으세요 o o 산출: o—o—-o

o점을 나타내는 일련의 s가 있으면 수직 또는 수평으로 연결하십시오.

입력:

o   o

o

산출:

o---o
|
|
o

입력:

o   o    o

    o

산출:

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

투기

  • 공백으로 채워진 입력이 직사각형을 형성하도록하려면 답에서이를 지정하십시오.

  • o입력에, 공백 및 줄 바꿈 만 있습니다 .

  • 연결할 점이 항상 있습니다
  • os가 직접 인접 하지 않습니다
  • 수직 및 수평 연결의 경우 점이 |및 로 연결되어야합니다.-
  • 도트 연결이 겹치지 않습니다


답변

apt, 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.

답변

루비, 137133 바이트

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

답변

레티 나 , 80 바이트

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

입력은 채워 져야합니다.

온라인으로 사용해보십시오!

설명

첫 번째 단계는 매우 간단합니다. 모든 공백을 o같은 줄의 두 s 사이에있는 하이픈으로 바꿉니다 .

두 번째 단계는 |s를 다룹니다 . 이것은 조금 까다 롭고 균형 그룹이 필요 합니다 . 뒤돌아보기

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

o같은 열에 이전 항목 이 있는지 확인합니다 . lookbehinds는 오른쪽에서 왼쪽으로 읽어야합니다. (.)*일치하는 가로 위치를 저장하고 \D*¶, 앞 줄의 문자를 건너 뛰고 o문자 그대로 일치 하는지 확인합니다 . 그런 다음 (?(1)!)^(?<-1>.)*수평 위치 o가 같아야합니다.

예견

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

반대 방향으로 정확히 같은 일을합니다.