Các chất nền xác định duy nhất ngắn nhất


23

Đưa ra một danh sách các chuỗi, thay thế mỗi chuỗi bằng một trong các chuỗi không trống của nó không phải là chuỗi con của bất kỳ chuỗi nào khác trong danh sách và càng ngắn càng tốt.

Thí dụ

Với danh sách ["hello","hallo","hola"], "hello"nên được thay thế bằng cách chỉ "e"là chuỗi con này không được chứa trong "hallo""hola"và nó là càng ngắn càng tốt. "hallo"có thể được thay thế bằng một "ha"hoặc "al""hola"bởi bất kỳ "ho", "ol"hoặc "la".

Quy tắc

  • Bạn có thể giả sử rằng các chuỗi sẽ không trống và chỉ chứa các ký tự chữ cái của cùng một trường hợp.
  • Bạn có thể giả sử rằng một chuỗi con như vậy tồn tại cho mỗi chuỗi trong danh sách, tức là không có chuỗi nào trong danh sách sẽ là một chuỗi con của bất kỳ chuỗi nào khác.
  • Đầu vào và đầu ra có thể ở bất kỳ định dạng hợp lý.
  • Đây là , vì vậy hãy cố gắng sử dụng càng ít byte càng tốt trong ngôn ngữ bạn chọn.

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

Chỉ có một đầu ra có thể được đưa ra cho hầu hết các trường hợp.

["ppcg"] -> ["p"] (or ["c"] or ["g"])
["hello","hallo","hola"] -> ["e","ha","ho"]
["abc","bca","bac"] -> ["ab","ca","ba"]
["abc","abd","dbc"] -> ["abc","bd","db"]
["lorem","ipsum","dolor","sit","amet"] -> ["re","p","d","si","a"]
["abc","acb","bac","bca","cab","cba"] -> ["abc","acb","bac","bca","cab","cba"]

Liên quan: Chuỗi xác định ngắn nhất - ý tưởng tương tự, nhưng liên quan nhiều hơn đến các quy tắc và định dạng rườm rà.


Tại sao không ""(chuỗi rỗng) xác định duy nhất cho "ppcg"trường hợp duy nhất ?
MooseBoys

2
@MooseBoys Đưa ra một danh sách các chuỗi, thay thế mỗi chuỗi bằng một trong các chuỗi con không trống
Ông Xcoder

Câu trả lời:




4

Bình thường , 12 byte

mhf!ts}LTQ.:

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

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

Basicaly lọc các chuỗi con của mỗi chuỗi chỉ xảy ra ở một trong các chuỗi trong danh sách (nghĩa là nó là duy nhất cho chuỗi đó) và nhận chuỗi đầu tiên.

mhf!ts}LTQ.:     Full program, Q=eval(stdin_input())
m         .:     Map over Q and obtain all the substrings of each.
  f              And filter-keep those that satisfy (var: T)...
      }LTQ       ... For each string in Q, yield 1 if it contains T, else 0.
   !ts           ... Sum the list, decrement and negate. 
 h               Head. Yields the first valid substring, which is always the shortest.

4

Prolog (SWI) , 175 163 byte

S/L/R:-sub_string(S,_,L,_,R).
[H|T]+[I|R]:-string_length(H,L),between(1,L,X),H/X/I,T+R.
R+R.
L-R:-L+R,forall(member(E,L),findall(_,(member(F,R),\+ \+ E/_/F),[_])).

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

Hầu hết mọi thứ ở đây nên khá rõ ràng, nhưng:

Giải trình

Chữ ký: ( += input, ?= tùy chọn, -= output, := biểu thức)

  • sub_string(+String, ?Before, ?Length, ?After, ?SubString)
  • string_length(+String, -Length)
  • member(?Elem, ?List)
  • between(+Low, +High, ?Value)
  • findall(+Template, :Goal, -Bag)
  • forall(:Cond, :Action)

\+ \+chỉ là not not(tức là chuyển đổi một kết quả khớp thành boolean (trong trường hợp này, ngăn không cho nó khớp cả hai ps ppcgmột cách riêng biệt))


Công cụ phù hợp cho công việc: P ngoại trừ thực tế là nó rất dài dòng
ASCII - chỉ


4

J , 30 29 25 byte

