Sáp nhập hai chuỗi


18

Giới thiệu

Giả sử S 1 = a...bS 2 = ..c... Nếu chúng ta đặt chúng lên nhau, chúng ta sẽ nhận được:

a...b
..c..

Chúng tôi hợp nhất cả hai chuỗi, với .ký tự là chất lỏng (có thể chồng lấp). Chúng tôi nhận được điều này:

a.c.b

Nếu một trong các chuỗi dài hơn chuỗi kia, chúng ta chỉ cần áp dụng cùng một thuật toán:

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

becomes:

a.c...b

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

becomes:

a.c...b...

Nếu hai ký tự va chạm, chúng ta chỉ sử dụng ký tự dưới cùng, vd

a..b
...c

becomes:

a..c

Nhiệm vụ

Cho hai chuỗi không trống, xuất chuỗi hợp nhất . Lưu ý , bạn có thể giả sử rằng đầu vào chỉ chứa dấu chấmchữ thường (hoặc chữ in hoa nếu thuận tiện hơn).

Các trường hợp thử nghiệm

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

Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!


Là đầu vào a.....b ..c.......có thể? Đầu ra là gì?
Luis Mendo

@DonMuesli Điều đó sẽ trở thành a.c...b....
Ad Nam

Chúng ta có thể xuất ra một danh sách các ký tự thay vì một chuỗi không?
Denker

@DenkerAffe Không, xin lỗi
Adnan

Các chuỗi có thể được thực hiện theo thứ tự ngược lại?
Mego

Câu trả lời:


10

Thạch , 5 byte

Œu»Œl

Nhập thông qua các đối số dòng lệnh.

Hãy thử trực tuyến!

Giải trình

Đây là một cổng trực tiếp của câu trả lời CJam của tôi (xem phần giải thích tại sao điều này hoạt động):

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

5
KHÔNG! Bạn cũng không thể áp dụng Jelly! Chúng tôi sẽ bị bỏ lại với tất cả các mod là bậc thầy chơi gôn.
R

@rikerw haha, tại sao bạn lại nghĩ họ là mod? Vì họ chơi golf giỏi: P
mèo

3
@RikerW Tôi vừa phải đánh bại người khác đánh tôi bằng cách chuyển giải pháp của riêng tôi cho Jelly. ¯ \ _ (ツ) _ /
Martin Ender

15

CJam, 9 byte

leul.e>el

Kiểm tra nó ở đây.

Giải trình

Làm cho việc sử dụng thực tế rằng '.' < upper case letters < lower case letters. Bằng cách này, khi lấy mức tối đa của phần tử giữa hai chuỗi, bất kỳ chữ cái nào sẽ ghi đè a ., nhưng chúng ta có thể tạo một chữ cái từ đầu vào thứ hai ghi đè một chữ cái từ chữ cái đầu tiên nếu chúng ta viết hoa chữ cái đầu tiên. Gây nhầm lẫn? Đây là một trong những trường hợp thử nghiệm làm ví dụ:

ab.ab.
b.b.b.

Chuyển đổi đầu tiên sang chữ hoa:

AB.AB.
b.b.b.

Lấy tối đa yếu tố khôn ngoan:

bBbAb.

Chuyển đổi thành chữ thường:

bbbab.

Và đây là cách mã làm điều đó:

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
Đẹp eu/ ellừa!
Luis Mendo

6

Javascript ES6, 52 55 ký tự

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

Kiểm tra

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
Điều này sẽ thất bại cho đầu vào, chẳng hạn như:f('c', 'a....b')
andlrc

@ dev-null, đã sửa
Qwertiy




3

Haskell, 43 42 byte

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

Ví dụ sử dụng: "ab.ab." # "b.b.b."-> "bbbab.".

Làm thế nào nó hoạt động:

  • nếu cả hai danh sách đều không trống, hãy chọn phần đầu của danh sách thứ 1 nếu phần đầu của danh sách thứ 2 là ".", phần khác chọn phần đầu của danh sách thứ hai. Nối một cuộc gọi đệ quy với đuôi của danh sách.

  • nếu ít nhất một danh sách trống, hãy nối cả hai danh sách.

Chỉnh sửa: @Lynn đã lưu một byte. Cảm ơn!


Bạn có thể giả sử rằng đầu vào chỉ chứa dấu chấm và chữ cái viết thường , vì vậy bạn có thể kiểm tra c<'a'để lưu một byte.
Lynn

3

Python 2, 47 byte

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

rất golf! Tôi đang tìm cách để loại bỏ thượng () và thấp hơn () nhưng không có may mắn cho đến nay ...
Tối đa

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

Đây là một hàm chấp nhận hai chuỗi và trả về một chuỗi.

Chúng tôi tính toán mđộ dài tối đa của hai đầu vào, sau đó xác định một hàm rphải đệm đầu vào của nó với .s theo chiều dài mvà lưu trữ dưới dạng đối số của hàm. Sau đó, chúng tôi sẽ zipnhập đúng đệm và kiểm tra mức tối thiểu (như được xác định bởi mã ASCII) của mỗi cặp. Nếu đó là một ., chúng tôi sử dụng bất kỳ ký tự nào có mã lớn hơn, nếu không, chúng tôi sử dụng bất kỳ ký tự nào đến từ đầu vào thứ hai. Mảng kết quả được joined thành một chuỗi và trả về.


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

Kiểm tra trực tiếp trên ideone .


1

Võng mạc , 55

$

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


Dòng 5 là một không gian duy nhất. Dòng 6 là một dòng trống (không có dòng mới).

Hãy thử trực tuyến.

Tôi đã bắt đầu cái này trong GNU sed, (với tùy chọn -r). Cổng đơn giản đến Retina khi tôi đã nhận ra các biểu thức chính quy. Phiên bản sed là:

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

1
Phiên bản Retina không thành công vớia..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)])

Hãy thử nó ở đây!

Đầu tiên chúng ta tạo zip cả hai chuỗi vào một danh sách. Nếu chuỗi thứ hai dài hơn chuỗi thứ nhất, nó được đệm bằng None( map(None,x,y)thực hiện điều đó).
Sau đó, chúng tôi lặp lại danh sách này với jký tự từ chuỗi thứ nhất và chuỗi ktừ chuỗi thứ hai. Chúng tôi chọn knếu nó không phải là một dấu chấm và mặt khác j.

Đây có thể là 61 byte nếu tôi có thể xuất kết quả dưới dạng danh sách các ký tự thay vì chuỗi.


1

Perl, 48 + 3 = 51 byte

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

Bah không thể tìm thấy một giải pháp ngắn hơn. (Cách tiếp cận tương tự như câu trả lời của JavaScript của @ Qwertiy).
Yêu cầu -plvà lấy đầu vào từ 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
Mở


0

q / kdb +, 43 40 byte

Giải pháp:

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

Thí dụ:

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

Giải trình:

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

Lưu ý: Tôi đang tận dụng lợi thế của "Cho hai chuỗi không trống " và giả sử rằng đầu vào là các chuỗi. Trong kdb "c"là một nguyên tử, (),"c"là một chuỗi, nếu không thì cần thêm 6 byte vào điểm số, vì chúng ta không thể sử dụng $để đệm một nguyên tử ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.