knitr::opts_chunk$set(echo = TRUE)
pacman::p_load(tidyverse, gtools, glue)

Can’t Stop

The game “Can’t Stop” involves rolling dice to progress along different “rails”. A player rolls 4 six-sided dice, breaks those 4 dice into two pairs, then sums the pairs, and progresses one spot along the rail(s) corresponding to the chosen sum(s). During each turn, a player can progress along up to 3 rails. A turn starts when a player first rolls the dice. After choosing pairs of dice and corresponding rail(s) to progress along, the player can choose to roll again or stop and save their progress. Their turn ends when they choose to stop or when none of the dice sums correspond to possible moves.

In the example above, a player has decided to increase the 6, 7, and 8 rails sp far this turn. Every time this player rolls dice, they must choose a pair that sums to 6, 7, or 8, or else fail and give up all progress they’ve made. Dice that do not sum to 6, 7, or 8 cannot be used this turn.

One interesting question is: which rails are the mathematically best to choose if you want to go as far as possible before failing? In other words, which rails will achieve more progress (% to top) per roll than other rails? Or, if you want to roll until you make it to the top, which rails have the best chance of you making it before failing?

If you’re not interested in the math and programming that went into solving this problem, you can skip to the bottom, and look at the solution.

Rolling Dice

There are 6^4 = 1296 ways of rolling 4 dice. We can create a dataframe (table) of all the permutations using the code below.

die_rolls_df <- permutations(n = 6, r = 4, v = 1:6, repeats.allowed = TRUE) %>% 
   as.data.frame() %>% 
   as_tibble()

# rename the columns of the data frame 
colnames(die_rolls_df) <- sapply(1:4, function(x){glue("Die{x}")})

Viewing the top 8 lines the file, we see each die is represented by a row:

die_rolls_df %>% head(8)
## # A tibble: 8 x 4
##    Die1  Die2  Die3  Die4
##   <int> <int> <int> <int>
## 1     1     1     1     1
## 2     1     1     1     2
## 3     1     1     1     3
## 4     1     1     1     4
## 5     1     1     1     5
## 6     1     1     1     6
## 7     1     1     2     1
## 8     1     1     2     2

Mapping Rolled Dice to Possible Rails

After rolling the dice, they must be split into two pairs of two, and then summed. There are 3 ways to make 2 pairs of dice from four dice. Die #1 can be paired with any of the dice #2, #3, or #4, and the remaining dice form another pair.

Using the die-rolling data we can split up the 4 dice, and find the sums of those pairs as discussed above.

If you are new to R, note that c(x, y, z) is a vector whose elements are x, y, z. x[3] is the 3rd element of the x vector. The operator %>% passes the output of the function on the left, to the input of the function on the right (sometimes known as the “pipe operator”).

# the number 1 means that we would like to apply a function to 
# the rows of the data frame. if instead, we had a 2, we would
# apply the function to the columns
pair1 <- apply(die_rolls_df, 1, function(x){
   c(x[1] + x[2], x[3] + x[4])}
   ) %>% 
   t() %>% # transpose 2 long rows into 2 long columns
   as.data.frame() %>% 
   as_tibble()

pair2 <- apply(die_rolls_df, 1, function(x){
   c(x[1] + x[3], x[2] + x[4])}
   ) %>% 
   t() %>% 
   as.data.frame() %>% 
   as_tibble()

pair3 <- apply(die_rolls_df, 1, function(x){
   c(x[1] + x[4], x[2] + x[3])}
   ) %>% 
   t() %>% 
   as.data.frame() %>% 
   as_tibble()

# combine the columns into one big dataframe
rolled_sums <- bind_cols(pair1, pair2, pair3) 

# rename dataframe
colnames(rolled_sums) <- sapply(1:6, function(x){glue("Sum{x}")})

Here’s what the top 8 lines look like. We see the results of (4 choose 2) = 6 different pairs.

rolled_sums %>% head(8)
## # A tibble: 8 x 6
##    Sum1  Sum2  Sum3  Sum4  Sum5  Sum6
##   <int> <int> <int> <int> <int> <int>
## 1     2     2     2     2     2     2
## 2     2     3     2     3     3     2
## 3     2     4     2     4     4     2
## 4     2     5     2     5     5     2
## 5     2     6     2     6     6     2
## 6     2     7     2     7     7     2
## 7     2     3     3     2     2     3
## 8     2     4     3     3     3     3

Next we’ll list all the possible choices of rails to go up. Only 3 rails can be chosen. The rails names are the sum of the dice rolls, e.g. 2-12

rail_choices <- combinations(n=11, r=3, v=2:12, repeats.allowed = FALSE)

Roll Probabilities