1(|:(0{-.&,)"_1]\.)<\\.&>

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

                   <\\.&>        a 3-dimensional array of substrings
1 |:                             transpose each matrix to sort the substrings by length
1              ]\.               all choices where one word is missing
    (0{-.&,)"_1                  for every matrix, flatten, remove substrings
                                  that are present in the corresponding complement,
                                  pick first


3

JavaScript (ES6), 93 byte

a=>a.map(s=>(L=s.length,g=n=>a.every(S=>S==s|!~S.search(u=s.substr(n%L,n/L+1)))?u:g(n+1))(0))

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

Làm sao?

Đối với mỗi chuỗi s có độ dài L trong mảng đầu vào a [] và bắt đầu với n = 0 , chúng ta sử dụng hàm đệ quy g () để tạo ra tất cả các chuỗi con u của s với:

u = s.substr(n % L, n / L + 1)

Chẳng hạn, với s = "abc"L = 3 :

 n | n%L | floor(n/L+1) | u
---+-----+--------------+-------
 0 |  0  |       1      | "a"
 1 |  1  |       1      | "b"
 2 |  2  |       1      | "c"
 3 |  0  |       2      | "ab"
 4 |  1  |       2      | "bc"
 5 |  2  |       2      | "c"
 6 |  0  |       3      | "abc"
 7 |  1  |       3      | "bc"
 8 |  2  |       3      | "c"

Một số chuỗi con được tạo ra nhiều lần, nhưng nó không thành vấn đề. Điều quan trọng là tất cả các chuỗi con có độ dài N đã được tạo trước bất kỳ chuỗi con có độ dài N + 1 nào .

Chúng tôi dừng quá trình ngay khi không thể tìm thấy u trong bất kỳ chuỗi S nào khác trong [] , điều này được đảm bảo xảy ra khi u == s trong trường hợp xấu nhất, theo quy tắc thách thức # 2:

không có chuỗi nào trong danh sách sẽ là một chuỗi con của bất kỳ chuỗi nào khác

Do đó, trong ví dụ trên, bước 78 sẽ không bao giờ được xử lý.


2

PowerShell , 107 byte

($a=$args)|%{$(for($i=0;$i++-lt($g=($s=$_)|% Le*)){0..($g-$i)|%{$s|% s*g $_ $i}|?{!($a-match$_-ne$s)}})[0]}

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

Giải trình

Đối với mỗi chuỗi được cung cấp (và gán toàn bộ mảng cho $a):

  • Thực hiện một forvòng lặp trên mỗi chiều dài chuỗi con (dựa trên 1) của chuỗi (gán chính chuỗi đó $svà độ dài cho $g)
  • Đối với mỗi chiều dài ( $i):
    • Tạo một vòng lặp chỉ mục, từ 0 đến chiều dài - $i, sau đó cho mỗi chỉ mục:
      • Lấy chuỗi con của chuỗi hiện tại ( $s) tại vị trí $_(chỉ mục) và độ dài$i
      • Truyền chuỗi con đó cho Where-Object( ?) và trả về nếu:
        • Tập hợp con của mảng ( $a) không chứa chuỗi hiện tại $s, không khớp với chuỗi con hiện tại$_

Quay lại ở cấp độ chuỗi, chúng ta có tất cả các chuỗi con của chuỗi này không được tìm thấy trong các chuỗi khác, vì vậy hãy lấy chuỗi đầu tiên [0]vì chúng ta chỉ cần một trong số chúng, sau đó tiếp tục với chuỗi tiếp theo.


0

C # (Trình biên dịch tương tác Visual C #) , 149 byte

a=>a.Select(s=>{var t=s;for(int j=0,k,l=s.Length;j++<l;)for(k=-1;j+k++<l;)if(!a.Where(u=>s!=u&u.Contains(t=s.Substring(k,j))).Any())j=k=l;return t;})

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

Ít chơi gôn hơn ...

// a is an input array of strings
a=>
  // iterate over input array   
  a.Select(s=>{
    // t is the result string
    var t=s;
    // j is the substring length
    for(int j=0,k,l=s.Length;j++<l;)
      // k is the start index
      for(k=-1;j+k++<l;)
        // LINQ query to check if substring is valid
        // the tested string is collected in t
        if(!a.Where(u=>s!=u&u.Contains(t=s.Substring(k,j))).Any())
          // break loops
          j=k=l;
    // return result
    return 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.