Chuỗi kết hợp với bối cảnh


13

Chuỗi với bối cảnh

Đối với mục đích của thử thách này, một chuỗi có ngữ cảnh là một chuỗi ba chuỗi, được gọi là bối cảnh bên trái , phần dữ liệubối cảnh bên phải . Nó đại diện cho một chuỗi con của một chuỗi dài hơn. Chúng tôi sử dụng ống đứng |làm dấu phân cách, vì vậy một ví dụ về chuỗi có ngữ cảnh là cod|e-go|lf, trong đó bối cảnh bên trái là coddữ liệu e-govà bối cảnh bên phải là lf. Ví dụ này đại diện cho chuỗi con e-gocủa code-golf.

Bây giờ, để nối hai chuỗi với ngữ cảnh, chúng tôi tiến hành như sau, sử dụng aa|bcc|deecc|de|eeelàm ví dụ. Chúng tôi sắp xếp các chuỗi như trong sơ đồ

a a|b c c|d e e
      c c|d e|e e e

để các phần dữ liệu của họ liền kề nhau. Phần dữ liệu của phần ghép là phần nối của phần dữ liệu, trong trường hợp này bccde. Bối cảnh bên trái là phần kéo dài phần bên trái của phần dữ liệu đầu tiên, trong trường hợp này aa. Tương tự, bối cảnh phù hợp là eee, do đó, nối là chuỗi với bối cảnh aa|bccde|eee. Đối với một ví dụ thứ hai, hãy xem xét a|bb|cdaabb|cd|, trong đó từ thứ hai có ngữ cảnh bên phải trống. Sơ đồ căn chỉnh là

  a|b b|c d
a a b b|c d|

trong đó ngữ cảnh bên trái của từ thứ hai mở rộng hơn so với từ thứ nhất. Sự kết hợp là aa|bbcd|.

Nhưng chờ đã, có một vấn đề: nếu các chữ cái của sơ đồ căn chỉnh không khớp, thì phép nối không tồn tại! Ví dụ, sơ đồ của aa|bb|ccc|c|c

a a|b b|c c
      c|c|c

trong đó bctrên cột thứ tư không đồng ý, vì vậy chúng không thể được nối với nhau.

Nhiệm vụ

Công việc của bạn là viết một chương trình gồm hai chuỗi với bối cảnh có các phần được phân tách |như trên và đưa ra kết nối của chúng nếu nó tồn tại và một cái gì đó khác nếu không. "Cái gì khác" có thể là bất kỳ giá trị nào, kể cả không có đầu ra, miễn là nó không phải là một chuỗi hợp lệ với ngữ cảnh và nó cũng giống nhau trong mọi trường hợp. Tuy nhiên, ném một lỗi là không thể chấp nhận được. Bạn có thể cung cấp chương trình STDIN-to-STDOUT hoặc một chức năng và các chức năng ẩn danh cũng được chấp nhận. Số byte nhỏ nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

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

aa|bcc|dee cc|de|eee -> aa|bccde|eee
a|bb|cd    aabb|cd|  -> aa|bbcd|
a|b|cccd   aab|cc|c  -> aa|bcc|cd
a|b|c      b||cd     -> a|b|cd
aa|bb|cc   c|c|c     -> None
aaa|b|c    abb|cd|d  -> None
|bb|cd     abb|c|ed  -> None
a|b|c      a||cd     -> None

Câu trả lời:


4

Haskell, 184 182 201 199 155

