一条可弯曲的蛇看起来像这样:
<||=|||:)~
垂直条(每个单独序列|
)是一个弹性的蛇,被称为一个有弹性的部分,是单独地可伸展到它的宽度的两倍,并绘制具有交替斜杠(/
,\
)一次延长。
上面特定的蛇有两个这样的伸展部分,给它四个可能的姿势:
<||=|||:)~
</\/\=|||:)~
<||=/\/\/\:)~
</\/\=/\/\/\:)~
此正则表达式定义了伸展最少的伸展蛇的一般形式:
<(\|+=)*\|+:\)~
可以用以下文字表示:
<
,随后通过任何数目的序列|
的连接与=
迹象,随后:)~
。
So <|:)~
and <||:)~
and <|=|:)~
and <|=|=||=|||||=||:)~
是可弯曲的蛇,而<=:)~
and <=|:)~
and <||=:)~
and <|==||:)~
不是。
易弯曲的蛇也可以朝左而不是朝右,例如~(:|||=||>
。形式是一样的,只是被镜像。
挑战
编写一个程序,该程序使用两条彼此面对的伸缩性蛇的单行字符串,中间留有一定数量的空格。两条蛇都将处于其伸展最少的姿势(所有竖线,无斜线)。字符串将从右向蛇的尾部开始,然后从左向蛇的尾部结束(您可以选择假设还有尾随换行符)。
例如,这是一条可能的输入,在蛇之间有五个空格:
<|=||:)~.....~(:||||>
.
为了清楚起见,我使用句点()而不是实际的空格字符。
蛇之间的零间距也是有效的输入:
<|=||:)~~(:||||>
我们说蛇在舌头这样触摸时在亲吻。
您的程序需要扩展两条蛇的可拉伸部分的某种组合,以使蛇之间的间隔最少(不重叠),即蛇尽可能接近接吻。
两条蛇的尾巴都是固定的,但它们的头部和身体可以移动-根据伸展的部分,向右移动,向右移动,向左移动。
程序的输出是单行字符串(加上可选的尾随换行符),该字符串显示蛇尽可能接近接吻的位置,并为延伸的可伸展部分绘制交替的斜线代替竖线。
例如,<|=||:)~.....~(:||||>
(从上面)的输出为:
</\=||:)~~(:/\/\/\/\>
这是唯一的解决方案,因为在伸展部分的任何其他组合下,蛇会重叠或离接吻更远。
如果有多种解决方案,则输出可能是其中任何一种。
例如,如果输入是
<|=||:)~.....~(:|||=|>
输出可能是
<|=/\/\:)~~(:/\/\/\=|>
要么
</\=||:)~~(:/\/\/\=/\>
请记住,并非总是能够使蛇亲吻,但是您仍然需要使它们尽可能靠近。
例如,如果输入是
<||=||||:)~...~(:||>
输出可能是
</\/\=||||:)~.~(:||>
要么
<||=||||:)~.~(:/\/\>
如果蛇已经在接吻,则输出将与输入相同。例如
<|=||:)~~(:||||>
通常,如果任何可伸展部分的延伸会使蛇重叠,则输出将与输入相同。例如
<|||=|||:)~..~(:||||=|||||=||||||>
笔记
- 像往常一样从stdin或命令行获取输入,或编写一个带有字符串的函数。打印或返回输出。
- 如果愿意,可以
.
在输入和输出中使用句点()代替空格()。
- 在斜杠被替换的垂直条序列中交替出现斜线是唯一重要的。不管它们在蛇中的顺序是大还是先是斜线还是后斜线都没有关系。
- 可伸展的部分不能延伸一半-完全是延伸或根本没有延伸。
计分
这是代码高尔夫球。以字节为单位的最短提交获胜。决胜局是较早的答案。
>
都不会变得<
相同),但他还说:“斜线在它们替换的竖线的序列中交替出现是很重要的。不管是大蛇还是先斜线还是后斜线都没关系。” (
)