Tìm danh sách con duy nhất ngắn nhất


14

Đưa ra một danh sách các danh sách tìm danh sách ngắn nhất là một danh sách con liền kề của chính xác một danh sách.

Ví dụ nếu chúng ta có

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

danh sách con tiếp giáp ngắn nhất sẽ là [3,4]vì nó chỉ xuất hiện trong danh sách thứ hai.

Nếu không có danh sách phụ liền kề duy nhất (điều này yêu cầu ít nhất một mục trùng lặp), hãy đưa ra một danh sách trống. Đây là một ví dụ

[[1,2,3],
 [1,2,3],
 [1,2]]

Nếu có nhiều danh sách phụ liền kề có kích thước tối thiểu, bạn có thể xuất bất kỳ danh sách nào trong số chúng hoặc danh sách chứa tất cả chúng. Ví dụ: nếu đầu vào là

[[1,2,3],[2],[1],[3]]

Bạn có thể xuất hoặc [1,2], [2,3]hoặc [[1,2],[2,3]]. Nếu bạn chọn thực hiện tùy chọn sau, bạn có thể xuất danh sách đơn cho các trường hợp chỉ có một giải pháp.

Đầu ra có thể xuất hiện trong cùng một danh sách nhiều lần miễn là nó xuất hiện trong danh sách khác. Ví dụ

[[1,2,1,2],[2,1]]

nên xuất ra [1,2][1,2]là một danh sách con của danh sách đầu tiên nhưng không phải là danh sách thứ hai, mặc dù nó là một danh sách con của danh sách đầu tiên theo hai cách khác nhau.

Bạn có thể lấy đầu vào một danh sách các danh sách chứa bất kỳ loại nào miễn là loại đó có hơn 100 giá trị có thể, tức là không có Booleans.

Đây là vì vậy câu trả lời sẽ được tính bằng byte với ít byte hơn.

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

[[1,1]] : [1]
[[1],[1]] : []
[[1,1],[1]] : [1,1]

Câu trả lời:


5

Husk , 12 14 15 byte

+3 byte cho trường hợp [[1,1]]

Ṡḟȯ¬€Ṡ-uÖLṁȯtuQ

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

Giải thích

          ṁ      -- map and concatenate
           ȯt    --   all but the first
             u   --   unique elements of
              Q  --   contiguous sublist
        ÖL       -- sort by length
Ṡḟ               -- find the first element satisfying this predicate
  ȯ¬€            --   not an element of
     Ṡ-          --   the list of sublists minus
       u         --   its unique elements

Lưu ý: Ṡ f g x = f (g x) xvà điều này thật khó để giải thích bằng phương pháp trên.


14 byte với lambda.
Zgarb

Điều đó không thành công cho[[1,1]]
H.PWiz

Hmm, và sửa nó làm cho nó hơn 15 byte. Ồ tốt
Zgarb

4

Bình thường, 15 byte

halDs-M.p.:R)QY

Bộ kiểm tra

Đầu tiên, chúng tôi tạo ra tất cả các chuỗi con của mỗi danh sách đầu vào với .:R)Q. Sau đó, chúng tôi tạo ra tất cả các thứ tự có thể, của các nhóm chuỗi con đó .p.

Bây giờ cho phần khó khăn : -M. Điều này gấp -chức năng trên mỗi danh sách đặt hàng. Nó bắt đầu với danh sách chuỗi con đầu tiên, sau đó lọc tất cả các cư dân của tất cả các danh sách khác.

Sau đó, các kết quả được nối, sắp xếp theo độ dài, a []được nối thêm và sau đó phần tử đầu tiên của danh sách kết quả được trích xuất h.

Điều này sẽ ngắn hơn 4 byte nếu tôi có thể không có danh sách phụ duy nhất thay vì xuất ra một danh sách trống.


Phiên bản 11 byte của bạn là gì?
Leaky Nun

@LeakyNun hlDs-M.p.:Rcó lẽ là những gì anh ấy có nghĩa.
FryAmTheEggman


2

Haskell , 149 128 126 113 byte

import Data.List
f l=[x|x<-l,sum[1|y<-l,y==x]<2]
h[]=[]
h(x:y)=x
i=h.f.sortOn length.(>>=tail.nub.(>>=tails).inits)

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

Đã lưu 21 byte nhờ Wheat Wizard, H.PWiz và Bruce Forte.

Đã lưu thêm hai byte nhờ H.PWiz.

Lưu được 13 byte nhờ nimi.

EDIT Đây là lời giải thích ban đầu:

  • a là một phím tắt để tham gia danh sách.

  • stính toán tất cả các danh sách con liên tục (tất cả tailstừ tất cả inits). Lưu ý rằngnub chỉ giữ lần xuất hiện đầu tiên của mỗi thành phần, vì vậy tailsẽ xóa danh sách trống khỏi danh sách phụ.

  • g hợp nhất tất cả các danh sách phụ từ tất cả các danh sách đã cho trong một danh sách lớn các danh sách phụ và sắp xếp chúng theo độ dài.

  • f f là bộ lọc trên các phần tử chỉ xuất hiện một lần trong danh sách lớn

  • h là phiên bản an toàn của head

  • i là keo

