Finden Sie die kürzeste eindeutige Unterliste

14

Bei einer gegebenen Liste von Listen finden Sie die kürzeste Liste, die eine zusammenhängende Unterliste von genau einer Liste ist.

Zum Beispiel, wenn wir hatten

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

Die kürzeste zusammenhängende Unterliste wäre, [3,4]da sie nur in der zweiten Liste erscheint.

Wenn es keine eindeutige zusammenhängende Unterliste gibt (dies erfordert mindestens einen doppelten Eintrag), geben Sie eine leere Liste aus. Hier ist ein Beispiel

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

Wenn mehrere zusammenhängende Unterlisten von minimaler Größe vorhanden sind, können Sie eine beliebige oder eine alle enthaltende Liste ausgeben. Zum Beispiel, wenn die Eingabe war

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

Sie könnten Ausgang entweder [1,2], [2,3]oder [[1,2],[2,3]]. Wenn Sie die letztere Option wählen, können Sie Singleton-Listen für die Fälle ausgeben, in denen es nur eine Lösung gibt.

Die Ausgabe kann in derselben Liste mehrmals vorkommen, solange sie in keiner anderen Liste enthalten ist. Beispielsweise

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

sollte ausgegeben werden, [1,2]weil [1,2]es sich um eine Unterliste der ersten Liste handelt, aber nicht um die zweite, obwohl es sich auf zwei verschiedene Arten um eine Unterliste der ersten Liste handelt.

Als Eingabe können Sie eine Liste von Listen verwenden, die einen beliebigen Typ enthalten, sofern dieser Typ mehr als 100 mögliche Werte aufweist, dh keine Booleschen Werte.

Dies ist daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.

Testfälle

[[1,1]] : [1]
[[1],[1]] : []
[[1,1],[1]] : [1,1]
Post Rock Garf Hunter
quelle

Antworten:

5

Schale , 12 14 15 Bytes

+3 Bytes für Groß- und Kleinschreibung [[1,1]]

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

Probieren Sie es online!

Erklärung

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

Hinweis: Ṡ f g x = f (g x) xDies lässt sich mit der oben beschriebenen Methode nur schwer erklären.

H.PWiz
quelle
14 Bytes mit einem Lambda.
Zgarb
Das schlägt fehl für[[1,1]]
H.PWiz
Hmm, und das Fixing macht es über 15 Bytes. Naja.
Zgarb
4

Pyth, 15 Bytes

halDs-M.p.:R)QY

Testsuite

Zunächst generieren wir alle Teilstrings jeder Eingabeliste mit .:R)Q. Dann generieren wir alle möglichen Ordnungen dieser Teilzeichenfolgengruppen .p.

Nun zum kniffligen Teil: -M . Dies faltet die -Funktion über jede Bestellliste. Es beginnt mit der ersten Teilzeichenfolgenliste und filtert dann alle Insassen aller anderen Listen heraus.

Dann werden die Ergebnisse verkettet, geordnet nach Länge, a [] angehängt und dann das erste Element der resultierenden Liste mit extrahiert h.

Dies wäre 4 Bytes kürzer, wenn ich auf keinen eindeutigen Unterlisten Fehler machen könnte, anstatt eine leere Liste auszugeben.

isaacg
quelle
Was ist Ihre 11-Byte-Version?
Undichte Nonne
@LeakyNun hlDs-M.p.:Rist wahrscheinlich das, was er meint.
FryAmTheEggman
3

Pyth - 20 Bytes

Ksm.:d)QhalDfq1/KTKY

Test Suite .

Maltysen
quelle
Erhalten 16 Bytes , aber ich bin nicht sicher , ob dies richtig ist. Ansonsten ist es ziemlich ähnlich.
FryAmTheEggman
@FryAmTheEggman cool, du solltest es posten.
Maltysen
Schlägt für den kürzlich hinzugefügten Edge-Case-Test fehl [[1,1]].
Jonathan Allan
2

Haskell , 149 128 126 113 Bytes

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)

Probieren Sie es online!

Dank Wheat Wizard, H.PWiz und Bruce Forte 21 Bytes gespart.

Zwei weitere Bytes dank H.PWiz gespeichert.

13 Bytes dank nimi gespart.

BEARBEITEN Dies war die ursprüngliche Erklärung:

  • a ist eine Verknüpfung zum Verbinden von Listen.

  • sberechnet alle fortlaufenden Unterlisten (alle tailsvon allen inits). Beachten Sie, dass nubnur das erste Vorkommen jedes Elements beibehalten wird, sodass taildie leere Liste aus den Unterlisten entfernt wird.

  • g Führt alle Unterlisten aus allen angegebenen Listen in einer großen Liste von Unterlisten zusammen und sortiert sie nach Länge.

  • f f ist ein Filter für Elemente, die in der großen Liste nur einmal vorkommen

  • h ist eine sichere Version von head

  • i ist der Kleber

Ziemlich unelegant! Es sollte eine bessere Lösung geben ...

jferard
quelle
2
Es sieht so aus, als ob einige Ihrer Funktionen kürzer wären, wenn sie als punktfreie Funktionen geschrieben würden.
Post Rock Garf Hunter
1
Sie müssen auch nicht i=das Ende Ihres Programms abzählen , da punktfreie Funktionen nicht gemäß unseren Regeln zugewiesen werden müssen.
Post Rock Garf Hunter
2
Ist foldl1(++)einfach concat?
H.PWiz
2
(length$filter(==x)l)könnte kürzer length(filter(==x)l)oder sogar kürzer sein alssum[1|y<-l,y==x]
Post Rock Garf Hunter
2
@ H.PWiz Abgesehen []davon ist es aber >>=idnoch kürzer;) Auch @jferard: Du kannst viele Funktionen (z. B. etc.) einbinden f, gda du sie nur einmal verwendest.
13.
2

Java 8, 251 + 19 = 270 Bytes

Ein sehr grobes Lambda von, minimal, List<List>bis List(am besten, um es zu werfen, Function<List<List<Integer>>, List<Integer>>obwohl). Es ist eine Brute-Force-Lösung, die Chunk-Längen von 1 bis zur Größe der größten Liste iteriert. Dabei wird jeweils jeder Chunk dieser Länge in jeder Liste durchlaufen und jeder solche Chunk mit jedem Chunk gleicher Größe in jeder anderen Liste verglichen.

Fürchte mich, Müllmann.

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

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

Probieren Sie es online

Java 8, 289 + 45 = 334 Bytes

Dies ist ein funktionalerer Ansatz, bei dem Streams verwendet werden. Wenn es eine Methode gäbe Stream, die auf nur einmal auftretende Elemente reduziert, hätte diese Lösung die oben beschriebene übertroffen. Weisen Sie den gleichen Typ wie oben zu.

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

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

Probieren Sie es online

Jakob
quelle
1

Gelee , 15 Bytes

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

Probieren Sie es online!

-3 Bytes dank Jonathan Allan

HyperNeutrino
quelle
Kann ċ1durch ersetzt werden S?
@ThePirateBay Tatsächlich kann es, danke. Ich habe allerdings eine andere Version gemacht. (obwohl es das gleiche bytecount bringen würde)
HyperNeutrino
Ihre neue Lösung wird [1, 2, 1]zur Eingabe gedruckt, [[1,2],[1,2,1],[2,1,1]]solange sie [1,1]kürzer ist.
@ThePirateBay Behoben, danke.
HyperNeutrino
1
@ JonathanAllan oh ähm. Ich kann nicht zählen, whoops. : P
HyperNeutrino