Tạo De Bruijn ngắn nhất


22

Trình tự De Bruijn rất thú vị: Đây là trình tự ngắn nhất, có chu kỳ chứa tất cả các trình tự có thể có của một bảng chữ cái đã cho có độ dài nhất định. Ví dụ: nếu chúng ta đang xem xét bảng chữ cái A, B, C và độ dài là 3, thì một đầu ra có thể là:

AAABBBCCCABCACCBBAACBCBABAC

Bạn sẽ nhận thấy rằng tất cả các khả năng chuỗi 3 ký tự sử dụng các chữ cái A, BCđang chờ ở đó.

Thử thách của bạn là tạo ra một chuỗi De Bruijn với càng ít ký tự càng tốt. Hàm của bạn sẽ có hai tham số, một số nguyên biểu thị độ dài của chuỗi và danh sách chứa bảng chữ cái. Đầu ra của bạn phải là chuỗi ở dạng danh sách.

Bạn có thể cho rằng mọi mục trong bảng chữ cái là khác biệt.

Một trình tạo ví dụ có thể được tìm thấy ở đây

Áp dụng sơ hở tiêu chuẩn


Số nguyên biểu thị độ dài của chuỗi có thể lớn hơn số lượng chữ cái duy nhất không?
kukac67

Vâng. Một chuỗi nhị phân có độ dài 4 sẽ là 0000111101100101
Nathan Merrill

"Thách thức của bạn là tạo ra một chuỗi De Bruijn với càng ít ký tự càng tốt" - Điều này có nghĩa là "mã golf" hay "có được độ dài chuỗi De Bruijn ngắn nhất có thể"?
FryAmTheEggman

2
Cả hai. Để đủ điều kiện, chương trình của bạn phải xuất ra chuỗi ngắn nhất có thể, nhưng để giành chiến thắng, chương trình của bạn phải ngắn nhất.
Nathan Merrill

2
@xem: thường là các chuỗi De Bruijn bao gồm cả chuỗi, đó là nơi các chuỗi bị thiếu xuất hiện.
Keith Randall

Câu trả lời:


6

Bình thường, 31 byte

Đây là chuyển đổi trực tiếp của thuật toán được sử dụng trong câu trả lời của tôi . Lời khuyên cho việc chơi golf chào mừng!

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

Mã này xác định một hàm gcó hai đối số, chuỗi danh sách các ký tự và số.

Ví dụ sử dụng:

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

Đầu ra:

AAABAACABBABCACBACCBBBCBCCC

Mở rộng mã:

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               #     "")

Hãy thử nó ở đây


4

CJam, 52 49 48 byte

Điều này là đáng ngạc nhiên dài. Điều này có thể được đánh golf rất nhiều, lấy lời khuyên từ bản dịch Pyth.

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

Đầu vào đi như

3 "ABC"

tức là - Chuỗi danh sách các ký tự và độ dài.

và đầu ra là chuỗi De Bruijn

AAABAACABBABCACBACCBBBCBCCC

Dùng thử trực tuyến tại đây


1
Gosh CJam nên bị cấm, nó không chỉ được thực hiện cho một nhiệm vụ chơi gôn mà dường như cho mọi nhiệm vụ chơi gôn có thể ...
flawr 23/12/14

2
@flawr bạn nên đợi câu trả lời Pyth sau đó: P
Trình tối ưu hóa

3

CJam, 52 49 byte

Đây là một cách tiếp cận khác nhau trong CJam:

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

Có đầu vào như thế này:

"ABC" 3

và tạo ra một tác phẩm Lyndon như

CCCBCCACBBCBACABCAABBBABAAA

Hãy thử nó ở đây.

Điều này làm cho việc sử dụng các mối quan hệ với các từ Lyndon . Nó tạo ra tất cả các từ Lyndon có độ dài n theo thứ tự từ điển (như được nêu trong bài viết Wikipedia đó), sau đó loại bỏ những từ có độ dài không chia n . Điều này đã mang lại chuỗi De Bruijn, nhưng vì tôi đang tạo ra các từ Lyndon dưới dạng các chuỗi chữ số, tôi cũng cần thay thế các từ đó bằng các chữ cái tương ứng ở cuối.

Vì lý do chơi gôn, tôi coi các chữ cái sau trong bảng chữ cái có thứ tự từ vựng thấp hơn.


1

JavaScript (ES6) 143

Sử dụng các từ Lyndon, như cây gậy của Martin, chỉ dài 3 lần ...

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
}

Kiểm tra trong bảng điều khiển FireFox / FireBug

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

Đầu ra

CCCBCCACBBCBACABCAABBBABAAA 0000100110101111

1

Python 2, 114 byte

Tôi không thực sự chắc chắn làm thế nào để chơi nó nhiều hơn, do cách tiếp cận của tôi.

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]

Dùng thử trực tuyến

Ung dung:

Mã này là một sửa đổi nhỏ từ giải pháp của tôi đến thách thức gần đây hơ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]

Lý do duy nhất [:1-n]là cần thiết là bởi vì chuỗi bao gồm bao quanh.


1

Powershell, 164 96 byte

-68 byte với -match O($n*2^n)thay vì trình tạo đệ quyO(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

Kịch bản thử nghiệm và thử nghiệm:

$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"
}

Đầu ra:

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

Xem thêm: Một chiếc nhẫn để cai trị tất cả. Một chuỗi để chứa tất cả

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.