가장 짧은 De Bruijn 생성


22

De Bruijn 시퀀스는 흥미 롭습니다. 주어진 길이의 주어진 알파벳의 가능한 모든 시퀀스를 포함하는 가장 짧은 순환 시퀀스입니다. 예를 들어, 알파벳 A, B, C와 길이 3을 고려하면 가능한 출력은 다음과 같습니다.

AAABBBCCCABCACCBBAACBCBABAC

당신은 모든 가능한 3 문자 시퀀스가 문자를 사용하는 것을 볼 수 A, B그리고 C거기에 있습니다.

가능한 한 적은 문자로 De Bruijn 시퀀스를 생성하는 것이 어렵습니다. 함수는 시퀀스의 길이를 나타내는 정수와 알파벳을 포함하는리스트의 두 매개 변수를 가져야합니다. 출력은 목록 형식의 순서 여야합니다.

알파벳의 모든 항목이 고유하다고 가정 할 수 있습니다.

예제 생성기는 여기 에서 찾을 수 있습니다

표준 허점 적용


시퀀스 길이를 나타내는 정수가 고유 문자 수보다 클 수 있습니까?
kukac67

예. 길이가 4 인 이진 시퀀스는 0000111101100101입니다.
Nathan Merrill

"당신의 도전은 가능한 한 적은 문자로 De Bruijn 시퀀스를 생성하는 것입니다"-이것이 "코드 골프"또는 "가장 짧은 De Bruijn 시퀀스 길이를 얻습니까"를 의미합니까?
FryAmTheEggman

2
양자 모두. 자격을 갖추려면 프로그램이 가능한 가장 짧은 시퀀스를 출력해야하지만이기려면 프로그램이 가장 짧아야합니다.
Nathan Merrill

2
@xem : 일반적으로 De Bruijn 시퀀스에는 랩 어라운드가 포함되는데,이 시퀀스에서 누락 된 시퀀스가 ​​나타납니다.
Keith Randall

답변:


6

Pyth, 31 바이트

이것은 CJam 답변에 사용 된 알고리즘의 직접 변환입니다 . 골프 팁!

Mu?G}H+GG+G>Hefq<HT>G-lGTUH^GHk

이 코드는 g문자 목록과 숫자의 두 가지 인수를 취하는 함수 를 정의합니다 .

사용법 예 :

Mu?G}H+GG+G>Hefq<HT>G-lGTUH^GHkg"ABC"3

산출:

AAABAACABBABCACBACCBBBCBCCC

코드 확장 :

M                 # def g(G,H):
 u                #   return reduce(lambda G, H:
  ?G              #     (G if
    }H            #       (H in
      +GG         #          add(G,G)) else
    +G            #       add(G,
      >H          #         slice_end(H,
        e         #           last_element(
         f        #             Pfilter(lambda T:
          q       #               equal(
           <HT    #                 slice_start(H,T),
           >G     #                 slice_end(G,
             -lGT #                   minus(Plen(G),T))),
          UH      #               urange(H)))))),
  ^GH             #     cartesian_product(G,H),
  k               #     "")

여기 사용해보십시오


4

CJam, 52 49 48 바이트

놀랍게도 길다. 이것은 Pyth 번역의 팁을 받아 많은 골프를 할 수 있습니다.

