Khái quát hóa các chữ viết tắt


14

Đưa ra một đầu vào của một danh sách các từ và chữ viết tắt của chúng, xuất ra mẫu mà từ đó các chữ viết tắt có thể được hình thành.

Hãy để chúng tôi lấy ví dụ đầu vào của

potato ptao
puzzle pzze

như một ví dụ (nghĩa là viết tắt cho potatoptaovà viết tắt cho puzzlepzze).

Xem xét tất cả các cách có thể để có được ptaotừ potato. Một cách có thể là lấy các chữ cái đầu tiên, thứ ba, thứ tư và thứ sáu, mà chúng ta sẽ gọi là 1346. Nhưng kể từ toxuất hiện nhiều lần trong các văn bản, có nhiều cách khác có thể tạo ra ptaotừ potato: 1546, 1342, và 1542.

Tương tự như vậy, lưu ý rằng pzzecó thể được tạo ra từ puzzlevới bất kỳ 1336, 1346, 1436, 1446. Mẫu duy nhất mà hai chữ viết tắt này có điểm chung là 1346; do đó, đó phải là đầu ra cho đầu vào này. Nếu có thể có nhiều mẫu có thể, bạn có thể xuất bất kỳ, một số hoặc tất cả chúng (ít nhất là một mẫu).

Bạn có thể cho rằng:

  • Từ nhập và chữ viết tắt chỉ chứa chữ thường.

  • Có ít nhất một từ / cặp viết tắt trong đầu vào.

  • Có thể cho mỗi chữ viết tắt được hình thành từ từ tương ứng của nó.

  • Sẽ luôn có ít nhất một mẫu hình thành mỗi chữ viết tắt.

  • Độ dài tối đa của mỗi từ là 9 ký tự.

Đầu vào có thể được thực hiện như bất kỳ sau đây:

  • Mảng 2 chiều / danh sách / mảng của bộ / v.v. [[word, abbr], [word, abbr], ...]

  • danh sách / chiều phẳng 1 chiều [word, abbr, word, abbr, ...]

  • một chuỗi, được phân tách bằng bất kỳ ký tự đơn nào không phải là chữ thường "word abbr word abbr"

  • băm / mảng kết hợp / vv. {word => abbr, word => abbr, ...}

Trong bất kỳ tùy chọn đầu vào nào, bạn cũng được phép trao đổi thứ tự từ / abbr (vui lòng mô tả đầy đủ định dạng đầu vào trong bài đăng của bạn).

Đầu ra có thể được cung cấp dưới dạng một số đơn, một chuỗi được phân tách bằng các chữ số không hoặc một mảng / danh sách / tuple / vv. của các số.

Vì đây là , mã ngắn nhất tính bằng byte sẽ giành chiến thắng.

Các trường hợp thử nghiệm (hãy nhớ rằng bạn chỉ cần xuất 1 kết quả nếu nhiều mẫu hoạt động):

In                                Out
--------------------------------------------------------
potato ptao puzzle pzze         | 1346
aabbcc abc fddeef def           | 246
prgrmming prgmg puzzles pzzlz   | 14353
aaaaa a bbbb b ccc c dd d e e   | 1
aaaaa a bbbb b ccc c            | 1, 2, 3
abcxyz zbcyax                   | 623514
abcxyz acbbacbcbacbbac          | 132213232132213
potato ptao                     | 1346, 1546, 1342, 1542
a aaaaa                         | 11111

Chỉ để đảm bảo tôi hiểu, quá trình viết tắt có thể sắp xếp lại các chữ cái?
xnor

@xnor Đúng, như đã thấy trong một số trường hợp thử nghiệm.
Doorknob

Mảng 2D có thể có định hướng khác không? Mỗi cột, không phải mỗi hàng, sẽ chứa một cặp từ / viết tắt
Luis Mendo

@DonMuesli Không, không thể.
Doorknob

Chúng ta có thể sử dụng chỉ mục không, vì vậy hãy in 0235 thay vì 1346?
Denker

Câu trả lời:


3

Bình thường, 19 byte

mhh@Fd.TmmxkmbhdedQ

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

Đưa ra một danh sách theo định dạng sau:

[["word","abbr"],["word","abbr"],...]

Giải pháp 17 byte thay thế đưa ra kết quả dưới dạng danh sách các chỉ số dựa trên zero được gói trong danh sách 1 phần tử:

m@Fd.TmmxkmbhdedQ

Giải trình

Thí dụ: [["potato", "ptao"],["puzzle", "pzze"]]

Đầu tiên chúng tôi ánh xạ mỗi char trong chữ viết tắt vào một danh sách các chỉ số của tất cả các lần xuất hiện trong từ mang lại

[[[0], [2, 4], [3], [1, 5]], [[0], [2, 3], [2, 3], [5]]]

Sau đó, chúng tôi hoán chuyển danh sách này cung cấp cho chúng tôi

[[[0], [0]], [[2, 4], [2, 3]], [[3], [2, 3]], [[1, 5], [5]]]

Vì vậy, các chỉ số của mỗi char của mỗi chữ viết tắt được cùng nhau trong một danh sách.

