Generate the shortest De Bruijn
Pyth, 31 bytes
This is the direct conversion of the algorithm used in my CJam answer. Tips for golfing welcome!
Mu?G}H+GG+G>Hefq<HT>G-lGTUH^GHk
This code defines a function g
which takes two arguments, the string of list of characters and the number.
Example usage:
Mu?G}H+GG+G>Hefq<HT>G-lGTUH^GHkg"ABC"3
Output:
AAABAACABBABCACBACCBBBCBCCC
Code expansion:
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 # "")
Try it here
CJam, 52 49 48 bytes
This is surprisingly long. This can be golfed a lot, taking in tips from the Pyth translation.
q~a*{m*:s}*{:H\:G_+\#)GGHH,,{_H<G,@-G>=},W=>+?}*
The input goes like
3 "ABC"
i.e. - String of list of characters and the length.
and output is the De Bruijn string
AAABAACABBABCACBACCBBBCBCCC
Try it online here
CJam, 52 49 bytes
Here is a different approach in CJam:
l~:N;:L,(:Ma{_N*N<0{;)_!}g(+_0a=!}g]{,N\%!},:~Lf=
Takes input like this:
"ABC" 3
and produces a Lyndon work like
CCCBCCACBBCBACABCAABBBABAAA
Try it here.
This makes use of the relation with Lyndon words. It generates all Lyndon words of length n in lexicographic order (as outlined in that Wikipedia article), then drops those whose length doesn't divide n. This already yields the De Bruijn sequence, but since I'm generating the Lyndon words as strings of digits, I also need to replace those with the corresponding letters at the end.
For golfing reasons, I consider the later letters in the alphabet to have lower lexicographic order.