Znajdź najkrótszą unikalną listę

14

Na podstawie listy list znajdź najkrótszą listę, która jest ciągłą podlistą dokładnie jednej listy.

Na przykład, gdybyśmy mieli

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

najkrótsza ciągła podlista byłaby, [3,4]ponieważ pojawia się tylko na drugiej liście.

Jeśli nie ma unikalnej ciągłej podlisty (wymaga to co najmniej jednej zduplikowanej pozycji), wypisz pustą listę. Oto przykład

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

Jeśli istnieje wiele sąsiadujących podlist o minimalnym rozmiarze, możesz wypisać dowolną z nich lub listę zawierającą wszystkie. Na przykład, jeśli dane wejściowe były

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

Możesz wyprowadzić albo [1,2], [2,3]albo [[1,2],[2,3]]. Jeśli wybierzesz tę drugą opcję, możesz wypisać listy singletonów dla przypadków, w których istnieje tylko jedno rozwiązanie.

Dane wyjściowe mogą występować na tej samej liście więcej niż jeden raz, o ile nie występują na żadnej innej liście. Na przykład

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

powinien wypisywać, [1,2]ponieważ [1,2]jest podlistą pierwszej listy, ale nie drugiej, mimo że jest podlistą pierwszej listy na dwa różne sposoby.

Jako dane wejściowe możesz wziąć listę zawierającą dowolny typ, o ile ten typ ma więcej niż 100 możliwych wartości, tj. Brak boolean.

To jest więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.

Przypadki testowe

[[1,1]] : [1]
[[1],[1]] : []
[[1,1],[1]] : [1,1]
Post Rock Garf Hunter
źródło

Odpowiedzi:

5

Łuska , 12 14 15 bajtów

+3 bajty na skrzynkę [[1,1]]

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

Wypróbuj online!

Wyjaśnienie

          ṁ      -- 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

Uwaga: Ṡ f g x = f (g x) xi trudno to wyjaśnić za pomocą powyższej metody.

H.PWiz
źródło
14 bajtów z lambda.
Zgarb,
Że nie za[[1,1]]
H.PWiz
Hmm, a naprawianie powoduje, że ma ponad 15 bajtów. No cóż.
Zgarb,
4

Pyth, 15 bajtów

halDs-M.p.:R)QY

Zestaw testowy

Najpierw generujemy wszystkie podciągi z każdej listy danych wejściowych za pomocą .:R)Q. Następnie generujemy wszystkie możliwe uporządkowania tych grup podciągów .p.

Teraz najtrudniejsza część: -M. Spowoduje to złożenie -funkcji na każdą listę zamówień. Zaczyna się od pierwszej listy podciągów, a następnie odfiltrowuje wszystkich użytkowników wszystkich pozostałych list.

Następnie wyniki są łączone, uporządkowane według długości, []dołączane jest a, a następnie wypakowywany jest pierwszy element listy wynikowej h.

Byłbym o 4 bajty krótszy, gdybym mógł popełnić błąd na żadnej unikalnej liście podrzędnej zamiast wypisać pustą listę.

isaacg
źródło
Jaka jest Twoja 11-bajtowa wersja?
Leaky Nun
@LeakyNun hlDs-M.p.:Rjest prawdopodobnie tym, co ma na myśli.
FryAmTheEggman
3

Pyth - 20 bajtów

Ksm.:d)QhalDfq1/KTKY

Pakiet testowy .

Maltysen
źródło
Mam 16 bajtów , ale nie jestem pewien, czy to prawda. W przeciwnym razie jest to bardzo podobne.
FryAmTheEggman
@FryAmTheEggman spoko, powinieneś to opublikować.
Maltysen
Nie powiodło się ostatnio dodane badanie przypadku krawędzi [[1,1]].
Jonathan Allan,
2

Haskell , 149 128 126 113 113 bajtów

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)

Wypróbuj online!

Zaoszczędzono 21 bajtów dzięki Wheat Wizard, H.PWiz i Bruce Forte.

Zaoszczędź dwa kolejne bajty dzięki H.PWiz.

Zaoszczędź 13 bajtów dzięki nim.

EDYCJA To było oryginalne wyjaśnienie:

  • a to skrót do łączenia list.

  • soblicza wszystkie ciągłe listy podrzędne (wszystkie tailsze wszystkich inits). Zauważ, że nubzachowuje tylko pierwsze wystąpienie każdego elementu, więc tailusunie pustą listę z list podrzędnych.

  • g scala wszystkie podlisty ze wszystkich podanych list w dużą listę podlist i sortuje je według długości.

  • f f jest filtrem elementów, które pojawiają się tylko raz na dużej liście

  • h jest bezpieczną wersją head

  • i jest klejem

Całkiem nieeleganckie! Powinno być lepsze rozwiązanie ...

Jferard
źródło
2
Wygląda na to, że niektóre z twoich funkcji mogą być krótsze, jeśli są napisane jako funkcje bez punktów.
Post Rock Garf Hunter,
1
Nie musisz także liczyć i=na końcu programu, ponieważ funkcje bez punktów nie muszą być przypisywane zgodnie z naszymi zasadami.
Post Rock Garf Hunter
2
Czy foldl1(++)tylko concat?
H.PWiz
2
(length$filter(==x)l)może być krótszy length(filter(==x)l)lub nawet krótszy jakosum[1|y<-l,y==x]
Post Rock Garf Hunter
2
@ H.PWiz wyjątkiem []jest, ale >>=idjest jeszcze krótszy;) Również @jferard: Można inline wiele funkcji (np. f, gItd.), Gdyż tylko ich użyć tylko raz.
ბიმო
2

Java 8, 251 + 19 = 270 bajtów

Bardzo obrzydliwa lambda od, minimalnie, List<List>do List( Function<List<List<Integer>>, List<Integer>>chociaż najlepiej ją rzucić ). Jest to rozwiązanie brutalnej siły, które iteruje długości fragmentu od 1 do wielkości największej listy, w każdym przypadku iteruje każdy fragment tej długości na każdej liście i sprawdza każdy taki fragment z każdym kawałkiem o równej wielkości na każdej innej liście.

Obawiaj się, śmieciarz.

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

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

Wypróbuj online

Java 8, 289 + 45 = 334 bajty

Jest to bardziej funkcjonalne podejście wykorzystujące strumienie. Gdyby istniała metoda Streamzredukowania do tylko elementów, które pojawiają się raz, to rozwiązanie pokonałoby powyższy. Przypisz do tego samego typu jak powyżej.

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

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

Wypróbuj online

Jakob
źródło
1

Galaretka , 15 bajtów

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

Wypróbuj online!

-3 bajty dzięki Jonathanowi Allanowi

HyperNeutrino
źródło
Można ċ1zastąpić S?
@ThePirateBay Rzeczywiście może, dzięki. Zrobiłem jednak inną wersję. (choć przyniosłoby to tę samą liczbę bajtów)
HyperNeutrino,
Nowe rozwiązanie drukuje [1, 2, 1]do wprowadzenia, [[1,2],[1,2,1],[2,1,1]]gdy [1,1]jest krótsze.
@ThePirateBay Naprawiono, dziękuję.
HyperNeutrino,
1
@JonathanAllan oh um. Nie mogę liczyć. : P
HyperNeutrino
0

Pyth, 14 bajtów

sfq1lT.gksm{.:

Wypróbuj tutaj.

Erik the Outgolfer
źródło