Sau đó, chúng ta chỉ cần tìm một chỉ mục chung trong tất cả các danh sách mang lại:

[[0], [2], [3], [5]]

Đây là đầu ra của giải pháp 17 byte thay thế của tôi ở trên. Điều này sau đó được chuyển thành [1,3,4,6].

Sự cố mã

mhh@Fd.TmmxkmbhdedQ # Q = đầu vào

m Q # nhập bản đồ với d
        m ed # map mỗi chữ viết tắt với k
            mbhd # ánh xạ từ danh sách char
         mxk # ánh xạ mỗi ký tự viết tắt char vào danh sách các chỉ số
      .T # Chuyển
    Fd # Gấp mọi phần tử
   @ # và lọc khi có mặt
 hh # Lấy phần tử đầu tiên của kết quả và tăng nó

Bạn cũng không thể xóa dmquyền trước @?
Doorknob

@Doorknob tôi có thể. Cảm ơn vì đã phát hiện ra điều đó!
Denker

3

MATL , 29 byte

!"@Y:!=2#fX:wX:h]N$v1XQtv4#X>

Đầu vào là một mảng 2D theo định dạng sau:

{'potato' 'ptao'; 'puzzle' 'pzze'}

Hãy thử trực tuyến! ( mã được liên kết bao gồm một số sửa đổi do thay đổi ngôn ngữ kể từ khi câu trả lời này được đăng )

!       % take input. Transpose
"       % for each column
  @Y:   %   push column. Unpack the two strings and push them onto the stack
  !     %   transpose second string
  =     %   matrix with all pairwise matchings of characters in word and abbreviation
  2#f   %   find row and col indices of those matchings
  X:    %   transform into column vector
  wX:   %   swap, transform into column vector
  h     %   concat into a two-col matrix
]       % end for
N$v     % concatenate all matrices containing the indices
1       % push 1
XQ      % build matrix adding 1 for each (row,col) index
tv      % concat vertically with itself, so that it has at least two rows.
        % This forces the following function to work on each col.
4#X>    % arg max of each col: position that produces a match in all pairs.
        % If there are several maximizers in each col this gives the first

Mã yêu cầu một số thủ thuật liên quan (và dài!) Để

  • Ngăn không cho hướng của vectơ do find( f) tạo ra thay đổi tùy thuộc vào hình dạng đầu vào. Đây là các câu lệnh X:wX:: buộc cả hai đầu ra là vectơ cột.
  • Chống lại hành vi mặc định "hoạt động dọc theo chiều không đơn đầu tiên" của hàm min( X>). Đây là các câu lệnh tv: nối một bản sao của chính nó để đảm bảo ít nhất hai hàng);

2

Perl, 46 45 42 byte

Bao gồm +1 cho -p

Cung cấp đầu vào dưới dạng các từ liên tiếp trên STDIN, ví dụ:

perl -p abbrev.pl
prgrmming
prgmg
puzzles
pzzlz

Chấm dứt STDIN bằng ^Dhoặc ^Zbất cứ điều gì cần thiết trên hệ thống của bạn

abbrev.pl:

s#.#${${--$_.$.%2}.=$&}||=-$_#eg;$_ x=eof

Giải trình

Xem xét đầu vào này (bố cục khái niệm, không phải là cách thực sự để nhập cho chương trình này):

potatoes     ptao
puzzle       pzze

Chương trình xây dựng chuỗi đại diện cho các cột dọc của chuỗi đầy đủ được lập chỉ mục trên id cột

id1    pp     -> 1
id2    ou     -> 2
id3    tz     -> 3
id4    az     -> 4
...

vv Nó cũng làm như vậy cho các chữ viết tắt, nhưng sử dụng một id khác

ID1    pp     -> 1
ID2    tz     -> 3
ID3    az     -> 4
ID4    oe     -> 6

Các từ được xử lý ngầm từng cái một bằng cách sử dụng -ptùy chọn. Các chuỗi cột được xây dựng bằng cách sử dụng các phép nối lặp lại trong khi mỗi từ được sử dụng s#.# ...code.. #eg, vì vậy mỗi cột cần một id lặp lại. Tôi sử dụng trừ số cột theo sau là số dòng modulo 2. Số cột có thể được xây dựng bằng cách sử dụng --$_bắt đầu như từ hiện tại do chỉ sử dụng a-zđược đảm bảo để đánh giá là 0 trong ngữ cảnh số. Vì vậy, tôi nhận được -1, -2, -3, .... Tôi thực sự muốn sử dụng 1, 2, 3, ..., nhưng sử dụng $_++sẽ kích hoạt gia tăng chuỗi ma thuật thay vì bộ đếm số thông thường. Tôi làm muốn sử dụng$_ và không phải là một số biến khác bởi vì bất kỳ biến nào khác tôi sẽ phải khởi tạo về 0 trong mỗi vòng lặp có quá nhiều byte.

