|
http:run.cgi
We can setup any sized problem. As is the tradition, columns are variables. Here we setup three variables with five elements in the largest.
We maintain a list of pairs, ordered with the most desired first. We measure desire by computing a rank, which will change as we fill pairs into cases.
| eg.AllPairs$Pairs |
| left | right | used | rank() |
| a | p | | |
| a | q | | |
| a | r | | |
| a | x | | |
| a | y | | |
| b | p | | |
| b | q | | |
| b | r | | |
| b | x | | |
| b | y | | |
| c | p | | |
| c | q | | |
| c | r | | |
| c | x | | |
| c | y | | |
| d | p | | |
| d | q | | |
| d | r | | |
| d | x | | |
| d | y | | |
| p | x | | |
| p | y | | |
| q | x | | |
| q | y | | |
| r | x | | |
| r | y | | |
Here we step through the filling process. This is slow going because many of the pairs we retrieve from the list (using next()) don't fit the case we're assembling.
| eg.AllPairs$Step |
| next() | rank() | isFit() | hold() | slug() | isFull() |
| | | true | | a,p,null | false |
| | | false | | a,p,null | false |
| | | false | | a,p,null | false |
| | | true | | a,p,x | true |
| | | true | | a,q,null | false |
| | | false | | a,q,null | false |
| | | true | | a,q,y | true |
| | | true | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | false | | a,r,null | false |
| | | true | | a,r,x | true |
| | | true | | b,p,null | false |
| | | false | | b,p,null | false |
| | | false | | b,p,null | false |
| | | true | | b,p,x | true |
Now we step a little faster by substituting nextFit() for next().
| eg.AllPairs$Step |
| nextFit() | rank() | isFit() | hold() | slug() | isFull() |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
| | | true | 0 | | false |
| | | true | 0 | | true |
Let's look at those pairs again and see how the used count and rank() have changed.
| eg.AllPairs$Pairs |
| left | right | used | rank() |
| a | p | | |
| a | q | | |
| a | r | | |
| a | x | | |
| a | y | | |
| b | p | | |
| b | q | | |
| b | r | | |
| b | x | | |
| b | y | | |
| c | p | | |
| c | q | | |
| c | r | | |
| c | x | | |
| c | y | | |
| d | p | | |
| d | q | | |
| d | r | | |
| d | x | | |
| d | y | | |
| p | x | | |
| p | y | | |
| q | x | | |
| q | y | | |
| r | x | | |
| r | y | | |
Want to go faster still? Here is a fixture that runs out the rest of the cases and shows us everything.
| eg.AllPairs$Cases |
| number | items |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
Let's try the same setup but not single step it. This will be a check to make sure our stepper isn't messing up the sequence.
| eg.AllPairs$Cases |
| number | items |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
Ok. This is fun. Let's try some fun data.
| eg.AllPairs$Setup |
| Mrs Peacock | Library | Rope |
| Colonel Mustard | Conservatory | Knife |
| Miss Scarlet | Kitchen | Gun |
| Professor Plum | | |
| eg.AllPairs$Cases |
| number | items |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
| 17 | |
| 18 | |
| 19 | |
| 20 | |
| 21 | |
Want to go really really fast? Here we generate setups based on only the desired number of items in each variable. Then cases() counts the generated cases. It also leaves a pairs count and elapsed msec by side effect.
| eg.AllPairs$Stats |
| items | cases() | pairs | msec |
| 1,1 | 1 | | |
| 1,2 | 2 | | |
| 2,1 | 2 | | |
| 2,2 | 4 | | |
| 2,2,2 | | | |
| 2,2,2,2 | | | |
| 2,2,2,2,2 | | | |
| 1,2,1,2,1,2,1,2,1,2,1 | | | |
| 10,10 | 100 | | |
| 10,10,2,2,2 | | | |
| 10,10,4,2,2 | | | |
| 10,10,4,4,2 | | | |
| 10,10,4,4,4 | | | |
| 4,4,4,10,10 | | | |
See the source.
|