A combinatorics module for Monkey
Monkey Forums/Monkey Programming/A combinatorics module for Monkey
| ||
| Have you ever wanted to arrange things in groups of varying sizes? Boy, have I got the module for you! https://github.com/SpaceAceMonkey/combinatorics I spent the last couple of days banging away at this. The github page has a readme file, and the code has lots of comments. There is also a file full of examples. A brief overview: Combinatorics.MassPermutationsCount(12) 1302061344 Combinatorics.Choose(16, 8) 12870 Combinatorics.Factorial(16) 20922789888000 Combinatorics.FactorialRadix(64, 4) [0, 0, 2, 2, 2] Combinatorics.MassPermutationsCount(8) 109600 Combinatorics.PermutationsCount(16, 4) 43680 Combinator([a, b, c, d, e, f, g, h], 6) [c, d, e, f, g, h], [b, d, e, f, g, h], [a, d, e, f, g, h], [b, c, e, f, g, h] [a, c, e, f, g, h], [a, b, e, f, g, h], [b, c, d, f, g, h], [a, c, d, f, g, h] [a, b, d, f, g, h], [a, b, c, f, g, h], [b, c, d, e, g, h], [a, c, d, e, g, h] [a, b, d, e, g, h], [a, b, c, e, g, h], [a, b, c, d, g, h], [b, c, d, e, f, h] [a, c, d, e, f, h], [a, b, d, e, f, h], [a, b, c, e, f, h], [a, b, c, d, f, h] [a, b, c, d, e, h], [b, c, d, e, f, g], [a, c, d, e, f, g], [a, b, d, e, f, g] [a, b, c, e, f, g], [a, b, c, d, f, g], [a, b, c, d, e, g], [a, b, c, d, e, f] Permuter([a, b, c, d]) [a, b, c, d], [b, a, c, d], [a, c, b, d], [c, a, b, d], [b, c, a, d], [c, b, a, d] [a, b, d, c], [b, a, d, c], [a, d, b, c], [d, a, b, c], [b, d, a, c], [d, b, a, c] [a, c, d, b], [c, a, d, b], [a, d, c, b], [d, a, c, b], [c, d, a, b], [d, c, a, b] [b, c, d, a], [c, b, d, a], [b, d, c, a], [d, b, c, a], [c, d, b, a], [d, c, b, a] CombinatorPermuter([a, b, c, d, e, f], 2) [e, f], [f, e], [d, f], [f, d], [c, f], [f, c] [b, f], [f, b], [a, f], [f, a], [d, e], [e, d] [c, e], [e, c], [b, e], [e, b], [a, e], [e, a] [c, d], [d, c], [b, d], [d, b], [a, d], [d, a] [b, c], [c, b], [a, c], [c, a], [a, b], [b, a] MassPermuter([a, b, c, d]) [d], [c], [b], [a], [c, d], [d, c], [b, d], [d, b], [a, d], [d, a], [b, c], [c, b], [a, c], [c, a], [a, b], [b, a], [b, c, d], [c, b, d], [b, d, c], [d, b, c], [c, d, b], [d, c, b], [a, c, d], [c, a, d], [a, d, c], [d, a, c], [c, d, a], [d, c, a], [a, b, d], [b, a, d], [a, d, b], [d, a, b], [b, d, a], [d, b, a], [a, b, c], [b, a, c], [a, c, b], [c, a, b], [b, c, a], [c, b, a], [a, b, c, d], [b, a, c, d], [a, c, b, d], [c, a, b, d], [b, c, a, d], [c, b, a, d], [a, b, d, c], [b, a, d, c], [a, d, b, c], [d, a, b, c], [b, d, a, c], [d, b, a, c], [a, c, d, b], [c, a, d, b], [a, d, c, b], [d, a, c, b], [c, d, a, b], [d, c, a, b], [b, c, d, a], [c, b, d, a], [b, d, c, a], [d, b, c, a], [c, d, b, a], [d, c, b, a]
Import spaceace.combinatorics.cCombinator
Import spaceace.combinatorics.cPermuter
Import spaceace.combinatorics.cCombinatorPermuter
Import spaceace.combinatorics.cMassPermuter
Function Main:Int()
Local aString:String = "abcdefgh"
Local numberToChoose:Int = 6
Local elements:String[]
Local g:ICombinatoricsGenerator<String>
elements = aString.Split("")
g = New Combinator<String>(elements, numberToChoose)
Print "Combinator([" + Implode(elements, ", ") + "], " + numberToChoose + ")"
ShowResultsBlock(g)
Print ""
aString = "abcd"
elements = aString.Split("")
g = New Permuter<String>(elements)
Print "Permuter([" + Implode(elements, ", ") + "])"
ShowResultsBlock(g, 40, 6)
Print ""
aString = "abcdef"
numberToChoose = 2
elements = aString.Split("")
g = New CombinatorPermuter<String>(elements, numberToChoose)
Print "CombinatorPermuter([" + Implode(elements, ", ") + "], " + numberToChoose + ")"
ShowResultsBlock(g, 40, 6)
Print ""
aString = "abcd"
elements = aString.Split("")
g = New MassPermuter<String>(elements)
Print "MassPermuter([" + Implode(elements, ", ") + "])"
ShowResultsBlock(g, 64, 6)
Return 0
End Function
Function Implode:String(arr:String[], seperator:String = "")
Local s:String
For Local i:Int = 0 To arr.Length - 1
s += arr[i]
If (i < arr.Length - 1)
s += seperator
EndIf
Next
Return s
End Function
Function ShowResultsBlock:Void(g:ICombinatoricsGenerator<String>, limit:Int = 40, columns:Int = 4)
Local toShow:Int = Min(g.Length(), limit)
Print "---- Showing " + toShow + " of " + g.Length() + " groupings ----"
Local seriesStack:Stack<String[] > = New Stack<String[] > (g.ToArray())
Local i:Int = 0
While (i < toShow)
Local j:Int = 0
Local stringStack:StringStack = New StringStack()
While (j < columns And seriesStack.Length() > 0 And i < toShow)
stringStack.Push("[" + Implode(seriesStack.Pop(), ", ") + "]")
j += 1
i += 1
Wend
Print Implode(stringStack.ToArray(), ", ")
Wend
End Function
I hope someone finds it useful. I would like to add more functions, such as power sets. I'll definitely do that if people find this library useful. Otherwise, feel free to make pull requests against the Gibhub repository if you want to add something. |