Số dòng modulo 2 là để đảm bảo id cho từ đầy đủ và id cho chữ viết tắt không đụng độ. Lưu ý rằng tôi không thể sử dụng từ đầy đủ và chữ viết tắt trên một chuỗi để có số cột đi qua chuỗi kết hợp vì tất cả các từ đầy đủ không có cùng độ dài, vì vậy các cột từ bị loại bỏ sẽ không xếp hàng. Tôi cũng không thể đặt từ viết tắt trước (tất cả chúng đều có cùng độ dài) vì tôi cần số cột đầu tiên của các từ đầy đủ là 1.

Tôi lạm dụng không gian tên toàn cầu perl thông qua một tham chiếu không nghiêm ngặt để xây dựng các chuỗi cột như:

${--$_.$.%2}.=$&

Tiếp theo, tôi ánh xạ từng chuỗi cột thành số cột đầu tiên mà chuỗi đó từng xuất hiện (ánh xạ đã được chỉ ra ở trên) bằng cách lạm dụng không gian tên toàn cầu perl (nhưng lưu ý rằng các tên không thể xung đột để các toàn cầu không can thiệp lẫn nhau):

${${--$_.$.%2}.=$&} ||= -$_

Tôi phải phủ nhận $_vì như tôi đã giải thích ở trên, tôi đếm các cột là -1, -2, -3, .... Các ||=Đảm bảo chỉ sự xuất hiện đầu tiên của một cột cho được một số cột mới, nếu không thì số cột trước đó được bảo quản trả về dưới dạng giá trị. Điều này sẽ xảy ra đặc biệt cho mỗi từ viết tắt vì đặc tả đảm bảo rằng có một cột trong các từ đầy đủ sẽ xuất hiện trước đó. Vì vậy, trong từ viết tắt cuối cùng, mỗi chữ cái sẽ được thay thế bằng số cột trong từ đầy đủ tương ứng với cột cho tất cả các từ viết tắt. Vì vậy, kết quả của sự thay thế cuối cùng là kết quả cuối cùng được mong muốn. Vì vậy, in khi và chỉ khi chúng ta ở cuối đầu vào:

$_ x=eof

Việc gán chỉ mục cột cũng sẽ tạo các mục nhập cho các cột chưa hoàn thành do cột chưa được xây dựng hoàn chỉnh hoặc một số từ ngắn hơn và không đạt được độ dài cột đầy đủ. Đây không phải là vấn đề vì các cột cần thiết trong mỗi từ viết tắt được đảm bảo có cột sửa lỗi từ các từ đầy đủ có độ dài tối đa có thể (số lượng các cặp hiện đang nhìn thấy) vì vậy các mục nhập thêm này không bao giờ gây ra kết quả khớp sai.


1

Haskell, 74 byte

import Data.List
foldl1 intersect.map(\(w,a)->mapM(`elemIndices`(' ':w))a)

Định dạng đầu vào là danh sách các cặp chuỗi, ví dụ:

*Main > foldl1 intersect.map(\(w,a)->mapM(`elemIndices`(' ':w))a)  $ [("potato","ptao"),("puzzle","pzze")]
[[1,3,4,6]]

Cách thức hoạt động: mapM(giống như sequence . map) trước tiên biến mọi cặp (w,a)thành một danh sách các danh sách các chỉ số của chữ cái viết tắt ( ' ':sửa chỉ mục gốc 0 của Haskell thành 1 dựa trên), ví dụ ("potato", "ptao") -> [[1],[3,5],[4],[2,6]], sau đó thành một danh sách tất cả các kết hợp trong đó phần tử tại vị trí iđược rút ra từ idanh sách phụ, vd [[1,3,4,2],[1,3,4,6],[1,5,4,2],[1,5,4,6]]. foldl1 intersecttìm thấy giao điểm của tất cả các danh sách như vậy.


0

ES6, 92 byte

(w,a)=>[...a[0]].map((_,i)=>[...w[0]].reduce((r,_,j)=>w.some((s,k)=>s[j]!=a[k][i])?r:++j,0))

Chấp nhận đầu vào như một mảng các từ và một mảng các từ viết tắt. Trả về một mảng các chỉ số dựa trên 1 (chi phí cho tôi 2 byte chết tiệt). Trong trường hợp có nhiều giải pháp, các chỉ số cao nhất được trả về.


0

Python 3, 210 byte

Không phải là một câu trả lời ấn tượng khi nắm giữ các topscores ở đây, nhưng đây thực sự là một trong những cách hiểu danh sách điên rồ nhất tôi từng làm với Python. Cách tiếp cận khá khó khăn.

 def r(p):
    z=[[[1+t[0]for t in i[0]if l==t[1]]for l in i[1]]for i in[[list(enumerate(w[0])),w[1]]for w in p]]
    return[list(set.intersection(set(e),*[set(i[z[0].index(e)])for i in z[1:]]))[0]for e in z[0]]

Hàm dự kiến ​​đầu vào luôn là một chuỗi 2-D như: [[word, abbr],...]và trả về một danh sách các số nguyên.

Ps: Một lời giải thích chi tiết sắp ra mắt

Ps2: Đề xuất chơi gôn tiếp tục được hoan nghênh!

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.