s&t|(a,'|':b)<-f t,(x,'|':y)<-f$r s,x#b,a#y=r(y!r a)++b!r x|0<1=""
r=reverse
a!b=a++drop(length a-1)b
(#)a=and.zipWith(==)(r a).filter h
f=span h
h=(/='|')

chạy ví dụ:

"|a|"&"|b|" -- returns "|ab|"
"|a|x"&"|b|" -- returns ""

nếu không có kết quả trùng khớp, chuỗi rỗng sẽ được trả về. nếu không thì kết quả sẽ được trả lại.

giải thích một phần:

# là một hàm có hai chuỗi và trả về cho dù chúng có khớp hay không.

! nhận được hai chuỗi và trả về chuỗi đầu tiên được nối với ký tự phụ từ chuỗi thứ hai (nếu có).

chức năng chính &sử dụng span (/='|')để phân chia các đầu vào thành hai phần, a|b|cđể a, b|ckiểm tra xem các bối cảnh có khớp nhau không, sau đó sử dụng !hai lần để lắp ráp đầu ra.

Chỉnh sửa: regolfing muộn mage dường như là khá hiệu quả.


Hmm, tôi sợ rằng ném lỗi không phải là một phương thức đầu ra chấp nhận được, đặc biệt là đối với một chức năng. Thêm |1<2=""vào định nghĩa &nên giải quyết điều đó. Tôi xin lỗi tôi đã không chỉ định điều này rõ ràng hơn trong thông số kỹ thuật, tôi sẽ chỉnh sửa nó.
Zgarb

@Zgarb Trên thực tế, điều này sẽ không khắc phục nó. Là trả về một chuỗi có quá nhiều '|'dấu hiệu khi các chuỗi không khớp nhau được không?
tự hào

Chắc chắn, miễn là nó là cùng một chuỗi cho tất cả các đầu vào không khớp.
Zgarb

3

Python (242 byte)

import itertools as i
s='|'
j=''.join
r=reversed
m=lambda a,b:j(j(*set(p+q))for p,q in i.izip_longest(a,b,fillvalue=''))
def c(A,B):
 u,v,w,x,y,z=(A+s+B).split(s)
 try:return j(r(m(r(u+v),r(x))))[:-len(v)]+s+v+y+s+m(w,y+z)[len(y):]
 except:0

Giải trình

Hàm lambda mtrả về độ dài của hai chuỗi miễn là chúng có chung một tiền tố chung. Nó làm điều này bằng cách kết hợp các chuỗi rỗng ''thay cho bất kỳ giá trị mất tích, sau đó chuyển kết quả (có thể gồm các hình thức aa, ab, a, hoặc btrong trường hợp trận đấu / không phù hợp / độ dài bất bình đẳng) vào một tập hợp các nhân vật độc đáo tại mỗi vị trí. joinmong đợi một đối số duy nhất, vì vậy việc giải nén một tập hợp có nhiều hơn một phần tử sẽ khiến nó tăng lên một TypeError.

Các chức năng chính sau đó

  • sử dụng mđể kết hợp bối cảnh bên trái và phần dữ liệu của từ đầu tiên với ngữ cảnh bên trái của chuỗi thứ hai (từ phải sang trái qua các chuỗi đảo ngược)
  • nối các phần dữ liệu,
  • và một lần nữa sử dụng mđể kết hợp ngữ cảnh đúng của từ đầu tiên với phần dữ liệu và ngữ cảnh đúng của từ thứ hai

Phần dữ liệu của hai từ gốc được cắt từ bên phải và bên trái của bối cảnh mới.

Vì chúng ta biết rằng các sai lệch gây ra mtăng a TypeError, trong những trường hợp này, chúng ta bắt ngoại lệ và hoàn toàn quay trở lại None.

Kiểm tra

TESTCASES = [
    ('aa|bcc|dee', 'cc|de|eee', 'aa|bccde|eee'),
    ('a|bb|cd', 'aabb|cd|', 'aa|bbcd|'),
    ('a|b|cccd', 'aab|cc|c', 'aa|bcc|cd'),
    ('a|b|c', 'b||cd', 'a|b|cd'),
    ('aa|bb|cc', 'c|c|c', None),
    ('aaa|b|c', 'abb|cd|d', None),
    ('|bb|cd', 'abb|c|ed', None),
    ('a|b|c', 'a||cd', None),
]

for A, B, R in TESTCASES:
    print '{:<10} {:<9} -> {}'.format(A, B, c(A, B))

Đầu ra

aa|bcc|dee cc|de|eee -> aa|bccde|eee
a|bb|cd    aabb|cd|  -> aa|bbcd|  
a|b|cccd   aab|cc|c  -> aa|bcc|cd 
a|b|c      b||cd     -> a|b|cd    
aa|bb|cc   c|c|c     -> None      
aaa|b|c    abb|cd|d  -> None      
|bb|cd     abb|c|ed  -> None      
a|b|c      a||cd     -> None  
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.