For each rail choice, we’ll do two things. First, we’ll mark every rolled sum that “hits” one of the rails in our rail choice (e.g. doesn’t cause a roll to fail). Next, we’ll use that information to find out how many of these 1296 possible different rolls have at least one element that is a member of the current rail choice.

success_rolls <- vector()

for (i in 1:nrow(rail_choices)) {
   
   current_rails <- rail_choices[i, ]
   
   hits <- apply(rolled_sums, 1, function(x) {
      (intersect(current_rails, x) > 1) %>% sum()
   }) 
   
   success_rolls[i] <- hits[hits != 0] %>% length()
   
}

We’ll put the number of rolls that result in a success next to all the possible choices of rails in the data frame below

rail_results <- cbind(rail_choices, success_rolls) %>%
   as.data.frame() %>% as_tibble() %>% 
   mutate(roll_frac = success_rolls/1296)

colnames(rail_results)[1:3] <- sapply(1:3, function(x){glue("Rail{x}")})

Below are a few results of different rail choices a player could make. The first line of the table indicates that if a player were to choose to go up on the rails 2, 3, and 4, that there are 676 ways to roll the dice that will result in you rolling at least one of those numbers. Since there are 1296 total ways of rolling 4 dice, you have a 676/1296 = 52.16% chance of not failing your next roll, if you choose to continue rolling.

head(rail_results, 8)
## # A tibble: 8 x 5
##   Rail1 Rail2 Rail3 success_rolls roll_frac
##   <int> <int> <int>         <int>     <dbl>
## 1     2     3     4           676     0.522
## 2     2     3     5           757     0.584
## 3     2     3     6           886     0.684
## 4     2     3     7           975     0.752
## 5     2     3     8           980     0.756
## 6     2     3     9           923     0.712
## 7     2     3    10           822     0.634
## 8     2     3    11           681     0.525

High Frequency Rolls

The rolls with with highest probability of success are seen below.

rail_results %>% filter(roll_frac > 0.9) %>% arrange(desc(roll_frac))
## # A tibble: 7 x 5
##   Rail1 Rail2 Rail3 success_rolls roll_frac
##   <int> <int> <int>         <int>     <dbl>
## 1     6     7     8          1192     0.920
## 2     5     7     8          1185     0.914
## 3     6     7     9          1185     0.914
## 4     4     6     8          1181     0.911
## 5     6     8    10          1181     0.911
## 6     4     7     8          1170     0.903
## 7     6     7    10          1170     0.903

Low Frequency Rolls

Whereas the rolls with the lowest probability of success can be found here.

rail_results %>% filter(roll_frac < 0.55) %>% arrange(roll_frac)
## # A tibble: 6 x 5
##   Rail1 Rail2 Rail3 success_rolls roll_frac
##   <int> <int> <int>         <int>     <dbl>
## 1     2     3    12           568     0.438
## 2     2    11    12           568     0.438
## 3     2     3     4           676     0.522
## 4    10    11    12           676     0.522
## 5     2     3    11           681     0.525
## 6     3    11    12           681     0.525

You might think that, since you know which combinations have the highest probability of being rolled, you are ready to start playing, but that’s not the end of the story!

Effective Tops

The game of can’t stop is won by getting to the top on 3 different rails, but the rails vary in length from 3 (for the improbable roll results of 3 and 12) to 13 (for the 7 rail). The rail length increases by two for every result closer to 7.

We’ll encode this information in a function, but for our purposes we’d like to actually have the multiplicative inverse of this function.

inv_steps_on_rail <- function(x) {
   y <- -2 * abs(x - 7) + 13
   1/y
}

So, an interesting metric accounting for the length of the rails is “effective number of tops” (which I will henceforth refer to as ENOT).

The idea for this metric is that each rail gets a different weighted value for every step. The weight per step on the 2 rail is 1/3 of the way to the top, whereas the weight of each step on the 8 rail is 1/11 the way to the top. We want to find the ENOT for each roll, given a chosen set of rails.

To get this result, we will use a similar method to the one above, except we will use an intermediary function to determine the ENOT instead of simply figuring out how many times a number is listed.

This time we’ll use a helper function to set all the overlapping numbers between the rolls and the rails. The purpose of this helper function is to ensure we count the steps correctly. If a player is on rails 5, 6, and 8, and makes a roll of 3, 3, 4, 4, they should progress on the 6 rail and the 8 rail. This function checks which sums match rails that a player is on.

get_overlap <- function(set1, set2) {
   c(set1[set1 == set2[1]], 
     set1[set1 == set2[2]], 
     set1[set1 == set2[3]])
}

Then we’ll use the formula above and the overlap info to get the ENOT for any given pair of die sums.

