ค้นหารายการย่อยที่ไม่ซ้ำกันสั้นที่สุด


14

รับรายการของรายการค้นหารายการที่สั้นที่สุดที่เป็นรายการย่อยที่อยู่ติดกันของหนึ่งรายการ

เช่นถ้าเรามี

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

รายการย่อยที่อยู่ติดกันสั้นที่สุด[3,4]นั้นจะปรากฏในรายการที่สองเท่านั้น

หากไม่มีรายการย่อยที่อยู่ติดกันที่ไม่ซ้ำกัน (ต้องมีรายการที่ซ้ำกันอย่างน้อยหนึ่งรายการ) ให้ส่งออกรายการว่างเปล่า นี่คือตัวอย่าง

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

หากมีรายการย่อยที่อยู่ติดกันหลายรายการที่มีขนาดน้อยที่สุดคุณสามารถส่งออกรายการใดรายการหนึ่งหรือรายการที่มีทั้งหมด ตัวอย่างเช่นถ้าอินพุตเป็น

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

คุณสามารถส่งออกอย่างใดอย่างหนึ่ง[1,2], หรือ[2,3] [[1,2],[2,3]]หากคุณเลือกที่จะทำตัวเลือกหลังคุณสามารถส่งออกรายการเดี่ยวสำหรับกรณีที่มีทางออกเดียว

ผลลัพธ์อาจเกิดขึ้นในรายการเดียวกันมากกว่าหนึ่งครั้งตราบเท่าที่ปรากฏในไม่มีรายการอื่น ตัวอย่างเช่น

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

ควรส่งออก[1,2]เพราะ[1,2]เป็นรายการย่อยของรายการแรก แต่ไม่ใช่รายการที่สองแม้ว่าจะเป็นรายการย่อยของรายการแรกในสองวิธีที่ต่างกัน

คุณสามารถป้อนรายการที่มีประเภทใดก็ได้ตราบใดที่ประเภทนั้นมีค่าที่เป็นไปได้มากกว่า 100 ค่าเช่นไม่มี Booleans

นี่คือดังนั้นคำตอบจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์น้อยกว่าจะดีกว่า

กรณีทดสอบ

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

คำตอบ:


5

Husk , 12 14 15 ไบต์

+3 ไบต์สำหรับเคส [[1,1]]

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

ลองออนไลน์!

ชี้แจง

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

หมายเหตุ: Ṡ f g x = f (g x) xและนี่เป็นการยากที่จะอธิบายโดยใช้วิธีการด้านบน


14 ไบต์ด้วยแลมบ์ดา
Zgarb

ที่ล้มเหลวสำหรับ[[1,1]]
H.PWiz

อืมและการแก้ไขที่ทำให้เกิน 15 ไบต์ โอ้ดี
Zgarb

4

Pyth, 15 ไบต์

halDs-M.p.:R)QY

ชุดทดสอบ

.:R)Qครั้งแรกที่เราสร้างสตริงทั้งหมดของรายการแต่ละคนมีการป้อนข้อมูล จากนั้นเราจะสร้าง orderings .pเป็นไปได้ทั้งหมดในกลุ่มผู้

ตอนนี้สำหรับส่วนที่ยุ่งยาก: -M. -ฟังก์ชันนี้จะพับฟังก์ชั่นสั่งซื้อแต่ละรายการ มันเริ่มต้นด้วยรายการซับสตริงแรกจากนั้นกรองผู้โดยสารทั้งหมดของรายการอื่นทั้งหมด

จากนั้นผลจะตัดแบ่งได้รับคำสั่งจากระยะเวลาที่ถูกผนวกแล้วองค์ประกอบแรกของรายการที่เกิดขึ้นจะถูกสกัดด้วย[]h

นี่จะสั้นกว่า 4 ไบต์ถ้าฉันสามารถผิดพลาดในรายการย่อยที่ไม่ซ้ำกันแทนที่จะส่งออกรายการที่ว่างเปล่า


รุ่น 11 ไบต์ของคุณคืออะไร
Leun Nun

@LeakyNun hlDs-M.p.:Rอาจเป็นสิ่งที่เขาหมายถึง
FryAmTheEggman

3

Pyth - 20 ไบต์

Ksm.:d)QhalDfq1/KTKY

Test Suite


มี16 ไบต์แต่ฉันไม่แน่ใจว่าถูกต้อง ไม่อย่างนั้นมันจะคล้ายกันเลยทีเดียว
FryAmTheEggman

@FryAmTheEggman เจ๋งคุณควรโพสต์มัน
Maltysen

[[1,1]]ล้มเหลวสำหรับการทดสอบกรณีขอบเพิ่มเมื่อเร็ว ๆ นี้
Jonathan Allan

