En kısa De Bruijn'ı üret


22

Bir De Bruijn dizisi ilginçtir: Belirli bir uzunlukta belirli bir alfabenin tüm olası dizilerini içeren en kısa, döngüsel dizidir. Örneğin, A, B, C alfabesini ve 3 uzunluğunu düşünüyor olsaydık, olası bir sonuç:

AAABBBCCCABCACCBBAACBCBABAC

Olası her 3 karakterli dizisi harfler kullanılarak göreceksiniz A, Bve Ciçeride.

Buradaki zorluk, mümkün olduğunca az karakterde bir De Bruijn dizisi oluşturmak. İşleviniz iki parametre almalıdır, dizilerin uzunluğunu temsil eden bir tam sayı ve alfabeyi içeren bir liste. Çıktınız liste biçimindeki sıra olmalıdır.

Alfabedeki her öğenin farklı olduğunu varsayabilirsiniz.

Örnek bir jeneratör burada bulunabilir

Standart boşluklar uygulanır


Dizilerin uzunluğunu temsil eden tam sayı, benzersiz harf sayısından daha büyük olabilir mi?
kukac67

Evet. 4 uzunluğundaki bir ikili dizi 0000111101100101 olur
Nathan Merrill,

"Zorluğunuz mümkün olduğunca az karakterde bir De Bruijn dizisi oluşturmak" - Bu "kod golf" veya "mümkün olan en kısa De Bruijn dizi uzunluğunu almak" anlamına mı geliyor?
FryAmTheEggman

2
Her ikisi de. Kalifiye olmak için, programınız mümkün olan en kısa diziyi göstermelidir, ancak kazanmak için programınız en kısa olmalıdır.
Nathan Merrill

2
@xem: genellikle De Bruijn dizileri, eksik dizilerin göründüğü sargıyı içerir.
Keith Randall

Yanıtlar:


6

Pyth, 31 bayt

Bu, CJam cevabımda kullanılan algoritmanın doğrudan dönüştürülmesidir . Golf için ipuçları

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

Bu kod, giki argüman alan bir işlevi , karakter listesinin dizesini ve sayıyı tanımlar .

Örnek kullanım:

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

Çıktı:

AAABAACABBABCACBACCBBBCBCCC

Kod genişletme:

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

Burada dene


4

CJam, 52 49 48 bayt

Bu şaşırtıcı derecede uzun. Bu Pyth çevirisinden ipuçlarını alarak çokça golf oynayabilir.

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

Giriş gibi gider

3 "ABC"

ie - Karakterlerin listesi ve uzunluk.

ve çıktı De Bruijn dizedir

AAABAACABBABCACBACCBBBCBCCC

Burada çevrimiçi deneyin


1
Tanrım CJam yasaklandı, sadece bir golf
oyunu

2
@flawr sonra Pyth cevabını beklemelisin: P
Doktoru

3

CJam, 52 49 bayt

İşte CJam'da farklı bir yaklaşım:

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

Bu şekilde girdi alır:

"ABC" 3

ve gibi bir Lyndon çalışması üretir

CCCBCCACBBCBACABCAABBBABAAA

Burada dene.

Bu Lyndon kelimelerle olan ilişkisini kullanır . Bu, n uzunluktaki tüm Lyndon kelimelerini leksikografik sıraya göre üretir (bu Wikipedia makalesinde belirtildiği gibi), sonra uzunluğu n'yi bölmeyenleri bırakır . Bu zaten De Bruijn dizisini veriyor, ancak Lyndon kelimelerini rakam dizisi olarak oluşturduğum için, sonunda harfleri de karşılık gelen harflerle değiştirmem gerekiyor.

Golf nedeniyle, alfabenin sonraki harflerinin sözlükbilim sırasının daha düşük olduğunu düşünüyorum.


1

JavaScript (ES6) 143

Lyndon kelimeleri kullanarak, Martin aswer gibi, sadece 3 kez ...

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 konsolunda test edin

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

Çıktı

CCCBCCACBBCBACABCAABBBABAAA 0000100110101111

1

Python 2, 114 bayt

Yaklaşımım nedeniyle nasıl daha fazla golf oynayacağımı bilmiyorum.

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]

Çevrimiçi deneyin

Ungolfed:

Bu kod adlı önemsiz bir değişikliktir benim çözüm daha yeni meydan.

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]

Gerekli olan tek neden [:1-n], dizilimin etrafını sarmasıdır.


1

Powershell, 164 96 bayt

-68 eşleşmeli -68 bayt O($n*2^n) yerine yerine özyinelemeli jeneratörO(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

Ungolfed ve test senaryosu:

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

Çıktı:

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

Ayrıca bakınız: Hepsine hükmedecek bir Yüzük. Hepsini içeren bir Dize

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.