find_ENOT <- function(overlap) {
   
   if (length(overlap) == 0) {return(0)}
   
   inv_steps_on_rail(overlap) %>% sum()
}

And the ENOT for any given roll is the max of the sum of the ENOT for any pair of die sums. Here we explicitly see a grouping that was done earlier, where col1 is paired with col2, col3 with col4, and col5 with col6.

total_ENOT <- function(sums, rails){
   
   max(
      get_overlap(c(sums[1], sums[2]), rails) %>% find_ENOT(),
      get_overlap(c(sums[3], sums[4]), rails) %>% find_ENOT(),
      get_overlap(c(sums[5], sums[6]), rails) %>% find_ENOT()
   )
   
}

We’ll find at the ENOT for every combination of rolls, after having fixed a choice of rails. Then we’ll find the average ENOT, which is stored in the enot vector.

enot <- vector()

for (i in 1:nrow(rail_choices)) {
   
   current_rails <- rail_choices[i, ]
   
   enot[i] <- apply(rolled_sums, 1, function(x){total_ENOT(x, current_rails)}) %>% mean()
}

With the effective number of tops for each roll, we can find the distance a player will go on any given roll.

rail_enot <- cbind(rail_results, enot) %>% 
   as_tibble() %>% 
   mutate(rolls_to_top = 1/enot) %>% 
   select(-success_rolls)

The rail enot table looks as below, showing the rail choices, the probability of rolling at least one of those rails, and the ENOT for any given roll. Since the ENOTs are all so similar, I’ve also included 1/ENOT, which tells us the average number of rolls it will take to get one effective top, across the three chosen rails.

This does not indicate the number of rolls it will take to move a single rail to the top, but rather, the number of rolls it will take to get enough steps that, if you were able put your progress together from all 3 rails, would result in a top.

rail_enot %>% head(8)
## # A tibble: 8 x 6
##   Rail1 Rail2 Rail3 roll_frac  enot rolls_to_top
##   <int> <int> <int>     <dbl> <dbl>        <dbl>
## 1     2     3     4     0.522 0.114         8.79
## 2     2     3     5     0.584 0.115         8.66
## 3     2     3     6     0.684 0.121         8.25
## 4     2     3     7     0.752 0.123         8.10
## 5     2     3     8     0.756 0.132         7.56
## 6     2     3     9     0.712 0.136         7.37
## 7     2     3    10     0.634 0.136         7.37
## 8     2     3    11     0.525 0.130         7.67

High ENOT rolls

The best ENOT are given in the following table:

rail_enot %>% arrange(desc(enot)) %>% head(12)
## # A tibble: 12 x 6
##    Rail1 Rail2 Rail3 roll_frac  enot rolls_to_top
##    <int> <int> <int>     <dbl> <dbl>        <dbl>
##  1     2     4    10     0.738 0.143         6.97
##  2     4    10    12     0.738 0.143         6.97
##  3     2     6    12     0.738 0.140         7.17
##  4     2     8    12     0.738 0.140         7.17
##  5     2     5    11     0.712 0.139         7.17
##  6     3     9    12     0.712 0.139         7.17
##  7     2     8    10     0.816 0.138         7.23
##  8     4     6    12     0.816 0.138         7.23
##  9     2     6    10     0.811 0.138         7.24
## 10     4     8    12     0.811 0.138         7.24
## 11     2     4    11     0.634 0.138         7.24
## 12     3    10    12     0.634 0.138         7.24

Low ENOT rolls

The worst ENOT, on the other hand, can be found here:

rail_enot %>% arrange(enot) %>% head(12)
## # A tibble: 12 x 6
##    Rail1 Rail2 Rail3 roll_frac  enot rolls_to_top
##    <int> <int> <int>     <dbl> <dbl>        <dbl>
##  1     3     4     5     0.669 0.112         8.95
##  2     9    10    11     0.669 0.112         8.95
##  3     3     5     7     0.787 0.112         8.94
##  4     7     9    11     0.787 0.112         8.94
##  5     5     6     7     0.887 0.113         8.82
##  6     7     8     9     0.887 0.113         8.82
##  7     4     5     6     0.796 0.114         8.81
##  8     8     9    10     0.796 0.114         8.81
##  9     3     5     6     0.771 0.114         8.79
## 10     8     9    11     0.771 0.114         8.79
## 11     2     3     4     0.522 0.114         8.79
## 12    10    11    12     0.522 0.114         8.79

But this is also not the end of the story!

Average ENOT Before Failure

Finally, we need to combine the probability of rolling a number, with the effective number of tops.

The average number of rolls before failure is given by 1 / (1 - p_success). If we multiply this by the ENOT we get the average number of tops before you fail.

