공백을 상호 채우십시오


11

해당 단어를 나타내는 밑줄 시퀀스가있는 두 개의 문자열을 입력하면 "공백"이 채워진 문장이 출력됩니다.

이 과제를 설명하는 가장 좋은 방법은 예입니다. 입력 예는 다음과 같습니다.

programming _____________ and code golf
programming puzzles ______ code ____

다음은 해당 출력입니다.

programming ___puzzles___ and code golf
programming puzzles _and__ code golf

이 과제를 위해 "단어"는 하나 이상의 소문자 시퀀스로 정의되고 "공백"은 하나 이상의 밑줄로 정의됩니다 (입력에는 항상 소문자, 공백 및 밑줄 만 포함됨). . 입력 문자열의 단어공백 은 단일 공백으로 구분되며 문장 의 단어공백 수의 합계 는 항상 같습니다.

도전의 목적은 공백 으로 나눌 때 다른 문자열에서 동일한 색인을 차지하는 단어 인 올바른 단어로 모든 공백 을 채우는 것입니다 .

  • 위의 예에서 "퍼즐"이라는 단어와 같이 단어는 공백의 가운데에 있어야합니다. 양쪽에 동일한 수의 밑줄이 남아 있습니다.

  • 단어를 정확하게 가운데에 맞출 수 없으면 추가 밑줄이 왼쪽이나 오른쪽에있을 수 있습니다 (예 : 위의 예에서 "and"라는 단어).

  • 단어에 맞는 밑줄은 항상 충분하지만 단어의 길이와 정확히 일치 할 수 있습니다 (예 : 위의 예에서 "golf").

  • 두 문자열에서 같은 위치에 공백이 없습니다.

입력 / 출력은 다음 중 하나 일 수 있습니다 (입력 / 출력이 반드시 동일한 방법을 통할 필요는 없음).

  • 영문자, 공백 또는 밑줄이 아닌 문자로 구분 된 단일 문자열 (예 : 개행 또는 쉼표로 구분 된 문자열)

  • 배열 / 목록 / 등 두 줄의

  • 두 함수 / 명령 줄 인수 (입력 만 해당)

이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.

위의 예는 테스트 사례로 사용할 수 있습니다. 다음은 더 큰 테스트 사례입니다 (출력의 두 번째 문자열은 다른 센터링 동작으로 인해 약간 다를 수 있음).

lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum

lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum

멋진 bidiurnal 도전.
Rɪᴋᴇʀ

답변:


5

피스, 30

jL;Cmm|*}J\_k.[lkhx#JdJkdCcR;Q

입력 및 출력을 두 문자열의 목록으로 취합니다. 아주 기본적인 split-zip–double map–centre–zip-join 접근법을 사용합니다.

여기 사용해보십시오

넓히는:

jL;Cmm|*}J\_k.[lkhx#JdJkdCcR;Q   ##
                          cR;Q   ##  split
                         C       ##  zip
    mm                           ##  double map
      |*}J\_k.[lkhx#JdJkd        ##  centre
   C                             ##  zip
jL;                              ##  join

나는 split-zip-double map-centre-zip-join 접근 방식과 모든 것의 편재 함을 감안할 때, 더 이상 골프를 칠 수 없다는 것에 정말로 만족하면 더 설명 할 것이다.


8
Ahhh, 클래식 스플릿 지퍼 더블 맵 센터 지퍼 조인 방식. 나는 이것이 알고리즘 101 강의에서 입문 예제로 사용 된 것을 좋아합니다.
Martin Ender 2016 년

3
@ MartinBüttner 그래, 나는 그 수업을 잤기 때문에 나쁜 추억을 가지고있다. 대신 중복 Append-LookBack-Match-Add-Centre 접근법을 사용하여 시험의 문제를 해결해야했다.
FryAmTheEggman

4
화상에 찬물을 바르겠습니다.
Martin Ender 2016 년

7

망막 , 102 100 93 88 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

$
!¶$`
m`(?<=^(\w+ )*)(?=_.*¶(?<-1>\w+ )*(\w+))
$2
(([a-z])+)(?<-2>_)*(_*)\3|!\D+
$3$1$3

줄은 줄 바꿈으로 구분됩니다. 홀수의 밑줄이 남아 있으면 해당 단어 뒤에 단어가 표시됩니다.

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

설명

나는 이것이 "중복 추가-룩백-일치-추가 센터 접근 방식"또는 가까운 것 같아 ...

$
!¶$`

입력을 복제하여 시작합니다 (와 !줄 바꿈으로 구분). 이것의 목적은 두 번째 줄을 따로 처리하지 않고 다음 줄 에서 단어를 가져와 두 줄을 모두 처리 할 수 ​​있다는 것 입니다.

m`(?<=^(\w+ )*)(?=_.*¶(?<-1>\w+ )*(\w+))
$2

이것은 각 단어마다 올바른 단어를 추가합니다. 우리는 현재 단어 위치를 lookbehind로 세는 것으로 시작합니다 (?<=^(\w+ )*)(위치는 그룹의 깊이로 저장됩니다 1). 그런 다음 lookahead a)는을 일치시켜 틈의 시작 부분에 있는지 확인한 _다음으로 다음 줄로 건너 뛰고 .*¶올바른 (?<-1>\w+ )*위치에 도달하기 위해 올바른 단어 수를 (\w+)찾습니다. 그룹 2.

(([a-z])+)(?<-2>_)*(_*)\3|!\D+
$3$1$3

