Generieren Sie die kürzeste De Bruijn

22

Eine De Bruijn-Folge ist interessant: Es ist die kürzeste, zyklische Folge, die alle möglichen Folgen eines gegebenen Alphabets einer gegebenen Länge enthält. Wenn wir zum Beispiel das Alphabet A, B, C und eine Länge von 3 betrachten, ist eine mögliche Ausgabe:

AAABBBCCCABCACCBBAACBCBABAC

Sie werden feststellen , dass jede mögliche 3-Zeichen - Sequenz mit den Buchstaben A, Bund Csind da drin.

Ihre Herausforderung besteht darin, eine De Bruijn-Sequenz mit möglichst wenigen Zeichen zu generieren. Ihre Funktion sollte zwei Parameter haben, eine Ganzzahl, die die Länge der Sequenzen darstellt, und eine Liste mit dem Alphabet. Ihre Ausgabe sollte die Reihenfolge in Listenform sein.

Sie können davon ausgehen, dass jedes Element im Alphabet unterschiedlich ist.

Einen Beispielgenerator finden Sie hier

Es gelten Standardlücken

Nathan Merrill
quelle
Kann die Ganzzahl, die die Länge der Sequenzen darstellt, größer sein als die Anzahl der eindeutigen Buchstaben?
Kukac67
Ja. Eine binäre Sequenz der Länge 4 wäre 0000111101100101
Nathan Merrill
"Ihre Herausforderung ist es, eine De Bruijn-Sequenz mit so wenig Zeichen wie möglich zu generieren."
FryAmTheEggman
2
Beide. Um sich zu qualifizieren, muss Ihr Programm die kürzestmögliche Sequenz ausgeben, aber um zu gewinnen, muss Ihr Programm die kürzeste sein.
Nathan Merrill
2
@xem: Normalerweise enthalten die De Bruijn-Sequenzen einen Umlauf, in dem die fehlenden Sequenzen angezeigt werden.
Keith Randall

Antworten:

6

Pyth, 31 Bytes

Dies ist die direkte Konvertierung des in meiner CJam-Antwort verwendeten Algorithmus . Golftipps willkommen!

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

Dieser Code definiert eine Funktion, gdie zwei Argumente akzeptiert, die Zeichenfolge und die Zahl.

Anwendungsbeispiel:

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

Ausgabe:

AAABAACABBABCACBACCBBBCBCCC

Code-Erweiterung:

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

Probieren Sie es hier aus

Optimierer
quelle
4

CJam, 52 49 48 Bytes

Das ist überraschend lang. Hier kann man viel Golf spielen und dabei Tipps aus der Pyth-Übersetzung berücksichtigen.

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

Die Eingabe geht so

3 "ABC"

dh - Zeichenfolge der Liste der Zeichen und der Länge.

und die Ausgabe ist die De Bruijn-Zeichenfolge

AAABAACABBABCACBACCBBBCBCCC

Probieren Sie es hier online aus

Optimierer
quelle
1
Gosh CJam sollte verboten werden, es ist nicht nur für eine Golfaufgabe gemacht, sondern es scheint für jede mögliche
Golfaufgabe
2
@flawr Sie sollten für eine Pyth Antwort warten dann: P
Optimizer
3

CJam, 52 49 Bytes

Hier ist ein anderer Ansatz in CJam:

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

Nimmt Eingaben wie folgt vor:

"ABC" 3

und produziert eine Lyndon Arbeit wie

CCCBCCACBBCBACABCAABBBABAAA

Probieren Sie es hier aus.

Dies nutzt die Beziehung zu Lyndon-Wörtern . Es generiert alle Lyndon-Wörter der Länge n in lexikografischer Reihenfolge (wie in diesem Wikipedia-Artikel beschrieben) und löscht dann diejenigen, deren Länge n nicht teilt . Dies ergibt bereits die De Bruijn-Sequenz, aber da ich die Lyndon-Wörter als Ziffernfolgen generiere, muss ich diese auch am Ende durch die entsprechenden Buchstaben ersetzen.

Aus Golfgründen betrachte ich die späteren Buchstaben des Alphabets als weniger lexikografisch.

Martin Ender
quelle
1

JavaScript (ES6) 143

Mit Lyndon-Wörtern, wie Martin's Aswer, nur dreimal lang ...

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
}

Test In FireFox / Firebug - Konsole

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

Ausgabe

CCCBCCACBBCBACABCAABBBABAAA 0000100110101111
edc65
quelle
1

Python 2, 114 Bytes

Ich bin mir aufgrund meiner Herangehensweise nicht sicher, wie ich mehr Golf spielen soll.

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]

Probieren Sie es online aus

Ungolfed:

Dieser Code ist eine triviale Modifikation von meiner Lösung zu einer neueren Herausforderung.

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]

Der einzige Grund, der [:1-n]benötigt wird, ist, dass die Sequenz den Wrap-Around enthält.

mbomb007
quelle
1

Powershell, 164 96 Bytes

-68 Bytes mit -match O($n*2^n)statt rekursivem GeneratorO(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 & Testskript:

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

Ausgabe:

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

Siehe auch: Ein Ring, um alle zu regieren. Ein String für alle

mazzy
quelle