rail_tops <- rail_enot %>% 
   mutate(
      p_success = roll_frac, 
      rolls_before_failure = 1 / (1 - p_success), 
      enot_before_failure = enot * rolls_before_failure
   ) %>% 
   select(Rail1:Rail3, p_success, rolls_before_failure, enot, enot_before_failure)

Best Rails to Choose on an Empty Board

Here are the best rails to choose

rail_tops %>% arrange(desc(enot_before_failure)) %>% head(10)
## # A tibble: 10 x 7
##    Rail1 Rail2 Rail3 p_success rolls_before_failure  enot enot_before_failure
##    <int> <int> <int>     <dbl>                <dbl> <dbl>               <dbl>
##  1     6     7     8     0.920                12.5  0.115                1.44
##  2     4     6     8     0.911                11.3  0.126                1.43
##  3     6     8    10     0.911                11.3  0.126                1.43
##  4     5     7     8     0.914                11.7  0.119                1.39
##  5     6     7     9     0.914                11.7  0.119                1.39
##  6     4     7     8     0.903                10.3  0.123                1.27
##  7     6     7    10     0.903                10.3  0.123                1.27
##  8     2     7     8     0.890                 9.13 0.130                1.19
##  9     6     7    12     0.890                 9.13 0.130                1.19
## 10     4     6    10     0.883                 8.58 0.138                1.18

Here we see that 5 rails choices can give a player around 1.4 ENOTs before failing, but after that there’s a big drop in the quality of rail choices.

Worst Rails to Choose on an Empty Board

If you’re wondering what rolls you should stay with, and not risk anything, here are the worst of the worst:

rail_tops %>% arrange(enot_before_failure) %>% head(10)
## # A tibble: 10 x 7
##    Rail1 Rail2 Rail3 p_success rolls_before_failure  enot enot_before_failure
##    <int> <int> <int>     <dbl>                <dbl> <dbl>               <dbl>
##  1     2     3    12     0.438                 1.78 0.127               0.226
##  2     2    11    12     0.438                 1.78 0.127               0.226
##  3     2     3     4     0.522                 2.09 0.114               0.238
##  4    10    11    12     0.522                 2.09 0.114               0.238
##  5     2     3    11     0.525                 2.11 0.130               0.275
##  6     3    11    12     0.525                 2.11 0.130               0.275
##  7     2     3     5     0.584                 2.40 0.115               0.278
##  8     9    11    12     0.584                 2.40 0.115               0.278
##  9     2     4    12     0.552                 2.23 0.135               0.301
## 10     2    10    12     0.552                 2.23 0.135               0.301

Plotting the Results

I’ll include a plot here of Rail Quality (in units of ENOT before failure) vs Rail Choice.

rail_tops %>% 
   unite(RailChoice, Rail1:Rail3, sep = ", ") %>% 
   ggplot(aes(x = reorder(RailChoice, enot_before_failure),
              y = enot_before_failure, 
              fill = enot_before_failure)) +
   geom_col() +
   xlab("Rail Choice") +
   ylab("Rail Quality (units of ENOTs before failure)") +
   ggtitle("Rail Choice vs Rail Quality") +
   theme_minimal() +
   coord_flip() +
   theme(legend.position = "none",
         axis.title = element_text(size = 22),
         plot.title = element_text(hjust = 0.5, size = 30))

The measure of Rail Quality is a bit hard to see, but the exact units don’t really matter. The purpose is to be able to see the dips in quality as we choose rails lower and lower down the list. A full list of the Rail Choices and their ENOT before failure can be found in the appendix to this piece.

Expected Value

The next notion I think is worth mentioning is Expected Value (or EV). I’ll try to make the case for introducing EV by talking about a common situation in Can’t Stop.

Let’s say that we’ve picked our rails, and have made minimal progress. One question we could ask would be, “Is this progress good (should we stop?), or is this progress so minuscule that we should take some risk? (should we keep going?)” If we were to know that the next roll would undoubtedly end in failure, then we should keep our progress no matter what. Likewise, if we know the next roll would succeed, we would be able to choose to keep going, no matter how much we’ve already gained. But, it turns out, there’s a mathematically precise way of balancing the expected gains (taking more steps) with expected losses (failing a roll and losing everything).

The Expected Value is the tool that can help us. Broadly stated, to calculate EV, you need to know all of the possible outcomes, and the probability of each outcome. In our case, there are two outcomes: you succeed at the roll, and gain some progress on some number of rails (some ENOT), or you fail, and you lose all progress you’ve made. Note that the “progress you’ve made” is a dynamic variable, it changes after every roll. We can write down our formula:

EV of Next Roll = + (ENOT gained from a single roll) * p_success - (ENOT of Current Progress) * p_failure