이 단계는 다음 세 가지를 수행합니다.

  • 각 단어 길이에 해당하는 밑줄을 제거합니다. 이는 그룹으로 단어의 길이를 계산하여 수행 2으로 ([a-z])+많은 밑줄을 (다시 작성되지 않습니다하는) 다음 일치.
  • 나머지 밑줄의 절반을 캡처 (_*)\3하고 $3$1$3다시 써서 단어를 간격의 중심으로 이동합니다 .
  • 중복 된 입력을 일치 !\D+시키지 않고 대체하여 입력을 제거합니다 .

4

파이썬 2, 109

def f(a,b):exec"print' '.join([x,y][x<'`'].center(len(x),'_')for x,y in zip(a.split(),b.split()));a,b=b,a;"*2

이 함수는 두 개의 문자열을 인수로 사용하여 예제와 같이 출력을 인쇄합니다. 그것은 지루한 접근법을 사용하며 str.center(width, fillchar)대부분의 작업을 수행합니다.

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


1
z인쇄 및 인라인 후에 스왑을 수행 할 수있는 것을 놓치지 않는 한 필요하지 않다고 생각합니다 z.
FryAmTheEggman

@FryAmTheEggman 네, 맞습니다. 감사합니다 :)
grc

2

루비, 111 개 109 문자

->l{l.map(&:split).transpose.map{|c|c[m=c[0]<c[1]?0:1]=c[1-m].center c[m].size,?_
c}.transpose.map{|s|s*' '}}

입력 : 2 개의 문자열 배열; 출력 : 2 개의 문자열 배열.

샘플 실행 :

2.1.5 :001 > puts ->l{l.map(&:split).transpose.map{|c|c[m=c[0]<c[1]?0:1]=c[1-m].center c[m].size,?_;c}.transpose.map{|s|s*' '}}[[
2.1.5 :002 >       'programming _____________ and code golf',
2.1.5 :003 >       'programming puzzles ______ code ____',
2.1.5 :004 >       ]]
programming ___puzzles___ and code golf
programming puzzles _and__ code golf

1

자바 스크립트, 194 185 바이트

f=(m,n)=>(m=m.split` `,n=n.split` `,G=(x,i,a)=>x[0]!='_'?x:(b=(a?n:m)[i],s=x.length-b.length,(k='_'.repeat(s/2))+b+k+(s%2?'_':'')),H=(e,y)=>e.map((x,i)=>G(x,i,y)).join` `,[H(m,1),H(n)])

두 개의 문자열을 매개 변수로 사용하고 두 개의 문자열을 배열 / 목록으로 출력


1

매스 매 티카 223

이 작업을 수행하는 더 짧은 방법이 있어야합니다.

k=StringLength;m=StringSplit;
g=Partition[Riffle[m@#,m@#2],2]/.{{a_,a_}:> a<>" ",{a_,b_/; StringTake[b,1]=="_"}:> a<>" ",
{a_,b_}:>Table["_",Ceiling[z=(k@a-k@b)/2]]<>b<>""<>Table["_",Floor@z]<>" "}&;
s_~h~t_:={""<>g[s,t],""<>g[t,s]}

샘플 런

h["programming _____________ and code golf", "programming puzzles ______ code ____"]

여기에 이미지 설명을 입력하십시오


0

제마, 208 개 203 문자

\B=@set{i;0}
<I>=@push{${v;f};$0}@incr{i}
\n=@set{v;s}@set{i;0}
 =
\E=@repeat{$i;@cmps{$f;$s;@set{f;@fill-center{$f;$s}};;@set{s;@fill-center{$s;$f}}}@set{F;$f ${F;}}@set{S;$s ${S;}}@pop{f}@pop{s}}$F\n$S

Gema가이 작업에 완벽한 기능을 가지고 있기 때문에 : .@fill-center{background;value}

입력 : 2 개의 줄 바꿈으로 구분 된 줄 (마지막 줄 바꿈 없음); 출력 : 줄 바꿈으로 구분 된 줄 2 개 (후미 공백이있는 것으로 금지되지 않은 것).

샘플 실행 :

bash-4.3$ echo -ne 'programming _____________ and code golf\nprogramming puzzles ______ code ____' |
> gema '\B=@set{i;0};<I>=@push{${v;f};$0}@incr{i};\n=@set{v;s}@set{i;0}; =;\E=@repeat{$i;@cmps{$f;$s;@set{f;@fill-center{$f;$s}};;@set{s;@fill-center{$s;$f}}}@set{F;$f ${F;}}@set{S;$s ${S;}}@pop{f}@pop{s}}$F\n$S'
programming ___puzzles___ and code golf 
programming puzzles _and__ code golf 

0

C, 197 바이트

#define c(w,y)l=strspn(w,"_"),r=strcspn(y," "),memcpy(w+(l-r)/2,y,r),w+=l,y+=r;
main(l,v,w,y,r)char**v,*w,*y;{for(w=v[1],y=v[2];*w;w++,y++)if(*w^*y)if(*w^95)c(y,w)else c(w,y)puts(v[1]);puts(v[2]);}

산출

$ ./a.out "lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum" "lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum"
lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum

0

ES6, 122 바이트

a=>a.map(s=>s.split` `).map((s,n,a)=>s.map((w,i)=>w<'a'?(l=w.length,t=w+a[n^1][i]+w,t.substr(t.length-l>>1,l)):w).join` `)

두 문자열의 배열을 단일 매개 변수로 취하고 두 문자열의 다른 배열을 리턴합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.