가장 짧은 고유 한 하위 목록 찾기


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 개 이상의 가능한 값이 있으면 (예 : 부울이없는 경우) 유형을 포함하는 목록 목록을 입력으로 사용할 수 있습니다.

이것은 이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.

테스트 사례

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

답변:


5

껍질 , 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. 그런 다음 해당 하위 문자열 그룹의 가능한 모든 순서를 생성합니다 .p.

이제 까다로운 부분 : -M. 이것은 -각 주문 목록에 기능을 접습니다 . 첫 번째 하위 문자열 목록으로 시작한 다음 다른 모든 목록의 모든 탑승자를 필터링합니다.

그런 다음 결과를 길이별로 순서대로 연결하고 a []를 추가 한 다음 결과 목록의 첫 번째 요소를로 추출합니다 h.

빈 목록을 출력하는 대신 고유 하위 목록에서 오류가 발생할 수 있으면 4 바이트가 짧아집니다.


11 바이트 버전은 무엇입니까?
Leaky Nun

@LeakyNun hlDs-M.p.:R은 아마도 그가 의미하는 바일 것입니다.
FryAmTheEggman


2

하스켈 , 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)

온라인으로 사용해보십시오!

Wheat Wizard, H.PWiz 및 Bruce Forte 덕분에 21 바이트가 절약되었습니다.

H.PWiz 덕분에 2 바이트를 더 절약했습니다.

nimi 덕분에 13 바이트를 절약했습니다.

편집 원래 설명이었습니다.

  • a 목록 가입을위한 바로 가기입니다.

  • s모든 연속 하위 목록을 계산합니다 (모두 tails에서 모두 inits). 참고 nub각 요소의 요소를 선두를 유지, 그래서 tail하위 목록에서 빈 목록을 제거합니다.

  • g 주어진 모든 목록의 모든 하위 목록을 큰 하위 목록 목록으로 병합하고 길이별로 정렬합니다.

  • f f는 큰 목록에서 한 번만 나타나는 요소에 대한 필터입니다.

  • h 안전한 버전입니다 head

  • i 접착제인가

매우 우아합니다! 더 나은 해결책이 있어야합니다 ...


2
포인트없는 함수로 작성하면 함수 몇 개가 더 짧아 질 수 있습니다.
Post Rock Garf Hunter

1
i=포인트없는 기능은 규칙에 따라 할당 할 필요가 없으므로 프로그램 종료시 카운트를 세지 않아도됩니다.
Post Rock Garf Hunter

2
foldl1(++)단지 concat?
H.PWiz

2
(length$filter(==x)l)짧아 될 수 length(filter(==x)l)로 또는 짧은sum[1|y<-l,y==x]
포스트 록 Garf 헌터

2
@ H.PWiz를 제외하고 []는, 그러나 >>=id, 심지어 짧은) 또한 @jferard : 당신은 (많은 함수를 인라인 할 수 있습니다 예를 들어. f, g등) 한 번만 사용할 때문이다.
ბიმო 0:02에서

2

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

온라인 시도

자바 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ÐṂ

온라인으로 사용해보십시오!

Jonathan Allan 덕분에 -3 바이트


? ċ1로 교체 가능 S

@ThePirateBay 정말 감사합니다. 그래도 다른 버전을 만들었습니다. (그것은 같은 바이트 수로 가져올 것이지만)
바이트 수로 가져올 것이지만

새로운 솔루션 [1, 2, 1]이 입력 [[1,2],[1,2,1],[2,1,1]]을 위해 인쇄[1,1] 은 더 짧은 .

@ThePirateBay 고마워요.
HyperNeutrino

1
@JonathanAllan 오 음. 나는 백작을 셀 수 없습니다. : P
HyperNeutrino


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.