2つの文字列を結合する


18

前書き

S 1 = a...bおよびS 2 =であるとしましょう..c..。それらを互いの上に配置すると、次のようになります。

a...b
..c..

両方の文字列.を、リキッドキャラクタ(重複可能)としてマージします。これを取得します。

a.c.b

文字列の一方が他方より長い場合、同じアルゴリズムを適用します。

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

becomes:

a.c...b

そして

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

becomes:

a.c...b...

2つの文字が衝突する場合、下の文字を使用します。例えば

a..b
...c

becomes:

a..c

タスク

空でない2つの文字列が与えられた場合、マージされた文字列を出力ます。、入力にはピリオド小文字(または、より便利な場合は大文字)のみが含まれると想定できます。

テストケース

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.......可能ですか?そのときの出力は何ですか?
ルイスメンドー

@DonMuesliそれはになりa.c...b...ます。
アドナン

文字列の代わりに文字のリストを出力できますか?
デンカー

@DenkerAffeいいえ、ごめんなさい
アドナン

文字列は逆の順序で取得できますか?
-Mego

回答:


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
いや!ゼリーも採用できません!ゴルフの達人として、すべての改造が残されます。
Rɪᴋᴇʀ

@rikerwハハ、なぜあなたは彼らがMODだと思う?彼らはゴルフが得意だから:P-

3
@RikerW私は自分のソリューションをJellyに移植することで、他の誰かが私をbeるのを先取りする必要がありました。¯\ _(ツ)_ /¯
マーティン・エンダー

15

CJam、9バイト

leul.e>el

ここでテストしてください。

説明

という事実を利用し'.' < upper case letters < lower case lettersます。この方法では、2つの文字列間の要素ごとの最大値を取得するときに、任意の文字がaをオーバーライドします.が、最初の文字を大文字にすると、2番目の入力の文字が最初の文字をオーバーライドできます。紛らわしい?例として、テストケースの1つを示します。

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

オクターブ、50バイト

function c=m(a,b)c=b;c(a>0)=a;i=b>46;c(i)=b(i);end

あなたは置き換えることができます!=>
ルイスMendo

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."

使い方:

  • 両方のリストが空でない場合"."、2番目のリストの先頭がの場合は1番目のリストの先頭を選択し、そうでない場合は2番目のリストの先頭を選択します。リストの末尾に再帰呼び出しを追加します。

  • 少なくとも1つのリストが空の場合、両方のリストを追加します。

編集:@Lynnはバイトを保存しました。ありがとう!


「入力にはピリオドと小文字のみが含まれていると想定できますのでc<'a'、バイトの保存を確認できます。
リン

3

Python 2、47バイト

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

非常にゴルフです!私は方法を探していますしています...これまでのところ(上)と下()が、運を取り除くために
マックス

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))])

これは、2つの文字列を受け入れて文字列を返す関数です。

m2つの入力の最大長として計算し、長さまでr入力を.s で右詰めする関数を定義mし、関数の引数として保存します。次にzip、右側の埋め込み入力を確認し、各ペアの最小値(ASCIIコードで定義されているとおり)を確認します。それがの場合.、より大きなコードを持つ文字を使用し、そうでない場合は2番目の入力からの文字を使用します。結果の配列はjoin文字列に変換されて返されます。



1

網膜、55

$

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


行5は単一のスペースです。行6は空の行です(末尾の改行はありません)。

オンラインでお試しください。

これをGNU sedで開始しました(-rオプションを使用)。正規表現がわかったら、Retinaに簡単に移植できます。sedバージョンは次のとおりです。

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

1
Retinaバージョンは次のエラーで失敗しますa..k.f....b c...f.g...g. => .c..kffg...g
randomra

1

Python 2、70バイト

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

ここで試してみてください!

最初に、両方の文字列を1つのリストに圧縮します。2番目の文字列が最初の文字列よりも長い場合は、パディングされますNonemap(None,x,y)そうします)。
次にj、最初の文字列の文字とk2番目の文字列の文字を使用して、このリストを繰り返し処理します。kドットでない場合とそうでない場合に選択しますj

結果を文字列ではなく文字のリストとして出力できる場合、これは61バイトになります。


1

Perl、48 + 3 = 51バイト

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

バは短い解決策を見つけることができません。(@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バイトを追加する必要があります...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.