2

Haskell , 149 128 126 113 ไบต์

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)

ลองออนไลน์!

บันทึกแล้ว 21 ไบต์ขอบคุณ Wheat Wizard, H.PWiz และ Bruce Forte

บันทึกอีกสองไบต์ต้องขอบคุณ H.PWiz

บันทึกแล้ว 13 ไบต์ขอบคุณ nimi

แก้ไขนี่เป็นคำอธิบายดั้งเดิม:

  • a เป็นทางลัดสำหรับการเข้าร่วมรายการ

  • sคำนวณรายการย่อยที่ต่อเนื่องทั้งหมด (ทั้งหมดtailsจากทั้งหมดinits) โปรดทราบว่าnubจะมีการเกิดขึ้นครั้งแรกของแต่ละองค์ประกอบเท่านั้นดังนั้นtailจะลบรายการว่างออกจากรายการย่อย

  • g ผสานรายการย่อยทั้งหมดจากรายการที่กำหนดทั้งหมดในรายการย่อยขนาดใหญ่และเรียงตามความยาว

  • f f เป็นตัวกรององค์ประกอบที่ปรากฏเพียงครั้งเดียวในรายการใหญ่

  • h เป็นรุ่นที่ปลอดภัยของ head

  • i คือกาว

ค่อนข้างไม่เหมาะสม! ควรมีทางออกที่ดีกว่า ...


2
ดูเหมือนว่าฟังก์ชั่นสองอย่างของคุณอาจสั้นลงหากเขียนเป็นฟังก์ชั่นที่ไม่มีจุด
โพสต์ Rock Garf Hunter

1
นอกจากนี้คุณไม่จำเป็นต้องนับi=เมื่อสิ้นสุดโปรแกรมของคุณเพราะไม่จำเป็นต้องกำหนดฟังก์ชั่นแบบไร้จุดตามกฎของเรา
โพสต์ Rock Garf Hunter

2
เป็นfoldl1(++)เพียงconcat?
H.PWiz

2
(length$filter(==x)l)อาจสั้นลงlength(filter(==x)l)หรือสั้นลงได้sum[1|y<-l,y==x]
โพสต์ร็อคการ์ฟฮันเตอร์

2
@ H.PWiz ยกเว้น[]มันเป็น แต่>>=idแม้จะสั้น;) นอกจากนี้ยัง @jferard: คุณสามารถ inline จำนวนมากของฟังก์ชั่น (เช่น. f, gฯลฯ ) ตั้งแต่คุณจะใช้พวกเขาเมื่อ
ბიმო

2

Java 8, 251 + 19 = 270 ไบต์

แลมบ์ดาขั้นต้นมากจากน้อยที่สุดList<List>ไปList(ที่ดีที่สุดที่จะโยนมันFunction<List<List<Integer>>, List<Integer>>แม้ว่า) มันเป็นวิธีการแก้ปัญหากำลังดุร้ายที่วนซ้ำความยาวจาก 1 ถึงขนาดของรายการที่ใหญ่ที่สุดในแต่ละกรณีวนซ้ำทุกอันที่มีความยาวในทุกรายการและตรวจสอบแต่ละอันที่มีขนาดเท่ากันในรายการอื่น ๆ

กลัวฉันคนเก็บขยะ

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

แลมบ์ดา

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

ลองออนไลน์

Java 8, 289 + 45 = 334 ไบต์

นี่เป็นวิธีการที่ใช้งานได้มากกว่าโดยใช้สตรีม หากมีวิธีการในStreamการลดองค์ประกอบที่ปรากฏเพียงครั้งเดียวโซลูชั่นนี้จะได้เอาชนะหนึ่งข้างต้น กำหนดให้เป็นประเภทเดียวกันกับด้านบน

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

แลมบ์ดา

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

ลองออนไลน์


1

เยลลี่ 15 ไบต์

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

ลองออนไลน์!

-3 ไบต์ขอบคุณ Jonathan Allan


สามารถċ1ถูกแทนที่ด้วยS?

@ThePirateBay แน่นอนมันสามารถขอบคุณ ฉันทำรุ่นที่แตกต่างกัน (แม้ว่ามันจะนำมาให้เป็นจำนวนเดียวกัน)
HyperNeutrino

โซลูชันใหม่ของคุณพิมพ์[1, 2, 1]เพื่อป้อนข้อมูล[[1,2],[1,2,1],[2,1,1]]ในขณะที่[1,1]สั้นลง

@ThePirateBay คงที่ขอบคุณ
HyperNeutrino

1
@JanathanAllan โอ้หนอ ฉันไม่สามารถนับได้อ๊ะ : P
HyperNeutrino


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.