Khá không phù hợp! Cần có một giải pháp tốt hơn ...


2
Có vẻ như một vài chức năng của bạn có thể ngắn hơn nếu được viết dưới dạng các hàm không có điểm.
Đăng Rock Garf Hunter

1
Bạn cũng không phải tính i=vào cuối chương trình vì các chức năng không có điểm không cần phải được chỉ định theo quy tắc của chúng tôi.
Đăng Rock Garf Hunter

2
foldl1(++)chỉ concat?
H.PWiz

2
(length$filter(==x)l)có thể ngắn hơn length(filter(==x)l)hoặc thậm chí ngắn hơn nhưsum[1|y<-l,y==x]
Post Rock Garf Hunter

2
@ H.PWiz Trừ []nó, nhưng >>=idthậm chí còn ngắn hơn;) Ngoài ra @jferard: Bạn có thể nội tuyến có rất nhiều chức năng (ví dụ. f, gVv) vì bạn chỉ sử dụng chúng một lần.
ბიმო

2

Java 8, 251 + 19 = 270 byte

Một lambda rất thô từ, tối thiểu, List<List>đến List(tốt nhất để đúc nó thànhFunction<List<List<Integer>>, List<Integer>> mặc dù). Đó là một giải pháp vũ lực lặp đi lặp lại độ dài từ 1 đến kích thước của danh sách lớn nhất, trong mỗi trường hợp lặp lại trên mỗi đoạn có độ dài đó trong mỗi danh sách và kiểm tra từng đoạn như vậy đối với từng đoạn có kích thước bằng nhau trong mỗi danh sách khác.

Sợ tôi, người thu gom rác.

import java.util.*;

i->{int x,l=x=0,s,t;for(List z:i)x=Math.max(x,z.size());List r=i;while(l++<=x)for(List a:i)c:for(s=0;s<=a.size()-l;s++){for(List b:i)for(t=0;t<=b.size()-l;)if(b.subList(t,l+t++).equals(r=a.subList(s,s+l))&a!=b)continue c;return r;}return new Stack();}

Lambda

i -> {
    int
        x,
        l = x = 0,
        s, t
    ;
    for (List z : i)
        x = Math.max(x, z.size());
    List r = i;
    while (l++ <= x)
        for (List a : i)
            c: for (s = 0; s <= a.size() - l; s++) {
                for (List b : i)
                    for (t = 0; t <= b.size() - l; )
                        if (b.subList(t, l + t++).equals(r = a.subList(s, s + l)) & a != b)
                            continue c;
                return r;
            }
    return new Stack();
}

Dùng thử trực tuyến

Java 8, 289 + 45 = 334 byte

Đây là một cách tiếp cận chức năng hơn bằng cách sử dụng các luồng. Nếu có một phương pháp Streamđể giảm xuống chỉ còn các yếu tố xuất hiện một lần, giải pháp này sẽ đánh bại phương pháp trên. Gán cho cùng loại như trên.

import java.util.*;import java.util.stream.*;

l->{List<List>o=l.stream().flatMap(a->IntStream.range(1,a.size()+1).boxed().flatMap(n->IntStream.range(0,a.size()-n+1).mapToObj(k->a.subList(k,k+n)))).collect(Collectors.toList());o.sort((a,b)->a.size()-b.size());for(List a:o)if(o.indexOf(a)==o.lastIndexOf(a))return a;return new Stack();}

Lambda

l -> {
    List<List> o = l.stream()
        .flatMap(a -> IntStream.range(1, a.size() + 1)
            .boxed()
            .flatMap(n -> IntStream.range(0, a.size() - n + 1)
                .mapToObj(k -> a.subList(k, k + n))
            )
        )
        .collect(Collectors.toList())
    ;
    o.sort((a, b) -> a.size() - b.size());
    for (List a : o)
        if (o.indexOf(a) == o.lastIndexOf(a))
            return a;
    return new Stack();
}

Dùng thử trực tuyến


1

Thạch , 15 byte

Ẇ€Q€ẎɓċỊµÐf⁸LÐṂ

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

-3 byte nhờ Jonathan Allan


ċ1thể thay thế bằng S?

@ThePirateBay Quả thực có thể, cảm ơn. Tôi đã làm một phiên bản khác mặc dù. (mặc dù nó sẽ đưa nó đến cùng một số lượng lớn)
HyperNeutrino

Giải pháp mới của bạn in [1, 2, 1]cho đầu vào [[1,2],[1,2,1],[2,1,1]]trong khi [1,1]ngắn hơn.

@ThePirateBay Đã sửa, cảm ơn.
HyperNeutrino

1
@Jonathan Allan oh um. Tôi không thể đếm được. : P
HyperNeutrino


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.