Temukan sublist unik terpendek

14

Diberikan daftar daftar menemukan daftar terpendek yang merupakan sublist yang berdekatan dari satu daftar.

Misalnya kalau kita punya

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

sublist bersebelahan terpendek akan [3,4]karena hanya muncul di daftar kedua.

Jika tidak ada sublist berdekatan yang unik (ini membutuhkan setidaknya satu entri duplikat), buat daftar kosong. Berikut ini sebuah contoh

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

Jika ada beberapa daftar yang bersebelahan dengan ukuran minimal, Anda dapat menampilkan salah satu dari mereka atau daftar yang berisi semuanya. Misalnya jika input tadi

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

Anda dapat menampilkan [1,2], [2,3]atau [[1,2],[2,3]]. Jika Anda memilih untuk melakukan opsi terakhir, Anda dapat menampilkan daftar tunggal untuk kasus-kasus di mana hanya ada satu solusi.

Output dapat muncul dalam daftar yang sama lebih dari sekali selama itu muncul di daftar lain. Sebagai contoh

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

harus mengeluarkan [1,2]karena [1,2]merupakan sublist dari daftar pertama tetapi bukan yang kedua, meskipun itu adalah sublist dari daftar pertama dengan dua cara berbeda.

Anda dapat memasukkan daftar daftar yang berisi tipe apa saja asalkan tipe tersebut memiliki lebih dari 100 nilai yang mungkin, yaitu tidak ada Boolean.

Ini adalah sehingga jawaban akan dinilai dalam byte dengan lebih sedikit byte lebih baik.

Uji Kasus

[[1,1]] : [1]
[[1],[1]] : []
[[1,1],[1]] : [1,1]
Posting Rock Garf Hunter
sumber

Jawaban:

5

Sekam , 12 14 15 byte

+3 byte untuk case [[1,1]]

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

Cobalah online!

Penjelasan

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

Catatan: Ṡ f g x = f (g x) xdan ini sulit dijelaskan dengan menggunakan metode di atas.

H.Piz
sumber
14 byte dengan lambda.
Zgarb
Itu gagal untuk[[1,1]]
H.PWiz
Hmm, dan memperbaiki yang membuatnya lebih dari 15 byte. Baiklah.
Zgarb
4

Pyth, 15 byte

halDs-M.p.:R)QY

Suite uji

Pertama, kami membuat semua substring dari setiap daftar input .:R)Q. Kemudian, kami membuat semua pemesanan yang mungkin, dari grup substring tersebut .p.

Sekarang untuk bagian yang sulit: -M. Ini melipat -fungsi di atas setiap daftar pemesanan. Dimulai dengan daftar substring pertama, kemudian menyaring semua penghuni semua daftar lainnya.

Kemudian, hasilnya digabungkan, dipesan berdasarkan panjangnya, a [] ditambahkan, dan kemudian elemen pertama dari daftar yang dihasilkan diekstraksi dengan h.

Ini akan menjadi 4 byte lebih pendek jika saya bisa kesalahan pada tidak ada daftar unik daripada menghasilkan daftar kosong.

isaacg
sumber
Apa versi 11-byte Anda?
Leaky Nun
@ LeakyNun hlDs-M.p.:Rmungkin adalah apa yang dia maksud.
FryAmTheEggman
3

Pyth - 20 byte

Ksm.:d)QhalDfq1/KTKY

Test Suite .

Maltysen
sumber
Punya 16 byte , tapi saya tidak yakin ini benar. Kalau tidak, itu sangat mirip.
FryAmTheEggman
@FryAmTheEggman keren, Anda harus mempostingnya.
Maltysen
Gagal untuk uji kasus tepi yang baru ditambahkan [[1,1]].
Jonathan Allan
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)

Cobalah online!

Disimpan 21 byte berkat Wheat Wizard, H.PWiz dan Bruce Forte.

Disimpan dua byte lagi berkat H.PWiz.

Disimpan 13 byte berkat nimi.

EDIT Ini adalah penjelasan asli:

  • a adalah jalan pintas untuk bergabung dengan daftar.

  • smenghitung semua daftar berkelanjutan (semua tailsdari semua inits). Catatan yang nubhanya menyimpan kejadian pertama setiap elemen, sehingga tailakan menghapus daftar kosong dari sublists.

  • g menggabungkan semua daftar dari semua daftar yang diberikan dalam daftar besar daftar, dan mengurutkannya berdasarkan panjangnya.

  • f f adalah filter pada elemen yang muncul hanya sekali dalam daftar besar

  • h adalah versi aman dari head

  • i adalah lem

Cukup salah! Harus ada solusi yang lebih baik ...

jferard
sumber
2
Sepertinya beberapa fungsi Anda bisa lebih pendek jika ditulis sebagai fungsi point-free.
Posting Rock Garf Hunter
1
Anda juga tidak harus menghitung i=pada akhir program Anda karena fungsi bebas titik tidak perlu ditugaskan sesuai dengan aturan kami.
Posting Rock Garf Hunter
2
Apakah foldl1(++)adil concat?
H.PWiz
2
(length$filter(==x)l)bisa lebih pendek length(filter(==x)l)atau lebih pendek darisum[1|y<-l,y==x]
Post Rock Garf Hunter
2
@ H.PWiz Kecuali untuk []itu, tetapi >>=idbahkan lebih pendek;) Juga @jferard: Anda dapat menyejajarkan banyak fungsi (mis. f, gDll.) Karena Anda hanya menggunakannya sekali.
ბიმო
2

Java 8, 251 + 19 = 270 byte

Lambda yang sangat kotor dari, minimal, List<List>ke List(terbaik untuk melemparkannya keFunction<List<List<Integer>>, List<Integer>> meskipun). Ini adalah solusi brute force yang mengubah panjang chunk dari 1 ke ukuran daftar terbesar, dalam setiap kasus iterasi setiap chunk dengan panjang itu di setiap daftar dan memeriksa setiap chunk terhadap setiap chunk dengan ukuran yang sama di setiap daftar lainnya.

Takut saya, pemulung.

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 yang tidak tersentuh

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

Cobalah secara Online

Java 8, 289 + 45 = 334 byte

Ini adalah pendekatan yang lebih fungsional menggunakan aliran. Jika ada metode Streamuntuk mengurangi hanya elemen yang muncul sekali, solusi ini akan mengalahkan yang di atas. Tetapkan untuk jenis yang sama seperti di atas.

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 yang tidak tersentuh

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

Cobalah secara Online

Jakob
sumber
1

Jelly , 15 byte

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

Cobalah online!

-3 byte terima kasih kepada Jonathan Allan

HyperNeutrino
sumber
Bisakah ċ1diganti S?
@ThePirateBay Memang bisa, terima kasih. Saya membuat versi yang berbeda. (meskipun itu akan membawanya ke bytecount yang sama)
HyperNeutrino
Solusi baru Anda mencetak [1, 2, 1]untuk input [[1,2],[1,2,1],[2,1,1]]sementara [1,1]lebih pendek.
@ThePirateBay Tetap, terima kasih.
HyperNeutrino
1
@ Jonathan Allan oh um. Saya tidak bisa menghitung whoops. : P
HyperNeutrino
0

Pyth, 14 byte

sfq1lT.gksm{.:

Coba di sini.

Erik the Outgolfer
sumber