合并两个字符串


18

介绍

假设S 1 = a...bS 2 = ..c..。如果我们将它们放在彼此之上,则会得到:

a...b
..c..

我们合并两个字符串,以.液体字符(可以重叠)作为。我们得到这个:

a.c.b

如果其中一个字符串比另一个字符串长,我们将应用相同的算法:

a.....b
..c..  

becomes:

a.c...b

a.....b
..c.......

becomes:

a.c...b...

如果两个字符冲突,我们只使用底部字符,例如

a..b
...c

becomes:

a..c

任务

给定两个非空字符串,输出合并的字符串。注意,您可以假定输入仅包含句点小写字母(如果更方便,则输入大写字母)。

测试用例

Input              Output
a....b ..c...      a.c..b
aaaaaa bbbbbb      bbbbbb
ab.ab. b.b.b.      bbbab.
a.......b c        c.......b

这是,因此以最少的字节提交为准!


a.....b ..c.......可以输入吗?那么输出是什么?
Luis Mendo

@DonMuesli那会变成a.c...b...
阿德南

我们可以输出字符列表而不是字符串吗?
Denker

@DenkerAffe不,对不起
Adnan

可以按相反的顺序取弦吗?
Mego

Answers:


10

果冻,5个字节

Œu»Œl

通过命令行参数输入。

在线尝试!

说明

这是我的CJam答案的直接端口(请参阅此说明以了解其工作原理):

Œu     # Convert first argument to upper case.
  »    # Element-wise maximum between both strings.
   Œl  # Convert result back to lower case.

5
不!您也不能采用果冻!我们将把所有的mod留作高尔夫大师。
Rɪᴋᴇʀ

@rikerw哈哈,你为什么认为他们是mod?因为他们擅长高尔夫:P

3
@RikerW我只需要通过将自己的解决方案移植到Jelly来抢先击败别人。¯\ _(ツ)_ /¯
马丁安德

15

CJam,9个字节

leul.e>el

在这里测试。

说明

利用的事实'.' < upper case letters < lower case letters。这样,当在两个字符串之间采用元素方式的最大值时,任何字母都将覆盖a .,但是如果我们将第一个输入大写,则可以使第二个输入的字母覆盖第一个输入的字母。令人困惑?这是一个测试用例作为示例:

ab.ab.
b.b.b.

首先转换为大写:

AB.AB.
b.b.b.

以元素为单位的最大值:

bBbAb.

转换回小写:

bbbab.

代码是如何做到的:

l    e# Read first line.
eu   e# Convert to upper case.
l    e# Read second line.
.e>  e# Take element-wise maximum. If the lengths are different, the additional elements
     e# from the longer list are just appended.
el   e# Convert back to lower case.

4
不错eu/ el把戏!
路易斯·门多

6

JavaScript的ES6,52 55个字符

(a,b)=>b.replace(/\./g,(m,i)=>a[i]||m)+a.slice(b.length)

测试

f=(a,b)=>b.replace(/\./g,(m,i)=>a[i]||m)+a.slice(b.length)
;`
a....b ..c...      a.c..b
aaaaaa bbbbbb      bbbbbb
ab.ab. b.b.b.      bbbab.
a.......b c        c.......b
c a....b           a....b
`.split('\n').filter(Boolean).map(s=>s.split(/\s+/)).every(a=>f(a[0],a[1])==a[2])

1
这将因以下输入而失败:f('c', 'a....b')
andlrc

@ dev-null,已修复
Qwertiy


4

认真地,10个字节

,û,Z`M`MΣù

在线尝试!

使用与Martin CJam答案相同的策略

说明:

,û,Z`M`MΣù
,û          get first string, uppercase
  ,Z        get second string, zip with first string
    `M`M    map maximum
        Σù  join and uppercase


3

Haskell,43 42个字节

(a:b)#(c:d)|c<'a'=a:b#d|1<2=c:b#d
a#b=a++b

用法示例:"ab.ab." # "b.b.b."-> "bbbab."

