Don't feel frustrated Michael. All the good advice from everyone here will benefit many more people besides OP.
I myself learned a lot (especially, me too don't like the idea why channels has to be involved for such simple task initially, then saw that mind-opening comment from Paul Borman about print vs. use). Thanks again everyone! On Saturday, July 16, 2016 at 1:36:05 AM UTC-4, Michael Jones wrote: > > Whatever they wanted, we've put far more into answering it than than they > have in responding. I sent my response taking time from the Farnborough Air > Show, not wanting their concerns to go unaddressed. Disappointed to see no > following reply to all the good advice from everyone here. > On Jul 15, 2016 6:25 PM, "'Paul Borman' via golang-nuts" < > golan...@googlegroups.com <javascript:>> wrote: > >> It wasn't clear to me what the OP wanted. Did they just want to print >> them? Did they want to use them? For use, I think the channel is probably >> the most straightforward to use, but the OP didn't want any channels at >> all. The underlying array that slices refer to could also be made smaller, >> for example, set = "ab" and size = 3 can be satisfied with the underlying >> text of aaababbbaa. I didn't bother to try and figure out a general >> algorithm, however, I just did that one by hand. >> >> On Fri, Jul 15, 2016 at 10:07 AM, Bakul Shah <ba...@bitblocks.com >> <javascript:>> wrote: >> >>> Ah. Should've read your original play link more carefully! >>> You could've made it a bit more efficient by allocating one >>> large string (N^N+N) and one Printf! Of course, that'd fall >>> apart once you have more combinations than can fit in memory >>> but that is easily solved. >>> >>> Still interested in knowing if anyone has an more efficient >>> greycode sequence algorithm. >>> >>> On Fri, 15 Jul 2016 09:56:55 PDT Paul Borman <bor...@google.com >>> <javascript:>> wrote: >>> > >>> > BTW, the solution I provided does change one digit at a time, working >>> just >>> > like an odometer. The OP privately said that even the reporting >>> channel >>> > was undesired in my solution, so I sent the OP a link to one that >>> allocated >>> > a slice and then filled it in, rather than sending it down a channel. >>> The >>> > OP never responded after I sent a link to the second version ( >>> > https://play.golang.org/p/bL9g8CM4DC) , so I guess it addressed the >>> OP's >>> > issue, or the OP found a different solution. >>> > >>> > On Thu, Jul 14, 2016 at 11:10 PM, Bakul Shah <ba...@bitblocks.com >>> <javascript:>> wrote: >>> > >>> > > What the OP wants is equivalent to generating *all* n digit numbers >>> in >>> > > base n. For example, given >>> > > >>> > > aa >>> > > ab >>> > > ba >>> > > bb >>> > > >>> > > if you map a to 0 and b to 1 you get numbers 0..3 (base 2). In >>> general >>> > > you have n^n combinations.. >>> > > >>> > > If you consider only the cost of *copying* (or changing an existing >>> strin= >>> > g >>> > > to a different one), it is clear the least cost can be obtained by >>> changi= >>> > ng >>> > > 1 digit at a time to go to the next combination (using base N >>> greycoding = >>> > - >>> > > if there is such a thing). So for example, for abc, you=E2=80=99d do >>> some= >>> > thing like >>> > > >>> > > aaa >>> > > aab >>> > > aac >>> > > bac >>> > > bab >>> > > baa >>> > > caa >>> > > cab >>> > > cac >>> > > >>> > > and so on. Then the total cost is n^n-1 digit changes. Though I do >>> not >>> > > know of an efficient base N greycoding algorithm. >>> > > >>> > > ON the other hand a traditional counter (as below) won=E2=80=99t be >>> signi= >>> > ficantly >>> > > more expensive. >>> > > >>> > > var dig [n]int >>> > > outer: >>> > > for { >>> > > for j =3D n-1; j >=3D 0; j=E2=80=94 { >>> > > ++dig[j] >>> > > if dig[j] < n { /* output and */ continue outer } >>> > > dig[j] =3D 0 >>> > > } >>> > > if j =3D=3D -1 { break } >>> > > } >>> > > >>> > > On Jul 13, 2016, at 11:17 PM, Michael Jones <michae...@gmail.com >>> <javascript:>> >>> > > wrote: >>> > > >>> > > The first time this came up I wrote code to generate general alphabet >>> > > combinations as quickly as I could. The approach I used was a >>> generator >>> > > object that one calls to set the length and alphabet size, and a >>> Next() >>> > > function that is called repeatedly until it signals that all values >>> have >>> > > been generated. The values are handled in a slightly indirect way. >>> > > >>> > > There are three use modes: >>> > > (a) Simply advance the internal state by calling Next() until >>> done, >>> > > this lets you count the number of solutions without looking at the >>> detail= >>> > s, >>> > > as in some of the associated tests. >>> > > (b) Interpret the present state as an array of symbols from the >>> > > user-supplied alphabet string in a reused array. In this case, there >>> is n= >>> > o >>> > > allocation or garbage during generation. >>> > > (c) Interpret the present state as a string, such simply creates >>> a >>> > > string. This is (b) plus string creation and GC overhead. It is >>> about 2.6 >>> > > to 3.1 times slower. >>> > > >>> > > There are two modes of generation as well, ordered (=E2=80=9CAA, AB, >>> BB= >>> > =E2=80=9D) and >>> > > unordered (=E2=80=9CAA, AB, BA, BB=E2=80=9D). From the original post >>> here= >>> > , clearly >>> > > unordered is the desired mode. The speeds of this on my MacBook feel >>> fast= >>> > =E2=80=A6 >>> > > >>> > > BenchmarkUnordered1-8 200000000 >>> 8.21 >>> > > ns/op >>> > > BenchmarkUnordered2-8 50000000 >>> 32.3 >>> > > ns/op >>> > > BenchmarkUnordered3-8 10000000 194 >>> ns/o= >>> > p >>> > > BenchmarkUnordered4-8 1000000 >>> 1538 >>> > > ns/op >>> > > BenchmarkUnordered5-8 100000 >>> 18404 >>> > > ns/op >>> > > BenchmarkUnordered6-8 5000 255203 ns/op >>> > > BenchmarkUnordered7-8 300 4163767 ns/op >>> > > BenchmarkUnordered8-8 20 81721059 ns/op >>> > > BenchmarkUnordered9-8 1 1883039855 ns/op >>> > > >>> > > BenchmarkUnorderedRate1-8 500000000 3.68 >>> ns/op >>> > > BenchmarkUnorderedRate2-8 200000000 7.92 >>> ns/op >>> > > BenchmarkUnorderedRate3-8 100000000 13.4 >>> ns/op >>> > > BenchmarkUnorderedRate4-8 100000000 18.6 >>> ns/op >>> > > BenchmarkUnorderedRate5-8 100000000 24.1 >>> ns/op >>> > > BenchmarkUnorderedRate6-8 50000000 27.9 >>> ns/op >>> > > BenchmarkUnorderedRate7-8 50000000 32.2 >>> ns/op >>> > > BenchmarkUnorderedRate8-8 30000000 37.3 >>> ns/op >>> > > BenchmarkUnorderedRate9-8 30000000 40.7 >>> ns/op >>> > > >>> > > =E2=80=A6with speeds for s-symbol alphabets of lengths 1..s being >>> low ten= >>> > s of >>> > > nanoseconds per combination in array modes and ~3x that in string >>> mode. >>> > > This is no channel, no allocation or freeing, no GC needed, no >>> recursion. >>> > > Because it has tests and the code in separate files, it is not >>> really a >>> > > good go playground candidate. Sorry. >>> > > >>> > > >>> > > *From: *<golan...@googlegroups.com <javascript:>> on behalf of >>> catal...@gmail.com <javascript:> >>> > > >>> > > 2016=EB=85=84 7=EC=9B=94 13=EC=9D=BC =EC=88=98=EC=9A=94=EC=9D=BC >>> =EC=98= >>> > =A4=EC=A0=84 6=EC=8B=9C 36=EB=B6=84 15=EC=B4=88 UTC+9, The MrU >>> =EB=8B=98=EC= >>> > =9D=98 =EB=A7=90: >>> > > >>> > > Hi, >>> > > >>> > > I have this code https://play.golang.org/p/9o5TReZ7jT3 >>> > > <https://play.golang.org/p/9o5TReZ7jT> >>> > > >>> > > My idea was to generate all possible combinations pretty much this: >>> > > >>> > > aaa >>> > > bbb >>> > > ccc >>> > > abb >>> > > acc >>> > > baa >>> > > bbb >>> > > bcc >>> > > caa >>> > > cbb >>> > > ccc >>> > > aba >>> > > abb >>> > > abc >>> > > >>> > > you get the picture I think. >>> > > >>> > > I got this solution but the objective is to simplify the solution >>> without >>> > > using channels if possible : >>> > > >>> > > package main >>> > > >>> > > >>> > > >>> > > import "fmt" >>> > > >>> > > >>> > > >>> > > func GenerateCombinations(alphabet string, length int) <-chan string >>> { >>> > > >>> > > c :=3D make(chan string) >>> > > >>> > > >>> > > >>> > > go func(c chan string) { >>> > > >>> > > defer close(c) >>> > > >>> > > >>> > > >>> > > AddLetter(c, "", alphabet, length) >>> > > >>> > > }(c) >>> > > >>> > > >>> > > >>> > > return c >>> > > >>> > > } >>> > > >>> > > >>> > > >>> > > func AddLetter(c chan string, combo string, alphabet string, length >>> int) = >>> > { >>> > > >>> > > if length <=3D 0 { >>> > > >>> > > return >>> > > >>> > > } >>> > > >>> > > >>> > > >>> > > var newCombo string >>> > > >>> > > for _, ch :=3D range alphabet { >>> > > >>> > > newCombo =3D combo + string(ch) >>> > > >>> > > c <- newCombo >>> > > >>> > > AddLetter(c, newCombo, alphabet, length-1) >>> > > >>> > > } >>> > > >>> > > } >>> > > >>> > > >>> > > >>> > > func main() { >>> > > >>> > > >>> > > >>> > > list :=3D "abc" >>> > > >>> > > >>> > > >>> > > for combination :=3D range GenerateCombinations(list, 3) { >>> > > >>> > > if len(combination) =3D=3D 3 { >>> > > >>> > > fmt.Println(combination) >>> > > >>> > > } >>> > > >>> > > >>> > > >>> > > } >>> > > >>> > > >>> > > >>> > > fmt.Println("Done!") >>> > > >>> > > } >>> > > >>> > > -- >>> > > You received this message because you are subscribed to the Google >>> Groups >>> > > "golang-nuts" group. >>> > > To unsubscribe from this group and stop receiving emails from it, >>> send an >>> > > email to golang-nuts...@googlegroups.com <javascript:>. >>> > > For more options, visit https://groups.google.com/d/optout. >>> > > >>> > > >>> > > -- >>> > > You received this message because you are subscribed to the Google >>> Groups >>> > > "golang-nuts" group. >>> > > To unsubscribe from this group and stop receiving emails from it, >>> send an >>> > > email to golang-nuts...@googlegroups.com <javascript:>. >>> > > For more options, visit https://groups.google.com/d/optout. >>> > > >>> > > >>> > > -- >>> > > You received this message because you are subscribed to the Google >>> Groups >>> > > "golang-nuts" group. >>> > > To unsubscribe from this group and stop receiving emails from it, >>> send an >>> > > email to golang-nuts...@googlegroups.com <javascript:>. >>> > > For more options, visit https://groups.google.com/d/optout. >>> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.