İki dizeyi birleştirme


18

Giriş

Diyelim ki S 1 = a...bve S 2 = ..c... Onları üst üste koyarsak, şunu elde ederiz:

a...b
..c..

Her iki dizeyi .de sıvı karakteri (üst üste bindirilebilir) ile birleştiririz. Bunu elde ederiz:

a.c.b

Dizeden biri diğerinden daha uzunsa, aynı algoritmayı uygularız:

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

becomes:

a.c...b

ve

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

becomes:

a.c...b...

İki karakter çarpışırsa, sadece alt karakteri kullanırız, ör.

a..b
...c

becomes:

a..c

Görev

Boş olmayan iki dize verildiğinde, birleştirilen dizeyi çıktılar . Not , giriş sadece içerdiğini varsayabiliriz dönemleri ve küçük harfleri (yani daha uygun olup olmadığını veya büyük harf).

Test senaryoları

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

Bu , bu yüzden en az bayt ile gönderme kazanır!


Giriş a.....b ..c.......mümkün mü? Peki çıktı ne?
Luis Mendo

@DonMuesli Bu olur a.c...b....
Adnan

Dize yerine bir karakter listesi çıkarabilir miyiz?
Denker

@DenkerAffe Hayır, üzgünüm
Adnan

Teller ters sırada alınabilir mi?
Mego

Yanıtlar:


10

Jöle , 5 bayt

Œu»Œl

Komut satırı bağımsız değişkenleri aracılığıyla giriş yapın.

Çevrimiçi deneyin!

açıklama

Bu benim CJam cevabımın doğrudan bir limanıdır (bunun neden çalıştığına dair bir açıklama için bakınız):

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

5
NOOO! Jelly'i de benimseyemezsin! Biz golf ustaları olarak tüm mods ile kalacak.
Rɪᴋᴇʀ

@rikerw haha, neden mod olduklarını düşünüyorsun? çünkü golfte iyiler: P
kedi

3
@RikerW Sadece kendi çözümümü Jelly'e taşıyarak beni döven bir başkasını öngörebilmek zorunda kaldım. ¯ \ _ (ツ) _ / ¯
Martin Ender

15

CJam, 9 bayt

leul.e>el

Burada test edin.

açıklama

Bu gerçeği kullanır '.' < upper case letters < lower case letters. Bu şekilde, iki karakter dizisi arasında eleman-bilge maksimum değeri alırken, herhangi bir harf a'yı geçersiz kılar ., ancak ilk girişten büyük harf alırsak, ilk girişten gelen bir harfi ilk harfin üzerine yazabiliriz. Kafa karıştırıcı? Örnek olarak test örneklerinden biri:

ab.ab.
b.b.b.

İlk harfi büyük harfe dönüştür:

AB.AB.
b.b.b.

Elemanı maksimum olarak alın:

bBbAb.

Küçük harfe dön:

bbbab.

Ve kod bunu nasıl yapıyor:

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
Güzel eu/ elhile!
Luis Mendo

6

Javascript ES6, 52 55 karakter

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

Ölçek

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
Bu, aşağıdaki gibi girdiler için başarısız olacaktır:f('c', 'a....b')
andlrc

@ dev-null, sabit
Qwertiy




3

Haskell, 43 42 bayt

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

Kullanım örneği: "ab.ab." # "b.b.b."-> "bbbab.".

Nasıl çalışır:

  • eğer her iki liste de boş değilse, 2. listenin başı ise 1. listenin başını seçin ".", aksi takdirde ikinci listenin başını seçin. Listelerin kuyruklarıyla özyinelemeli bir çağrı ekleyin.

  • en az bir liste boşsa, her iki listeyi de ekleyin.

Düzenleme: @Lynn bir bayt kaydetti. Teşekkürler!


“Girdinin yalnızca nokta ve küçük harf içerdiğini varsayabilirsiniz” , böylece c<'a'bir bayt kaydetmeyi kontrol edebilirsiniz .
Lynn

3

Python 2, 47 bayt

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

çok golf! Ben üst () ve alt () kurtulmak için bir yol arıyorum ama şimdiye kadar şans yok ...
Max

2

Julia, 101 bayt

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

Bu, iki dizeyi kabul eden ve bir dize döndüren bir işlevdir.

mİki girişin maksimum uzunluğu olarak hesaplıyoruz , daha sonra rgirişini .s ile uzunluğa dolduran bir işlev tanımlıyoruz mve bunu bir işlev argümanı olarak saklıyoruz. Daha sonra zipsağ yastıklı girişleri ve her bir çiftin minimum değerini (ASCII kodu ile tanımlandığı gibi) kontrol ediyoruz . A ise ., hangi karakter daha büyük koda sahipse onu kullanırız, aksi takdirde ikinci girdiden hangisini kullanırsak kullanırız. Elde edilen dizi joinbir dizgiye dönüştürülür ve döndürülür.


2

C, 106 89 bayt

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);}

Test ideone üzerinde canlı .


1

Retina , 55

$

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


Çizgi 5 tek bir alandır. Satır 6 boş bir satırdır (sondaki yeni satır olmadan).

Çevrimiçi deneyin.

Bunu GNU sed'de (-r seçeneği ile) başlattım. Ben regexes anladım sonra Retina kolay bağlantı noktası. Sed sürümü:

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

1
Retina sürümü ile başarısıza..k.f....b c...f.g...g. => .c..kffg...g
randomra

1

Python 2,70 bayt

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

Burada deneyin!

İlk önce her iki dizeyi tek bir listeye sıkıştırırız. İkinci dize birinciden daha uzunsa, ile doldurulur None( map(None,x,y)bunu yapar).
Sonra bu liste üzerindenj ilk dizeden ve kikinci dizeden karakter olarak . kNokta değil mi yoksa başka türlü mi seçiyoruz j.

Sonucu bir dize yerine karakter listesi olarak çıkarabilseydim, bu 61 bayt olabilir.


1

Perl, 48 + 3 = 51 bayt

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

Bah daha kısa bir çözüm bulamıyor. (@ Qwertiy'in JavaScript'in cevabı ile aynı yaklaşım).
Gerektirir -plve girişini alır stdinve-i

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

Hedef dizgiyi önceden uzatın (çok da güzel görünüyor):$_^=$^I^$^I;s/\.|\0/substr$^I,pos,1or$&/ge
Ton Hospel


0

q / kdb +, 43 40 bayt

Çözüm:

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

Misal:

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

Açıklama:

(#:)                // 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

Notlar: Ben yararlanarak alıyorum "Verilen iki boş olmayan dizeler " ve girişler dizeleri olduğunu varsayarak. Kdb "c"bir atom, (),"c"bir dizedir, aksi takdirde $bir atomu doldurmak için kullanamadığımız için puana 6 bayt eklememiz gerekir ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.