Early on in our turns early turns, ENOT of Current Progress is usually small, and so the EV of the roll is positive, and it is worthwhile to continue rolling. Later on in our turns, however, ENOT of current progress could be a pretty big number, so the EV of our next roll could be negative. The expected value of not messing up would be swamped by how bad it would be to mess up.

Zero EV

The point where it is mathematically truly neutral whether one rolls or not is when the EV of the next roll is zero. Before EV is zero, the EV will always be positive, and thus it will always be worthwhile to keep rolling. After the EV has turned negative, each roll ends up risking much more than you end up gaining, and consequently, it will always be worth staying. Thus, the point of interest for a given set of rails is the point of progress at which the EV the next roll is zero.

Because we have already calculated p_success and ENOT gained from a single roll, and we know that p_failure = 1 - p_success, we can calculate the progress point at which the EV of the next roll will be zero (zero_ev_pp), for any given choice of rails.

Calculating it out, we have

0 = ENOT * p_success - zero_ev_pp * (1 - p_success), or zero_ev_pp = ENOT * p_success / (1 - p_success)

# x[4] represents column4, p_success
# x[6] represents column6, ENOT

zero_ev_pp <- apply(rail_tops, 1, function(x){
   p_success <- x[4]
   ENOT <- x[6]
   
   ENOT * p_success / (1 - p_success)
})

We’ll combine this data with our other rail choice data all into one table.

optimal_rail_stopping <- cbind(rail_tops, zero_ev_pp)

A reminder, here that the units of the zero_ev_pp category is ENOTs.

Plotting the Results

I’ll make a another bar plot, this time of the Rail Choice vs Optimal Stopping Point and ENOT Before Failure.

optimal_rail_stopping %>% 
   unite(RailChoice, Rail1:Rail3, sep = ", ") %>% 
   ggplot(aes(x = reorder(RailChoice, zero_ev_pp))) +
   geom_point(aes(y = zero_ev_pp), color = "blue") +
   geom_point(aes(y = enot_before_failure), color = "red") +
   xlab("Rail Choice") +
   ylab("Average ENOT before: Zero EV (blue) and Roll Failure (red)") +
   ggtitle("Rail Choice vs Zero EV Progress Point and Rail Quality") +
   theme_minimal() +
   coord_flip() +
   theme(axis.title = element_text(size = 22),
         plot.title = element_text(hjust = 0.5, size = 30),
         legend.position = "bottom")

The Blue Dots represent the point where the EV is Zero for each rail choice. The Red Dots represent the expected progress before failure.

It’s interesting to note that the blue dots are left of the red dots by a seemingly consistent amount.

difft <- optimal_rail_stopping %>% 
   transform(difft = enot_before_failure - zero_ev_pp) %>% 
   pull(difft) 

paste("Mean:", difft %>% mean(), "±", difft %>% sd())
## [1] "Mean: 0.127977409795592 ± 0.00765556937100281"

Indeed, calculation shows that the difference ENOT Before Failure and Optimal Stopping Point is 0.1280 ± 0.0077. This indicates that it’s best to not roll up until the moment when you’re likely to fail, and instead store some of your progress when you’re a bit more certain.

I’ll make a further note that this is all only true on your first move(s) of the game, and it does not factor in where an opponent is located on the board, or if you’ve made it to the top of a rail this turn, or total numbers of rails topped by players. This is only meant to be a guide on what is considered “generically good”.

End

This has been an overview of a naive approach to maximizing roll choices during a game of Can’t Stop. In it, we’ve explored the best rail choices for making generic progress, and naive concepts of when to keep rolling vs when to stop (See appendix for details).

It would be welcome to have a follow-up that examined other aspects of the game, such as the value of topping a rail, and the concomitant risk / reward structure to aid a player in deciding whether or not to compete on a rail.

Those aspects are beyond the scope of this work.

Appendix

I’ll leave the final table in it’s entirety here. A reminder that zero_ev_pp, the progress point after which one’s expected progress drops, is probably the best measure of the quality of a choice of a set of 3 rails.

optimal_rail_stopping %>% 
   arrange(desc(enot_before_failure)) %>% 
   knitr::kable(format = 'markdown', align = 'c')