q~a*{m*:s}*{:H\:G_+\#)GGHH,,{_H<G,@-G>=},W=>+?}*

입력은 다음과 같습니다

3 "ABC"

ie-문자 목록 및 길이의 문자열

출력은 De Bruijn 문자열입니다.

AAABAACABBABCACBACCBBBCBCCC

여기에서 온라인으로 사용해보십시오


1
Gosh CJam은 금지되어야한다. 단지 하나의 골프 과제를 위해서만 만들어지는 것이 아니라 가능한 모든 골프 과제를 위해 보인다.
flawr

2
@flawr 다음 Pyth 답변을 기다려야합니다 : P
Optimizer

3

CJam, 52 49 바이트

CJam의 다른 접근 방식은 다음과 같습니다.

l~:N;:L,(:Ma{_N*N<0{;)_!}g(+_0a=!}g]{,N\%!},:~Lf=

다음과 같이 입력을받습니다.

"ABC" 3

같은 린든 작품을 생산

CCCBCCACBBCBACABCAABBBABAAA

여기에서 시도하십시오.

이것은 Lyndon 단어와의 관계를 이용 합니다 . 그것은 길이가 n 인 모든 Lyndon 단어를 사전 순으로 생성 한 다음 (Wikipedia 기사에 요약 된 바와 같이) 길이가 나누지 않는 단어 를 삭제합니다. n을 . 이것은 이미 De Bruijn 시퀀스를 생성하지만 Lyndon 단어를 숫자 문자열로 생성하므로 끝에있는 해당 문자로 대체해야합니다.

골프를하기 위해 알파벳의 뒤 따르는 글자가 사전 식 순서가 낮은 것으로 간주합니다.


1

자바 스크립트 (ES6) 143

Martin의 aswer와 같은 Lyndon 단어를 사용하면 길이가 3 배에 불과합니다.

F=(a,n)=>{
  for(w=[-a[l='length']],r='';w[0];)
  {
    n%w[l]||w.map(x=>r+=a[~x]);
    for(;w.push(...w)<=n;);
    for(w[l]=n;!~(z=w.pop()););
    w.push(z+1)
  }
  return r
}

FireFox / FireBug 콘솔에서 테스트

console.log(F("ABC",3),F("10",4))

산출

CCCBCCACBBCBACABCAABBBABAAA 0000100110101111

1

파이썬 2, 114 바이트

내 접근 방식으로 인해 골프를 더 잘하는 방법을 잘 모르겠습니다.

def f(a,n):
 s=a[-1]*n
 while 1:
    for c in a:
     if((s+c)[len(s+c)-n:]in s)<1:s+=c;break
    else:break
 print s[:1-n]

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

언 골프 드 :

이 코드는 내 솔루션 에서 최신 과제 로 간단하게 수정되었습니다 .

def f(a,n):
    s=a[-1]*n
    while 1:
        for c in a:
            p=s+c
            if p[len(p)-n:]in s:
                continue
            else:
                s=p
                break
        else:
            break
    print s[:1-n]

유일한 이유 [:1-n]순서는 랩 어라운드 포함되어 있기 때문에 필요한입니다.


1

파워 쉘, 164 96 바이트

O($n*2^n)재귀 생성기 대신 -match를 사용하는 -68 바이트O(n*log(n))

param($s,$n)for(;$z=$s|% t*y|?{"$($s[-1])"*($n-1)+$x-notmatch-join"$x$_"[-$n..-1]}){$x+=$z[0]}$x

언 골프 및 테스트 스크립트 :

$f = {

param($s,$n)                    # $s is a alphabet, $n is a subsequence length
for(;                           # repeat until...
    $z=$s|% t*y|?{              # at least a character from the alphabet returns $true for expression:
        "$($s[-1])"*($n-1)+$x-notmatch  # the old sequence that follows two characters (the last letter from the alphabet) not contains
        -join"$x$_"[-$n..-1]    # n last characters from the new sequence
}){
    $x+=$z[0]                   # replace old sequence with new sequence
}
$x                              # return the sequence

}

@(
    ,("ABC",  2, "AABACBBCC")
    ,("ABC",  3, "AAABAACABBABCACBACCBBBCBCCC")
    ,("ABC",  4, "AAAABAAACAABBAABCAACBAACCABABACABBBABBCABCBABCCACACBBACBCACCBACCCBBBBCBBCCBCBCCCC")
    ,("ABC",  5, "AAAAABAAAACAAABBAAABCAAACBAAACCAABABAABACAABBBAABBCAABCBAABCCAACABAACACAACBBAACBCAACCBAACCCABABBABABCABACBABACCABBACABBBBABBBCABBCBABBCCABCACABCBBABCBCABCCBABCCCACACBACACCACBBBACBBCACBCBACBCCACCBBACCBCACCCBACCCCBBBBBCBBBCCBBCBCBBCCCBCBCCBCCCCC")
    ,("ABC",  6, "AAAAAABAAAAACAAAABBAAAABCAAAACBAAAACCAAABABAAABACAAABBBAAABBCAAABCBAAABCCAAACABAAACACAAACBBAAACBCAAACCBAAACCCAABAABAACAABABBAABABCAABACBAABACCAABBABAABBACAABBBBAABBBCAABBCBAABBCCAABCABAABCACAABCBBAABCBCAABCCBAABCCCAACAACABBAACABCAACACBAACACCAACBABAACBACAACBBBAACBBCAACBCBAACBCCAACCABAACCACAACCBBAACCBCAACCCBAACCCCABABABACABABBBABABBCABABCBABABCCABACACABACBBABACBCABACCBABACCCABBABBABCABBACBABBACCABBBACABBBBBABBBBCABBBCBABBBCCABBCACABBCBBABBCBCABBCCBABBCCCABCABCACBABCACCABCBACABCBBBABCBBCABCBCBABCBCCABCCACABCCBBABCCBCABCCCBABCCCCACACACBBACACBCACACCBACACCCACBACBACCACBBBBACBBBCACBBCBACBBCCACBCBBACBCBCACBCCBACBCCCACCACCBBBACCBBCACCBCBACCBCCACCCBBACCCBCACCCCBACCCCCBBBBBBCBBBBCCBBBCBCBBBCCCBBCBBCBCCBBCCBCBBCCCCBCBCBCCCBCCBCCCCCC")
    ,("01",   3, "00010111")
    ,("01",   4, "0000100110101111")
    ,("abcd", 2, "aabacadbbcbdccdd")
    ,("0123456789", 3, "0001002003004005006007008009011012013014015016017018019021022023024025026027028029031032033034035036037038039041042043044045046047048049051052053054055056057058059061062063064065066067068069071072073074075076077078079081082083084085086087088089091092093094095096097098099111211311411511611711811912212312412512612712812913213313413513613713813914214314414514614714814915215315415515615715815916216316416516616716816917217317417517617717817918218318418518618718818919219319419519619719819922232242252262272282292332342352362372382392432442452462472482492532542552562572582592632642652662672682692732742752762772782792832842852862872882892932942952962972982993334335336337338339344345346347348349354355356357358359364365366367368369374375376377378379384385386387388389394395396397398399444544644744844945545645745845946546646746846947547647747847948548648748848949549649749849955565575585595665675685695765775785795865875885895965975985996667668669677678679687688689697698699777877978878979879988898999")
    ,("9876543210", 3, "9998997996995994993992991990988987986985984983982981980978977976975974973972971970968967966965964963962961960958957956955954953952951950948947946945944943942941940938937936935934933932931930928927926925924923922921920918917916915914913912911910908907906905904903902901900888788688588488388288188087787687587487387287187086786686586486386286186085785685585485385285185084784684584484384284184083783683583483383283183082782682582482382282182081781681581481381281181080780680580480380280180077767757747737727717707667657647637627617607567557547537527517507467457447437427417407367357347337327317307267257247237227217207167157147137127117107067057047037027017006665664663662661660655654653652651650645644643642641640635634633632631630625624623622621620615614613612611610605604603602601600555455355255155054454354254154053453353253153052452352252152051451351251151050450350250150044434424414404334324314304234224214204134124114104034024014003332331330322321320312311310302301300222122021121020120011101000")
) |% {
    $s,$n,$e = $_
    $r = &$f $s $n
    "$($r-eq$e): $r"
}

산출:

True: AABACBBCC
True: AAABAACABBABCACBACCBBBCBCCC
True: AAAABAAACAABBAABCAACBAACCABABACABBBABBCABCBABCCACACBBACBCACCBACCCBBBBCBBCCBCBCCCC
True: AAAAABAAAACAAABBAAABCAAACBAAACCAABABAABACAABBBAABBCAABCBAABCCAACABAACACAACBBAACBCAACCBAACCCABABBABABCABACBABACCABBACABBBBABBBCABBCBABBCCABCACABCBBABCBCABCCBABCCCACACBACACCACBBBACBBCACBCBACBCCACCBBACCBCACCCBACCCCBBBBBCBBBCCBBCBCBBCCCBCBCCBCCCCC
True: AAAAAABAAAAACAAAABBAAAABCAAAACBAAAACCAAABABAAABACAAABBBAAABBCAAABCBAAABCCAAACABAAACACAAACBBAAACBCAAACCBAAACCCAABAABAACAABABBAABABCAABACBAABACCAABBABAABBACAABBBBAABBBCAABBCBAABBCCAABCABAABCACAABCBBAABCBCAABCCBAABCCCAACAACABBAACABCAACACBAACACCAACBABAACBACAACBBBAACBBCAACBCBAACBCCAACCABAACCACAACCBBAACCBCAACCCBAACCCCABABABACABABBBABABBCABABCBABABCCABACACABACBBABACBCABACCBABACCCABBABBABCABBACBABBACCABBBACABBBBBABBBBCABBBCBABBBCCABBCACABBCBBABBCBCABBCCBABBCCCABCABCACBABCACCABCBACABCBBBABCBBCABCBCBABCBCCABCCACABCCBBABCCBCABCCCBABCCCCACACACBBACACBCACACCBACACCCACBACBACCACBBBBACBBBCACBBCBACBBCCACBCBBACBCBCACBCCBACBCCCACCACCBBBACCBBCACCBCBACCBCCACCCBBACCCBCACCCCBACCCCCBBBBBBCBBBBCCBBBCBCBBBCCCBBCBBCBCCBBCCBCBBCCCCBCBCBCCCBCCBCCCCCC
True: 00010111
True: 0000100110101111
True: aabacadbbcbdccdd
True: 0001002003004005006007008009011012013014015016017018019021022023024025026027028029031032033034035036037038039041042043044045046047048049051052053054055056057058059061062063064065066067068069071072073074075076077078079081082083084085086087088089091092093094095096097098099111211311411511611711811912212312412512612712812913213313413513613713813914214314414514614714814915215315415515615715815916216316416516616716816917217317417517617717817918218318418518618718818919219319419519619719819922232242252262272282292332342352362372382392432442452462472482492532542552562572582592632642652662672682692732742752762772782792832842852862872882892932942952962972982993334335336337338339344345346347348349354355356357358359364365366367368369374375376377378379384385386387388389394395396397398399444544644744844945545645745845946546646746846947547647747847948548648748848949549649749849955565575585595665675685695765775785795865875885895965975985996667668669677678679687688689697698699777877978878979879988898999
True: 9998997996995994993992991990988987986985984983982981980978977976975974973972971970968967966965964963962961960958957956955954953952951950948947946945944943942941940938937936935934933932931930928927926925924923922921920918917916915914913912911910908907906905904903902901900888788688588488388288188087787687587487387287187086786686586486386286186085785685585485385285185084784684584484384284184083783683583483383283183082782682582482382282182081781681581481381281181080780680580480380280180077767757747737727717707667657647637627617607567557547537527517507467457447437427417407367357347337327317307267257247237227217207167157147137127117107067057047037027017006665664663662661660655654653652651650645644643642641640635634633632631630625624623622621620615614613612611610605604603602601600555455355255155054454354254154053453353253153052452352252152051451351251151050450350250150044434424414404334324314304234224214204134124114104034024014003332331330322321320312311310302301300222122021121020120011101000

그들 모두를 지배하기 위해 하나의 반지를 참조하십시오 . 모두를 포함하는 하나의 문자열

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