Menggabungkan dua string


18

pengantar

Katakanlah S 1 = a...bdan S 2 = ..c... Jika kita menempatkannya di atas satu sama lain, kita mendapatkan:

a...b
..c..

Kami menggabungkan kedua string, dengan .sebagai karakter cair (yang dapat tumpang tindih). Kami mendapatkan ini:

a.c.b

Jika salah satu string lebih panjang dari yang lain, kami hanya menerapkan algoritma yang sama:

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

becomes:

a.c...b

dan

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

becomes:

a.c...b...

Jika dua karakter bertabrakan, kita cukup menggunakan karakter bawah, mis

a..b
...c

becomes:

a..c

Tugas

Diberikan dua string yang tidak kosong, output string yang digabungkan . Catatan , Anda dapat mengasumsikan bahwa input hanya berisi titik dan huruf kecil (atau huruf besar jika itu lebih nyaman).

Uji kasus

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

Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!


Apakah input a.....b ..c.......mungkin? Apa hasilnya?
Luis Mendo

@ DonMuesli Itu akan menjadi a.c...b....
Adnan

Bisakah kita menampilkan daftar karakter daripada string?
Denker

@DenkerAffe Tidak, maaf
Adnan

Bisakah string diambil dalam urutan yang berlawanan?
Mego

Jawaban:


10

Jelly , 5 byte

Œu»Œl

Input melalui argumen baris perintah.

Cobalah online!

Penjelasan

Ini adalah port langsung dari jawaban CJam saya (lihat untuk penjelasan mengapa ini berhasil):

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

5
Tidaaaak! Anda tidak dapat mengadopsi Jelly juga! Kami akan dibiarkan dengan semua mod sebagai master golf.
Rɪᴋᴇʀ

@rikerw haha, mengapa Anda pikir mereka mod? karena mereka pandai golf: P
cat

3
@RikerW Saya hanya perlu mendahului orang lain yang memukuli saya dengan memasukkan solusi saya sendiri ke Jelly. ¯ \ _ (ツ) _ / ¯
Martin Ender

15

CJam, 9 byte

leul.e>el

Uji di sini.

Penjelasan

Memanfaatkan fakta itu '.' < upper case letters < lower case letters. Dengan cara ini, ketika mengambil maksimum elemen-elemen antara dua string, huruf apa pun menimpa a ., tetapi kita dapat membuat huruf dari input kedua menimpa huruf dari yang pertama jika kita huruf besar terlebih dahulu. Membingungkan? Inilah salah satu contoh uji sebagai contoh:

ab.ab.
b.b.b.

Konversi dulu ke huruf besar:

AB.AB.
b.b.b.

Ambil maksimum elemen-bijaksana:

bBbAb.

Konversi kembali ke huruf kecil:

bbbab.

Dan di sini adalah bagaimana kode melakukan itu:

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
Bagus eu/ eltrik!
Luis Mendo

6

Javascript ES6, 52 55 karakter

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

Uji

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
Ini akan gagal untuk input seperti:f('c', 'a....b')
andlrc

@ dev-null, diperbaiki
Qwertiy


4

Serius, 10 byte

,û,Z`M`MΣù

Cobalah online!

Menggunakan strategi yang sama dengan jawaban CJam Martin

Penjelasan:

,û,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 byte

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

Contoh penggunaan: "ab.ab." # "b.b.b."-> "bbbab.".

Bagaimana itu bekerja:

  • jika kedua daftar tidak kosong, pilih kepala daftar 1 jika kepala daftar 2 adalah ".", atau pilih kepala daftar kedua. Tambahkan panggilan rekursif dengan ekor daftar.

  • jika setidaknya satu daftar kosong, tambahkan kedua daftar.

Sunting: @Lynn menyimpan satu byte. Terima kasih!


"Anda dapat mengasumsikan bahwa input hanya berisi titik dan huruf kecil" , sehingga Anda dapat memeriksa c<'a'untuk menyimpan byte.
Lynn

3

Python 2, 47 byte

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

sangat golf! Saya mencari cara untuk menyingkirkan upper () dan lower () tetapi tidak berhasil sejauh ini ...
Max

2

Julia, 101 byte

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

Ini adalah fungsi yang menerima dua string dan mengembalikan string.

Kami menghitung msebagai panjang maksimum dari dua input, kemudian mendefinisikan fungsi ryang pas dengan inputnya .s ke panjang mdan menyimpannya sebagai argumen fungsi. Kami kemudian zipmemasukkan input yang tepat dan memeriksa minimum (seperti yang didefinisikan oleh kode ASCII) dari masing-masing pasangan. Jika a ., kita gunakan karakter mana saja yang memiliki kode lebih besar, jika tidak kita gunakan yang mana yang berasal dari input kedua. Array yang dihasilkan joindiedarkan ke dalam string dan dikembalikan.


2

C, 106 89 byte

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

Tes langsung pada ideone .


1

Retina , 55

$

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


Jalur 5 adalah ruang tunggal. Baris 6 adalah baris kosong (tanpa baris baru)

Cobalah online.

Saya memulai yang ini di GNU sed, (dengan opsi -r). Port langsung ke Retina begitu aku mengetahui regexnya. Versi sed adalah:

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

1
Versi Retina gagal dengana..k.f....b c...f.g...g. => .c..kffg...g
randomra

1

Python 2, 70 byte

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

Coba di sini!

Pertama kita buat zip kedua string menjadi satu daftar. Jika string kedua lebih panjang dari yang pertama, itu diisi dengan None( map(None,x,y)apakah itu).
Kemudian kita beralih ke daftar ini dengan jmenjadi karakter dari string pertama dan kyang dari string kedua. Kami memilih kjika itu bukan titik dan sebaliknya j.

Ini bisa menjadi 61 byte jika saya bisa menampilkan hasilnya sebagai daftar karakter, bukan string.


1

Perl, 48 + 3 = 51 byte

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

Bah tidak dapat menemukan solusi yang lebih pendek. (Pendekatan yang sama dengan jawaban JavaScript Qwertiy).
Membutuhkan -pldan menerima input dari stdindan-i

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

Pra- $_^=$^I^$^I;s/\.|\0/substr$^I,pos,1or$&/ge
rentangkan


0

q / kdb +, 43 40 byte

Larutan:

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

Contoh:

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

Penjelasan:

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

Catatan: Saya mengambil keuntungan dari "Diberikan dua string yang tidak kosong " dan dengan asumsi bahwa input adalah string. Dalam kdb "c"adalah atom, (),"c"adalah string, jika tidak perlu menambahkan 6 byte ke skor, karena kita tidak dapat menggunakan $untuk pad atom ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.