Rail1 Rail2 Rail3 p_success rolls_before_failure enot enot_before_failure zero_ev_pp
6 7 8 0.9197531 12.461538 0.1154062 1.4381388 1.3227326
4 6 8 0.9112654 11.269565 0.1264831 1.4254094 1.2989263
6 8 10 0.9112654 11.269565 0.1264831 1.4254094 1.2989263
5 7 8 0.9143519 11.675676 0.1193607 1.3936174 1.2742566
6 7 9 0.9143519 11.675676 0.1193607 1.3936174 1.2742566
4 7 8 0.9027778 10.285714 0.1230729 1.2658928 1.1428199
6 7 10 0.9027778 10.285714 0.1230729 1.2658928 1.1428199
2 7 8 0.8904321 9.126761 0.1299138 1.1856922 1.0557784
6 7 12 0.8904321 9.126761 0.1299138 1.1856922 1.0557784
4 6 10 0.8834877 8.582781 0.1378267 1.1829363 1.0451096
4 8 10 0.8834877 8.582781 0.1378267 1.1829363 1.0451096
4 7 9 0.8927469 9.323741 0.1267335 1.1816305 1.0548970
5 7 10 0.8927469 9.323741 0.1267335 1.1816305 1.0548970
3 7 8 0.8927469 9.323741 0.1253065 1.1683252 1.0430187
6 7 11 0.8927469 9.323741 0.1253065 1.1683252 1.0430187
5 6 8 0.8950617 9.529412 0.1195910 1.1396316 1.0200406
6 8 9 0.8950617 9.529412 0.1195910 1.1396316 1.0200406
2 6 8 0.8834877 8.582781 0.1320614 1.1334537 1.0013924
6 8 12 0.8834877 8.582781 0.1320614 1.1334537 1.0013924
4 7 10 0.8765432 8.100000 0.1343101 1.0879121 0.9536020
4 6 7 0.8858025 8.756757 0.1198770 1.0497340 0.9298570
7 8 10 0.8858025 8.756757 0.1198770 1.0497340 0.9298570
5 6 7 0.8865741 8.816327 0.1133390 0.9992336 0.8858946
7 8 9 0.8865741 8.816327 0.1133390 0.9992336 0.8858946
4 6 9 0.8641975 7.363636 0.1270932 0.9358684 0.8087752
5 8 10 0.8641975 7.363636 0.1270932 0.9358684 0.8087752
4 8 9 0.8626543 7.280899 0.1275542 0.9287092 0.8011550
5 6 10 0.8626543 7.280899 0.1275542 0.9287092 0.8011550
2 6 7 0.8641975 7.363636 0.1257051 0.9256463 0.7999413
7 8 12 0.8641975 7.363636 0.1257051 0.9256463 0.7999413
5 6 9 0.8665123 7.491329 0.1203080 0.9012670 0.7809590
5 8 9 0.8665123 7.491329 0.1203080 0.9012670 0.7809590
3 6 7 0.8649691 7.405714 0.1185725 0.8781139 0.7595414
7 8 11 0.8649691 7.405714 0.1185725 0.8781139 0.7595414
3 6 8 0.8533951 6.821053 0.1227273 0.8371292 0.7144019
6 8 11 0.8533951 6.821053 0.1227273 0.8371292 0.7144019
3 8 10 0.8333333 6.000000 0.1364759 0.8188552 0.6823793
4 6 11 0.8333333 6.000000 0.1364759 0.8188552 0.6823793
2 7 10 0.8333333 6.000000 0.1344401 0.8066409 0.6722007
4 7 12 0.8333333 6.000000 0.1344401 0.8066409 0.6722007
3 7 9 0.8425926 6.352941 0.1268545 0.8058991 0.6790446
5 7 11 0.8425926 6.352941 0.1268545 0.8058991 0.6790446
3 7 10 0.8356481 6.084507 0.1313221 0.7990301 0.6677080
4 7 11 0.8356481 6.084507 0.1313221 0.7990301 0.6677080
2 6 9 0.8333333 6.000000 0.1330122 0.7980733 0.6650611
5 8 12 0.8333333 6.000000 0.1330122 0.7980733 0.6650611
3 8 9 0.8356481 6.084507 0.1302251 0.7923555 0.6621304
5 6 11 0.8356481 6.084507 0.1302251 0.7923555 0.6621304
4 5 8 0.8456790 6.480000 0.1222432 0.7921356 0.6698925
6 9 10 0.8456790 6.480000 0.1222432 0.7921356 0.6698925
5 7 9 0.8533951 6.821053 0.1155165 0.7879442 0.6724277
2 7 9 0.8356481 6.084507 0.1292603 0.7864853 0.6572250
5 7 12 0.8356481 6.084507 0.1292603 0.7864853 0.6572250
4 5 7 0.8479938 6.578680 0.1174799 0.7728628 0.6553829
7 9 10 0.8479938 6.578680 0.1174799 0.7728628 0.6553829
2 5 8 0.8287037 5.837838 0.1316561 0.7685868 0.6369307
6 9 12 0.8287037 5.837838 0.1316561 0.7685868 0.6369307
3 6 10 0.8225309 5.634783 0.1340107 0.7551214 0.6211107
4 8 11 0.8225309 5.634783 0.1340107 0.7551214 0.6211107
4 5 10 0.8225309 5.634783 0.1337204 0.7534852 0.6197648
4 9 10 0.8225309 5.634783 0.1337204 0.7534852 0.6197648
2 8 10 0.8155864 5.422594 0.1382342 0.7495879 0.6113537
4 6 12 0.8155864 5.422594 0.1382342 0.7495879 0.6113537
2 8 9 0.8225309 5.634783 0.1319834 0.7436978 0.6117144
5 6 12 0.8225309 5.634783 0.1319834 0.7436978 0.6117144
3 6 9 0.8263889 5.760000 0.1282610 0.7387834 0.6105224
5 8 11 0.8263889 5.760000 0.1282610 0.7387834 0.6105224
2 4 8 0.8155864 5.422594 0.1358893 0.7368726 0.6009833
6 10 12 0.8155864 5.422594 0.1358893 0.7368726 0.6009833
2 6 10 0.8109568 5.289796 0.1381139 0.7305946 0.5924806
4 8 12 0.8109568 5.289796 0.1381139 0.7305946 0.5924806
2 4 7 0.8070988 5.184000 0.1278264 0.6626520 0.5348256
7 10 12 0.8070988 5.184000 0.1278264 0.6626520 0.5348256
2 5 7 0.8094136 5.246964 0.1241163 0.6512336 0.5271173
7 9 12 0.8094136 5.246964 0.1241163 0.6512336 0.5271173
3 5 8 0.8078704 5.204819 0.1211342 0.6304815 0.5093473
6 9 11 0.8078704 5.204819 0.1211342 0.6304815 0.5093473
2 7 12 0.7808642 4.563380 0.1369104 0.6247743 0.4878639
3 4 8 0.7962963 4.909091 0.1256293 0.6167257 0.4910964
6 10 11 0.7962963 4.909091 0.1256293 0.6167257 0.4910964
3 9 10 0.7785494 4.515679 0.1345140 0.6074222 0.4729081
4 5 11 0.7785494 4.515679 0.1345140 0.6074222 0.4729081
4 5 9 0.7986111 4.965517 0.1217176 0.6043909 0.4826733
5 9 10 0.7986111 4.965517 0.1217176 0.6043909 0.4826733
2 7 11 0.7785494 4.515679 0.1323678 0.5977307 0.4653629
3 7 12 0.7785494 4.515679 0.1323678 0.5977307 0.4653629
3 4 9 0.7785494 4.515679 0.1313394 0.5930867 0.4617473
5 10 11 0.7785494 4.515679 0.1313394 0.5930867 0.4617473
3 7 11 0.7762346 4.468966 0.1299620 0.5807958 0.4508337
2 5 10 0.7561728 4.101266 0.1376151 0.5643962 0.4267811
4 9 12 0.7561728 4.101266 0.1376151 0.5643962 0.4267811
3 4 10 0.7561728 4.101266 0.1376102 0.5643761 0.4267659
4 10 11 0.7561728 4.101266 0.1376102 0.5643761 0.4267659
3 4 7 0.7908951 4.782288 0.1175553 0.5621832 0.4446279
7 10 11 0.7908951 4.782288 0.1175553 0.5621832 0.4446279
2 6 11 0.7561728 4.101266 0.1369435 0.5616417 0.4246982
3 8 12 0.7561728 4.101266 0.1369435 0.5616417 0.4246982
2 4 9 0.7561728 4.101266 0.1361454 0.5583685 0.4222231
5 10 12 0.7561728 4.101266 0.1361454 0.5583685 0.4222231
3 5 9 0.7762346 4.468966 0.1247599 0.5575479 0.4327879
5 9 11 0.7762346 4.468966 0.1247599 0.5575479 0.4327879
4 5 6 0.7962963 4.909091 0.1135517 0.5574358 0.4438841
8 9 10 0.7962963 4.909091 0.1135517 0.5574358 0.4438841
2 4 10 0.7384259 3.823009 0.1434450 0.5483916 0.4049466
4 10 12 0.7384259 3.823009 0.1434450 0.5483916 0.4049466
3 6 11 0.7584877 4.140575 0.1318182 0.5458031 0.4139849
3 8 11 0.7584877 4.140575 0.1318182 0.5458031 0.4139849
3 5 10 0.7584877 4.140575 0.1310308 0.5425427 0.4115120
4 9 11 0.7584877 4.140575 0.1310308 0.5425427 0.4115120
2 3 8 0.7561728 4.101266 0.1322016 0.5421941 0.4099924
6 11 12 0.7561728 4.101266 0.1322016 0.5421941 0.4099924
2 5 9 0.7600309 4.167203 0.1292867 0.5387638 0.4094772
5 9 12 0.7600309 4.167203 0.1292867 0.5387638 0.4094772
2 5 6 0.7700617 4.348993 0.1234724 0.5369805 0.4135082
8 9 12 0.7700617 4.348993 0.1234724 0.5369805 0.4135082
2 6 12 0.7384259 3.823009 0.1395436 0.5334764 0.3939328
2 8 12 0.7384259 3.823009 0.1395436 0.5334764 0.3939328
2 4 6 0.7584877 4.140575 0.1278326 0.5293003 0.4014677
8 10 12 0.7584877 4.140575 0.1278326 0.5293003 0.4014677
3 5 7 0.7870370 4.695652 0.1118181 0.5250588 0.4132408
7 9 11 0.7870370 4.695652 0.1118181 0.5250588 0.4132408
2 8 11 0.7361111 3.789474 0.1335765 0.5061847 0.3726081
3 6 12 0.7361111 3.789474 0.1335765 0.5061847 0.3726081
2 3 7 0.7523148 4.037383 0.1234172 0.4982826 0.3748654
7 11 12 0.7523148 4.037383 0.1234172 0.4982826 0.3748654
3 5 6 0.7708333 4.363636 0.1137642 0.4964255 0.3826613
8 9 11 0.7708333 4.363636 0.1137642 0.4964255 0.3826613
2 5 11 0.7121914 3.474531 0.1394376 0.4844802 0.3450426
3 9 12 0.7121914 3.474531 0.1394376 0.4844802 0.3450426
2 3 9 0.7121914 3.474531 0.1356310 0.4712541 0.3356231
5 11 12 0.7121914 3.474531 0.1356310 0.4712541 0.3356231
3 5 11 0.7098765 3.446808 0.1318244 0.4543735 0.3225491
3 9 11 0.7098765 3.446808 0.1318244 0.4543735 0.3225491
3 4 6 0.7422840 3.880240 0.1166226 0.4525235 0.3359009
8 10 11 0.7422840 3.880240 0.1166226 0.4525235 0.3359009
2 9 10 0.7098765 3.446808 0.1312218 0.4522965 0.3210747
4 5 12 0.7098765 3.446808 0.1312218 0.4522965 0.3210747
3 4 11 0.6566358 2.912360 0.1322310 0.3851043 0.2528733
3 10 11 0.6566358 2.912360 0.1322310 0.3851043 0.2528733
2 3 6 0.6836420 3.160976 0.1212589 0.3832964 0.2620375
8 11 12 0.6836420 3.160976 0.1212589 0.3832964 0.2620375
2 4 11 0.6342593 2.734177 0.1380658 0.3774965 0.2394306
3 10 12 0.6342593 2.734177 0.1380658 0.3774965 0.2394306
2 5 12 0.6342593 2.734177 0.1361454 0.3722457 0.2361003
2 9 12 0.6342593 2.734177 0.1361454 0.3722457 0.2361003
2 3 10 0.6342593 2.734177 0.1357290 0.3711071 0.2353781
4 11 12 0.6342593 2.734177 0.1357290 0.3711071 0.2353781
2 9 11 0.6365741 2.751592 0.1285322 0.3536683 0.2251361
3 5 12 0.6365741 2.751592 0.1285322 0.3536683 0.2251361
2 4 5 0.6574074 2.918919 0.1204928 0.3517089 0.2312160
9 10 12 0.6574074 2.918919 0.1204928 0.3517089 0.2312160
3 4 5 0.6689815 3.020979 0.1117480 0.3375883 0.2258403
9 10 11 0.6689815 3.020979 0.1117480 0.3375883 0.2258403
2 10 11 0.5787037 2.373626 0.1289389 0.3060527 0.1771138
3 4 12 0.5787037 2.373626 0.1289389 0.3060527 0.1771138
2 4 12 0.5516975 2.230637 0.1347737 0.3006311 0.1658574
2 10 12 0.5516975 2.230637 0.1347737 0.3006311 0.1658574
2 3 5 0.5841049 2.404453 0.1154664 0.2776335 0.1621671
9 11 12 0.5841049 2.404453 0.1154664 0.2776335 0.1621671
2 3 11 0.5254630 2.107317 0.1303498 0.2746883 0.1443386
3 11 12 0.5254630 2.107317 0.1303498 0.2746883 0.1443386
2 3 4 0.5216049 2.090323 0.1138154 0.2379109 0.1240955
10 11 12 0.5216049 2.090323 0.1138154 0.2379109 0.1240955
2 3 12 0.4382716 1.780220 0.1270576 0.2261905 0.0991329
2 11 12 0.4382716 1.780220 0.1270576 0.2261905 0.0991329