怎么运行的:

  • 如果两个列表都是非空的,则如果第二个列表的开头为,则选择第一个列表的开头".",否则选择第二个列表的开头。在列表尾部附加一个递归调用。

  • 如果至少一个列表为空,则将两个列表都追加。

编辑:@Lynn保存一个字节。谢谢!


“您可以假设输入仅包含句点和小写字母”,因此可以检查c<'a'以保存一个字节。
林恩

3

Python 2,47个字节

lambda s,t:`map(max,s.upper(),t)`[2::5].lower()

非常高尔夫球!我正在寻找摆脱Upper()和Lower()的方法,但到目前为止还没有运气...
Max

2

朱莉娅101字节

f(s,t,r=i->rpad(i,max((n=endof)(s),n(t)),"."))=join([min(a,b)<90?max(a,b):b for(a,b)=zip(r(s),r(t))])

此函数接受两个字符串并返回一个字符串。

我们将计算m为两个输入的最大长度,然后定义一个函数r,该函数用.s 正确填充其输入到length m并将其存储为函数参数。然后zip,我们在右边填充输入并检查每对中的最小值(由ASCII码定义)。如果是.,则使用具有较大代码的任何字符,否则,使用来自第二个输入的任何字符。结果数组被join编入字符串并返回。


2

C,106 89字节

i,j,k;f(s,z)char*s,*z;{for(i=0,j=k=1;j|k;i++)putchar((k=k?z[i]:0)>46|!(j=j?s[i]:0)?k:j);}

ideone上进行实时测试。


1

视网膜,55

$

+`(。?(\ S *)(\ w)|(\ S)(\ S *)。?)(\ S *。*)
$ 2 $ 5 $ 6 $ 3 $ 4


第5行是一个空格。第6行是一个空行(没有尾随换行符)。

在线尝试。

我从GNU sed(带有-r选项)开始。一旦我弄清楚正则表达式,就可以直接通向视网膜。sed版本为:

s/$/ /
:
s/(.?(\S* )(\w)|(\S)(\S* ).?)(\S* .*)/\2\5\6\3\4/
t
s/ *//

1
视网膜版本因以下原因而失败a..k.f....b c...f.g...g. => .c..kffg...g
randomra'3

1

Python 2,70个字节

lambda x,y:"".join([k if k!="."and k else j for j,k in map(None,x,y)])

在这里尝试!

首先,我们将两个字符串都压缩到一个列表中。如果第二个字符串比第一个字符串长,则用None(填充map(None,x,y))填充。
然后,我们j以第一个字符串中的字符和k第二个字符串中的字符为对象来遍历此列表。我们选择k是否不是点,否则选择j

如果我可以将结果输出为字符列表而不是字符串,则可以为61个字节。


1

Perl,48 + 3 = 51字节

s/\./substr($^I,$.=pos,1)||$&/ge;$_.=substr$^I,$.

Bah找不到更短的解决方案。(与@Qwertiy的JavaScript答案相同的方法)。
需要-pl从获取输入stdin-i

$ perl -i'a...ce' -ple's/\./substr($^I,$.=pos,1)||$&/ge;$_.=substr$^I,$.' <<< '..b.d..f'
a.b.de..f

预扩展目标字符串(看起来也很漂亮):$_^=$^I^$^I;s/\.|\0/substr$^I,pos,1or$&/ge
Ton Hospel


0

q / kdb +,43个 40字节

解:

lower{l:max(#:)each(x;y);upper[l$x]|l$y}

例:

q)lower{l:max(#:)each(x;y);upper[l$x]|l$y}["a..b..";"...c"]
"a..c.."

说明:

(#:)                // k equivalent of count
max (#:) each(x;y)  // takes each string, count the length, return maximum
l$x                 // whites-space pad string x to length l
|                   // take the maximum (per Martin's strategy)
upper[...]          // convert padded string 1 to uppercase
lower{...}          // convert result of function to lowercase

注意: 我正在利用“给出两个非空字符串并假设输入是字符串。在kdb中"c"是一个原子,(),"c"是一个字符串,否则需要在乐谱上添加6个字节,因为我们不能用它$来填充一个原子...

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.