相互填补空白


11

给定两个字符串的输入,下划线表示相应的单词,输出带有“空白”的句子。

描述此挑战的最佳方法是举例。这是一个示例输入:

programming _____________ and code golf
programming puzzles ______ code ____

这是对应的输出:

programming ___puzzles___ and code golf
programming puzzles _and__ code golf

出于此挑战的目的,“单词”定义为一个或多个小写字母的序列,“空白”定义为一个或多个下划线(输入将始终仅包含小写字母,空格和下划线) 。输入字符串中的单词空格由单个空格分隔,并且句子中单词空格的总和将始终相等。

挑战的目的是用正确的 填充所有空白,即当用空格分隔时,在其他字符串中占据相同索引的词。

  • 如上例中的单词“ puzzles”所示,该单词必须居中于空白处—两侧均保留相同数量的下划线。

  • 如果该单词不能精确居中,则多余的下划线可能在左侧或右侧(例如,上例中的单词“ 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

很好的双向挑战。
Rɪᴋᴇʀ

Answers:


5

珀斯,30岁

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

将输入和输出作为两个字符串的列表。使用非常基本的拆分-zip-双图-中心-zip-连接方法。

在这里尝试

展开:

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
啊,经典的分割拉链双地图中心拉链联接方法。我很高兴地记得在我的Algorithms 101讲座中将它用作介绍性示例。
Martin Ender

3
@MartinBüttner是的,我对它有一些不好的记忆,因为我睡过那堂课,不得不使用重复添加附加looklook-match-add-centre方法来解决考试中的问题。
FryAmTheEggman '16

4
我去加点冷水烧伤。
马丁·恩德

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

这为每个空白加上了正确的词。我们从后面的数字开始计算当前单词的位置(?<=^(\w+ )*)(位置存储为group的深度1)。然后,提前查找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 '16

@FryAmTheEggman是的,你是对的。谢谢:)
grc

2

Ruby,共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

JavaScript,194185字节

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

Mathematica 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

Gema,208203个字符

\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` `)

将两个字符串组成的数组作为单个参数,并返回另一个两个字符串组成的数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.