Last active
September 25, 2020 15:26
-
-
Save teryror/57a3099a6566d1ab75bd3fd515ab0380 to your computer and use it in GitHub Desktop.
Rust port of Frank Karsten's simulation code for optimizing mana bases in Magic: the Gathering.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Based on Frank Karsten's "How Many Colored Mana Sources" simulation code | |
(see his article [1], original source code found at [2]). | |
[1]: https://strategy.channelfireball.com/all-strategy/channelmagic/channelmagic-articles/how-many-colored-mana-sources-do-you-need-to-consistently-cast-your-spells-a-guilds-of-ravnica-update/ | |
[2]: https://pastebin.com/9P5kwqt1 | |
Updated to account for the London Mulligan rule change, and expanded to | |
account for more restrictive casting costs and different land counts. | |
Revision 2: Added bookkeeping to track the average starting hand size for | |
each land count, and the unconditioned probability of casting each CMC on curve, | |
given its consistency threshold, i.e. (90 + min(5, CMC)) / 100. | |
*/ | |
extern crate rand; | |
use rand::prelude::*; | |
use std::fmt::Write; | |
#[derive(Copy, Clone, PartialEq, Eq)] | |
enum CardType { | |
NonLand, | |
Land, | |
GoodLand, | |
} | |
#[derive(Copy, Clone)] | |
struct Deck { | |
total_cards: u32, | |
total_lands: u32, | |
good_lands: u32 | |
} | |
impl Deck { | |
fn new(total_cards: u32, total_lands: u32, good_lands: u32) -> Self { | |
Deck { total_cards, total_lands, good_lands } | |
} | |
fn draw_card(&mut self, rng: &mut ThreadRng) -> CardType { | |
let int_between_one_and_deck_size = rng.gen_range(0, self.total_cards) + 1; | |
let good_land_cutoff = self.good_lands; | |
let land_cutoff = self.total_lands; | |
if int_between_one_and_deck_size <= good_land_cutoff { | |
self.total_cards -= 1; | |
self.total_lands -= 1; | |
self.good_lands -= 1; | |
CardType::GoodLand | |
} else if int_between_one_and_deck_size > good_land_cutoff && int_between_one_and_deck_size <= land_cutoff { | |
self.total_cards -= 1; | |
self.total_lands -= 1; | |
CardType::Land | |
} else if int_between_one_and_deck_size > land_cutoff { | |
self.total_cards -= 1; | |
CardType::NonLand | |
} else { | |
unreachable!() | |
} | |
} | |
} | |
fn run_sims(deck_size: u32, max_turn_allowed: u32) { | |
const NUM_ITERATIONS: u32 = 250_000; | |
const MULL_STRATEGY: [std::ops::Range<u32>; 4] = [2..6, 2..5, 1..5, 0..5]; | |
// Print header: | |
print!(" "); | |
for turn_allowed in 1..=max_turn_allowed { | |
let mut mana_cost = String::new(); | |
for num_good_lands_needed in 1..=turn_allowed { | |
mana_cost.clear(); | |
if turn_allowed > num_good_lands_needed { | |
write!(&mut mana_cost, "{}", turn_allowed - num_good_lands_needed).unwrap(); | |
} | |
for _ in 0..num_good_lands_needed { | |
mana_cost.push('C'); | |
} | |
for _ in 0..(9 - mana_cost.len()) { | |
print!(" "); | |
} | |
print!("{}", mana_cost); | |
} | |
print!(" P(on curve) | "); | |
} | |
print!("Avg. hand size: "); | |
let mut rng = rand::thread_rng(); | |
for total_lands in (deck_size / 4)..=(deck_size / 2) { | |
print!("\n{:2} lands:", total_lands); | |
// for calculating avg. starting hand size | |
let mut sum_of_starting_hand_sizes = 0; | |
let mut total_iterations_with_this_land_count = 0; | |
for turn_allowed in 1..=max_turn_allowed { | |
// we're looking for the probability of casting a spell with CMC turn_allowed | |
// that requires num_good_lands_needed (which is no larger than turn_allowed) | |
// of a certain color in its cost | |
// e.g. for 2WW [[Wrath of God]], we use turn_allowed = 4 and num_good_lands_needed = 2 | |
let mut count_ok_total = 0; // for calculating P(on curve) | |
let mut total_iterations_with_this_cmc = 0; | |
for num_good_lands_needed in 1..=turn_allowed { | |
// start with the maximum number of sources and go downwards until we go _below_ the | |
// consistency cutoff, this way we try fewer configurations on average than by starting | |
// low and going upwards | |
for num_good_lands in (num_good_lands_needed..=total_lands).rev() { | |
let mut count_ok = 0; // number of games with enough lands *and* good lands | |
let mut count_conditional = 0; // number of relevant games with enough lands | |
total_iterations_with_this_land_count += NUM_ITERATIONS; | |
total_iterations_with_this_cmc += NUM_ITERATIONS; | |
for _ in 0..NUM_ITERATIONS { | |
let mut deck = Deck::new(deck_size, total_lands, num_good_lands); | |
let mut starting_hand_size = 7; | |
let mut lands_in_hand; | |
let mut good_lands_in_hand; | |
let mut free_mulligan = deck_size == 99; | |
loop { | |
lands_in_hand = 0; | |
good_lands_in_hand = 0; | |
// Draw opening hand: | |
for _ in 0..7 { | |
let card_type = deck.draw_card(&mut rng); | |
if card_type != CardType::NonLand { | |
lands_in_hand += 1; | |
} | |
if card_type == CardType::GoodLand { | |
good_lands_in_hand += 1; | |
} | |
} | |
for _ in starting_hand_size..7 { | |
if lands_in_hand > (starting_hand_size / 2) && lands_in_hand > 2 { | |
lands_in_hand -= 1; | |
if good_lands_in_hand > lands_in_hand { | |
good_lands_in_hand -= 1; | |
} | |
} | |
} | |
if MULL_STRATEGY[7 - starting_hand_size as usize].contains(&lands_in_hand) { | |
break; | |
} | |
if free_mulligan { | |
free_mulligan = false; | |
continue; | |
} | |
starting_hand_size -= 1; | |
} | |
assert!(starting_hand_size >= 4); | |
sum_of_starting_hand_sizes += starting_hand_size; | |
if deck_size == 99 { // T1 Draw in Commander | |
let card_type = deck.draw_card(&mut rng); | |
if card_type != CardType::NonLand { | |
lands_in_hand += 1; | |
} | |
if card_type == CardType::GoodLand { | |
good_lands_in_hand += 1; | |
} | |
} | |
for _turn in 2..=turn_allowed { | |
let card_type = deck.draw_card(&mut rng); | |
if card_type != CardType::NonLand { | |
lands_in_hand += 1; | |
} | |
if card_type == CardType::GoodLand { | |
good_lands_in_hand += 1; | |
} | |
} | |
if lands_in_hand >= turn_allowed { | |
count_conditional += 1; | |
if good_lands_in_hand >= num_good_lands_needed { | |
count_ok += 1; | |
} | |
} | |
} | |
count_ok_total += count_ok; | |
let consistency_cutoff = u32::min(95, 90 + turn_allowed) as f64; | |
let percentage_ok = (count_ok as f64 / count_conditional as f64) * 100.0; | |
if percentage_ok < consistency_cutoff { | |
print!("{:9}", num_good_lands + 1); | |
break; | |
} | |
} | |
} | |
let freq_curve_out = count_ok_total as f64 / total_iterations_with_this_cmc as f64 * 100.0; | |
print!(" {:8.2}% | ", freq_curve_out); | |
} | |
let avg_starting_hand_size = sum_of_starting_hand_sizes as f64 / total_iterations_with_this_land_count as f64; | |
print!("{:.2}", avg_starting_hand_size); | |
} | |
} | |
fn main() { | |
println!("Limited decks (40 cards):"); | |
run_sims(40, 6); | |
println!(); | |
println!("Constructed decks (60 cards):"); | |
run_sims(60, 7); | |
println!(); | |
println!("Yorion decks (80 cards):"); | |
run_sims(80, 7); | |
println!(); | |
println!("Commander decks (99 cards):"); | |
run_sims(99, 8); | |
println!(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Limited decks (40 cards): | |
C P(on curve) | 1C CC P(on curve) | 2C 1CC CCC P(on curve) | 3C 2CC 1CCC CCCC P(on curve) | 4C 3CC 2CCC 1CCCC CCCCC P(on curve) | 5C 4CC 3CCC 2CCCC 1CCCCC CCCCCC P(on curve) | Avg. hand size: | |
10 lands: 7 96.65% | 6 10 94.09% | 5 8 10 61.91% | 4 7 9 10 30.79% | 4 6 8 9 10 12.04% | 3 5 7 8 9 10 3.69% | 6.42 | |
11 lands: 7 95.99% | 7 10 94.74% | 6 9 11 68.82% | 5 8 10 11 38.71% | 4 7 8 10 11 17.47% | 4 6 7 9 10 11 6.49% | 6.53 | |
12 lands: 8 97.01% | 7 11 95.36% | 6 9 12 73.54% | 5 8 10 12 45.74% | 5 7 9 11 12 23.80% | 4 6 8 10 11 12 10.27% | 6.62 | |
13 lands: 8 96.45% | 8 12 96.53% | 7 10 13 78.50% | 6 9 11 13 53.12% | 5 8 10 12 13 30.67% | 4 7 9 10 12 13 15.02% | 6.70 | |
14 lands: 8 95.94% | 8 12 95.80% | 7 11 14 82.19% | 6 9 12 14 59.54% | 5 8 11 13 14 37.72% | 5 7 9 11 13 14 20.66% | 6.76 | |
15 lands: 9 96.82% | 8 13 96.07% | 7 11 15 84.70% | 7 10 13 15 65.82% | 6 9 11 14 15 44.90% | 5 8 10 12 14 15 27.09% | 6.80 | |
16 lands: 9 96.44% | 9 14 96.94% | 8 12 15 87.27% | 7 11 14 16 71.28% | 6 9 12 14 16 51.65% | 5 8 11 13 15 16 33.93% | 6.84 | |
17 lands: 10 97.20% | 9 14 96.53% | 8 13 16 89.55% | 7 11 14 17 75.63% | 7 10 13 15 17 58.54% | 6 9 11 14 16 17 41.12% | 6.87 | |
18 lands: 10 96.95% | 9 15 96.78% | 8 13 17 91.11% | 8 12 15 18 80.16% | 7 11 14 16 18 64.88% | 6 9 12 14 17 18 48.21% | 6.88 | |
19 lands: 10 96.74% | 10 15 97.06% | 9 14 18 93.10% | 8 12 16 19 83.68% | 7 11 14 17 19 70.44% | 6 10 13 15 17 19 55.20% | 6.89 | |
20 lands: 11 97.43% | 10 16 97.33% | 9 14 18 93.86% | 8 13 16 19 86.42% | 8 12 15 18 20 75.78% | 7 10 13 16 18 20 61.94% | 6.90 | |
Constructed decks (60 cards): | |
C P(on curve) | 1C CC P(on curve) | 2C 1CC CCC P(on curve) | 3C 2CC 1CCC CCCC P(on curve) | 4C 3CC 2CCC 1CCCC CCCCC P(on curve) | 5C 4CC 3CCC 2CCCC 1CCCCC CCCCCC P(on curve) | 6C 5CC 4CCC 3CCCC 2CCCCC 1CCCCCC CCCCCCC P(on curve) | Avg. hand size: | |
15 lands: 10 96.12% | 9 14 92.75% | 8 12 15 61.27% | 7 10 13 15 31.29% | 6 9 12 14 15 13.41% | 5 8 10 12 14 15 4.87% | 4 7 9 11 13 14 15 1.52% | 6.39 | |
16 lands: 10 95.73% | 10 15 94.42% | 8 13 16 65.59% | 7 11 14 16 36.20% | 6 10 12 15 16 16.85% | 5 9 11 13 15 16 6.75% | 5 7 10 12 13 15 16 2.35% | 6.47 | |
17 lands: 11 96.53% | 10 16 95.00% | 9 14 17 69.80% | 8 12 15 17 41.20% | 7 10 13 16 17 20.68% | 6 9 12 14 16 17 9.05% | 5 8 10 12 14 16 17 3.45% | 6.54 | |
18 lands: 11 96.15% | 11 16 95.32% | 9 14 18 72.94% | 8 12 16 18 45.85% | 7 11 14 16 18 24.72% | 6 10 12 15 17 18 11.72% | 5 8 11 13 15 17 18 4.88% | 6.60 | |
19 lands: 12 96.81% | 11 17 95.69% | 10 15 19 76.35% | 9 13 16 19 50.46% | 8 12 15 17 19 29.11% | 7 10 13 16 18 19 14.79% | 6 9 12 14 16 18 19 6.69% | 6.65 | |
20 lands: 12 96.47% | 12 18 96.47% | 10 16 19 78.67% | 9 14 17 20 54.96% | 8 12 15 18 20 33.46% | 7 11 14 16 19 20 18.20% | 6 9 12 15 17 19 20 8.84% | 6.70 | |
21 lands: 13 97.02% | 12 19 96.61% | 11 16 20 81.15% | 9 14 18 21 59.05% | 8 13 16 19 21 38.03% | 7 11 14 17 19 21 21.83% | 6 10 13 15 18 20 21 11.38% | 6.74 | |
22 lands: 13 96.73% | 13 19 96.68% | 11 17 21 83.38% | 10 15 19 22 63.24% | 9 13 17 20 22 42.63% | 8 12 15 18 20 22 25.90% | 7 10 13 16 19 21 22 14.32% | 6.77 | |
23 lands: 14 97.23% | 13 20 96.84% | 11 17 22 85.05% | 10 15 20 23 66.87% | 9 14 18 21 23 47.21% | 8 12 16 19 21 23 30.15% | 7 11 14 17 19 22 23 17.62% | 6.80 | |
24 lands: 14 96.99% | 13 20 96.51% | 12 18 23 87.08% | 11 16 20 24 70.37% | 10 14 18 22 24 51.62% | 8 13 16 19 22 24 34.50% | 7 11 15 18 20 22 24 21.22% | 6.82 | |
25 lands: 14 96.78% | 14 21 97.04% | 12 19 24 88.64% | 11 17 21 25 73.68% | 10 15 19 22 25 55.90% | 9 13 17 20 23 25 39.04% | 8 12 15 18 21 23 25 25.17% | 6.84 | |
26 lands: 15 97.24% | 14 22 97.16% | 12 19 24 89.53% | 11 17 22 25 76.35% | 10 16 20 23 26 60.14% | 9 14 18 21 24 26 43.66% | 8 12 16 19 22 24 26 29.39% | 6.86 | |
27 lands: 15 97.08% | 14 22 96.96% | 13 20 25 91.06% | 12 18 23 26 79.30% | 11 16 20 24 27 64.11% | 9 14 18 22 25 27 48.18% | 8 13 17 20 23 25 27 33.84% | 6.87 | |
28 lands: 15 96.95% | 14 23 97.10% | 13 20 26 91.98% | 12 18 23 27 81.60% | 11 17 21 25 28 67.96% | 10 15 19 23 26 28 52.80% | 9 13 17 20 23 26 28 38.32% | 6.88 | |
29 lands: 16 97.37% | 15 23 97.27% | 13 21 27 93.00% | 12 19 24 28 83.95% | 11 17 22 26 29 71.48% | 10 15 20 23 26 29 57.06% | 9 14 18 21 24 27 29 43.02% | 6.88 | |
30 lands: 16 97.26% | 15 23 97.13% | 14 21 27 93.72% | 12 19 25 29 85.93% | 12 18 22 26 30 74.73% | 10 16 20 24 27 30 61.30% | 9 14 18 22 25 28 30 47.67% | 6.89 | |
Yorion decks (80 cards): | |
C P(on curve) | 1C CC P(on curve) | 2C 1CC CCC P(on curve) | 3C 2CC 1CCC CCCC P(on curve) | 4C 3CC 2CCC 1CCCC CCCCC P(on curve) | 5C 4CC 3CCC 2CCCC 1CCCCC CCCCCC P(on curve) | 6C 5CC 4CCC 3CCCC 2CCCCC 1CCCCCC CCCCCCC P(on curve) | Avg. hand size: | |
20 lands: 13 95.85% | 13 19 93.31% | 11 16 20 60.98% | 9 14 18 20 31.66% | 8 12 16 18 20 13.98% | 7 11 14 16 19 20 5.42% | 6 10 12 15 17 19 20 1.87% | 6.37 | |
21 lands: 14 96.50% | 13 20 94.05% | 11 17 21 64.22% | 10 15 18 21 35.19% | 9 13 16 19 21 16.53% | 7 11 15 17 20 21 6.83% | 6 10 13 16 18 20 21 2.52% | 6.43 | |
22 lands: 14 96.23% | 14 20 94.53% | 12 17 22 67.22% | 10 15 19 22 38.70% | 9 14 17 20 22 19.29% | 8 12 15 18 20 22 8.44% | 7 11 14 16 19 21 22 3.34% | 6.49 | |
23 lands: 15 96.77% | 14 21 95.04% | 12 18 22 69.68% | 11 16 20 23 42.36% | 9 14 18 21 23 22.15% | 8 12 16 19 21 23 10.29% | 7 11 14 17 20 22 23 4.31% | 6.54 | |
24 lands: 15 96.50% | 15 22 95.84% | 13 19 23 72.52% | 11 17 21 24 45.87% | 10 15 19 22 24 25.23% | 9 13 17 20 22 24 12.35% | 8 12 15 18 20 23 24 5.47% | 6.58 | |
25 lands: 16 96.97% | 15 23 96.10% | 13 20 24 74.91% | 11 17 22 25 49.22% | 10 15 19 23 25 28.31% | 9 13 17 21 23 25 14.58% | 8 12 15 19 21 24 25 6.82% | 6.62 | |
26 lands: 16 96.71% | 15 23 95.85% | 13 20 25 76.89% | 12 18 22 26 52.53% | 11 16 20 24 26 31.60% | 9 14 18 21 24 26 17.01% | 8 13 16 19 22 24 26 8.34% | 6.66 | |
27 lands: 17 97.13% | 16 24 96.42% | 14 21 26 79.12% | 12 18 23 27 55.70% | 11 17 21 24 27 34.87% | 10 15 19 22 25 27 19.67% | 8 13 17 20 23 25 27 10.10% | 6.70 | |
28 lands: 17 96.91% | 16 25 96.56% | 14 22 27 80.97% | 13 19 24 28 58.94% | 11 17 22 25 28 38.17% | 10 15 19 23 26 28 22.42% | 9 13 17 21 24 26 28 12.06% | 6.73 | |
29 lands: 17 96.68% | 17 25 96.64% | 15 22 28 82.65% | 13 20 25 29 61.93% | 12 18 22 26 29 41.55% | 10 16 20 24 27 29 25.38% | 9 14 18 22 25 27 29 14.24% | 6.75 | |
30 lands: 18 97.08% | 17 26 96.76% | 15 23 29 84.20% | 13 20 26 30 64.72% | 12 18 23 27 30 44.88% | 11 16 21 24 28 30 28.43% | 9 14 19 22 25 28 30 16.56% | 6.78 | |
31 lands: 18 96.88% | 17 27 96.84% | 15 24 29 85.40% | 14 21 26 30 67.29% | 13 19 24 28 31 48.28% | 11 17 21 25 29 31 31.58% | 10 15 19 23 26 29 31 19.12% | 6.80 | |
32 lands: 19 97.23% | 18 27 96.93% | 16 24 30 86.71% | 14 21 27 31 69.81% | 13 19 25 29 32 51.54% | 11 17 22 26 29 32 34.77% | 10 15 20 24 27 30 32 21.85% | 6.81 | |
33 lands: 19 97.07% | 18 28 97.02% | 16 25 31 87.94% | 14 22 28 32 72.30% | 13 20 25 30 33 54.72% | 12 18 23 27 30 33 38.16% | 10 16 20 24 28 31 33 24.71% | 6.83 | |
34 lands: 19 96.93% | 18 28 96.83% | 16 25 32 88.88% | 15 23 29 33 74.76% | 14 20 26 30 34 57.82% | 12 18 23 28 31 34 41.44% | 11 16 21 25 29 32 34 27.76% | 6.84 | |
35 lands: 20 97.26% | 19 29 97.19% | 17 26 33 90.08% | 15 23 29 34 76.76% | 14 21 27 31 35 60.90% | 12 19 24 28 32 35 44.82% | 11 17 22 26 30 33 35 30.92% | 6.85 | |
36 lands: 20 97.14% | 19 29 97.03% | 17 26 33 90.67% | 16 24 30 35 78.94% | 14 21 27 32 36 63.76% | 13 19 24 29 33 36 48.14% | 11 17 22 27 30 34 36 34.14% | 6.86 | |
37 lands: 20 97.04% | 19 30 97.15% | 17 27 34 91.57% | 16 24 31 36 80.79% | 15 22 28 33 37 66.68% | 13 20 25 30 34 37 51.50% | 12 18 23 27 31 34 37 37.45% | 6.87 | |
38 lands: 21 97.35% | 20 30 97.24% | 18 27 35 92.38% | 16 25 31 37 82.51% | 15 23 29 34 38 69.42% | 13 20 26 31 35 38 54.76% | 12 18 23 28 32 35 38 40.82% | 6.88 | |
39 lands: 21 97.27% | 20 31 97.37% | 18 28 35 92.96% | 16 25 32 38 84.09% | 15 23 29 34 38 71.76% | 14 21 26 31 36 39 57.95% | 12 19 24 29 33 36 39 44.25% | 6.88 | |
40 lands: 21 97.19% | 20 31 97.26% | 18 28 36 93.52% | 17 26 33 38 85.65% | 15 23 30 35 39 74.17% | 14 21 27 32 36 40 61.02% | 12 19 24 29 33 37 40 47.59% | 6.88 | |
Commander decks (99 cards): | |
C P(on curve) | 1C CC P(on curve) | 2C 1CC CCC P(on curve) | 3C 2CC 1CCC CCCC P(on curve) | 4C 3CC 2CCC 1CCCC CCCCC P(on curve) | 5C 4CC 3CCC 2CCCC 1CCCCC CCCCCC P(on curve) | 6C 5CC 4CCC 3CCCC 2CCCCC 1CCCCCC CCCCCCC P(on curve) | 7C 6CC 5CCC 4CCCC 3CCCCC 2CCCCCC 1CCCCCCC CCCCCCCC P(on curve) | Avg. hand size: | |
24 lands: 15 96.67% | 15 22 95.82% | 13 19 23 71.34% | 11 17 21 24 43.06% | 10 15 19 22 24 22.01% | 9 13 17 20 22 24 9.82% | 8 12 15 18 20 23 24 3.91% | 7 10 13 16 19 21 23 24 1.40% | 6.72 | |
25 lands: 15 96.41% | 15 23 96.09% | 13 20 24 73.56% | 11 17 22 25 46.04% | 10 15 20 23 25 24.63% | 9 14 17 21 23 25 11.55% | 8 12 16 19 21 24 25 4.84% | 7 11 14 17 20 22 24 25 1.83% | 6.75 | |
26 lands: 16 96.88% | 16 23 96.20% | 14 20 25 75.60% | 12 18 23 26 49.14% | 11 16 20 24 26 27.35% | 9 14 18 21 24 26 13.40% | 8 13 16 19 22 24 26 5.89% | 7 11 15 18 20 23 25 26 2.36% | 6.79 | |
27 lands: 16 96.65% | 16 24 96.39% | 14 21 26 77.50% | 12 19 23 27 51.92% | 11 17 21 25 27 30.13% | 10 15 19 22 25 27 15.42% | 9 13 17 20 23 25 27 7.11% | 8 12 15 18 21 24 26 27 2.98% | 6.82 | |
28 lands: 17 97.05% | 16 25 96.52% | 14 22 27 79.25% | 13 19 24 28 54.75% | 11 17 22 25 28 32.85% | 10 15 19 23 26 28 17.54% | 9 14 17 21 24 26 28 8.45% | 8 12 16 19 22 24 27 28 3.71% | 6.84 | |
29 lands: 17 96.84% | 17 25 96.58% | 15 22 28 80.81% | 13 20 25 29 57.48% | 12 18 23 26 29 35.75% | 10 16 20 24 27 29 19.80% | 9 14 18 22 25 27 29 9.93% | 8 13 16 20 23 25 28 29 4.56% | 6.86 | |
30 lands: 18 97.20% | 17 26 96.70% | 15 23 29 82.30% | 14 20 26 30 60.09% | 12 18 23 27 30 38.51% | 11 16 21 25 28 30 22.16% | 9 15 19 22 26 28 30 11.57% | 8 13 17 20 23 26 28 30 5.52% | 6.88 | |
31 lands: 18 97.01% | 18 27 97.09% | 16 24 30 83.83% | 14 21 27 31 62.62% | 13 19 24 28 31 41.40% | 11 17 21 25 29 31 24.59% | 10 15 19 23 26 29 31 13.31% | 9 13 18 21 24 27 29 31 6.63% | 6.90 | |
32 lands: 18 96.84% | 18 27 96.81% | 16 24 30 84.68% | 14 22 27 31 64.77% | 13 20 25 29 32 44.24% | 11 17 22 26 30 32 27.11% | 10 15 20 24 27 30 32 15.22% | 9 14 18 22 25 28 30 32 7.87% | 6.91 | |
33 lands: 19 97.16% | 18 28 96.90% | 16 25 31 85.87% | 15 22 28 32 67.10% | 13 20 25 30 33 46.97% | 12 18 23 27 30 33 29.74% | 10 16 21 25 28 31 33 17.25% | 9 14 19 22 26 29 31 33 9.23% | 6.93 | |
34 lands: 19 97.02% | 19 29 97.25% | 17 26 32 87.14% | 15 23 29 33 69.35% | 14 21 26 31 34 49.80% | 12 18 23 28 31 34 32.37% | 11 16 21 25 29 32 34 19.40% | 10 15 19 23 27 30 32 34 10.76% | 6.94 | |
35 lands: 20 97.33% | 19 29 97.03% | 17 26 33 87.99% | 15 23 30 34 71.38% | 14 21 27 31 35 52.46% | 12 19 24 29 32 35 35.13% | 11 17 22 26 30 33 35 21.68% | 10 15 20 24 27 30 33 35 12.39% | 6.95 | |
36 lands: 20 97.20% | 19 30 97.11% | 17 27 34 88.94% | 16 24 30 35 73.41% | 14 22 28 32 36 55.16% | 13 19 25 29 33 36 37.88% | 11 17 22 27 30 34 36 24.03% | 10 16 20 24 28 31 34 36 14.19% | 6.95 | |
37 lands: 20 97.07% | 20 30 97.17% | 18 27 35 89.82% | 16 25 31 36 75.35% | 15 22 28 33 37 57.76% | 13 20 25 30 34 37 40.66% | 12 18 23 27 31 35 37 26.52% | 10 16 21 25 29 32 35 37 16.14% | 6.96 | |
38 lands: 21 97.37% | 20 31 97.27% | 18 28 35 90.49% | 17 25 32 37 77.20% | 15 23 29 34 38 60.37% | 13 20 26 31 35 38 43.45% | 12 18 24 28 32 35 38 29.09% | 11 17 21 26 30 33 36 38 18.21% | 6.97 | |
39 lands: 21 97.27% | 20 31 97.11% | 18 28 36 91.11% | 17 26 33 38 78.95% | 15 23 30 35 39 62.84% | 14 21 27 32 36 39 46.34% | 12 19 24 29 33 36 39 31.76% | 11 17 22 26 30 34 37 39 20.41% | 6.97 | |
40 lands: 21 97.17% | 21 32 97.41% | 19 29 37 91.99% | 17 26 33 39 80.43% | 16 24 30 36 40 65.30% | 14 21 27 32 37 40 49.07% | 13 19 25 30 34 37 40 34.51% | 11 17 23 27 31 35 38 40 22.73% | 6.97 | |
41 lands: 22 97.46% | 21 32 97.29% | 19 29 37 92.37% | 17 27 34 40 82.01% | 16 24 31 36 40 67.47% | 14 22 28 33 37 41 51.84% | 13 20 25 30 35 38 41 37.27% | 12 18 23 28 32 35 39 41 25.20% | 6.98 | |
42 lands: 22 97.38% | 21 33 97.39% | 19 30 38 93.01% | 18 27 35 40 83.38% | 16 25 32 37 41 69.79% | 15 22 29 34 38 42 54.63% | 13 20 26 31 35 39 42 40.10% | 12 18 24 28 33 36 40 42 27.75% | 6.98 | |
43 lands: 22 97.31% | 21 33 97.29% | 20 30 39 93.60% | 18 28 35 41 84.71% | 17 25 32 38 42 71.97% | 15 23 29 35 39 43 57.36% | 13 21 26 32 36 40 43 42.96% | 12 19 24 29 33 37 40 43 30.39% | 6.98 | |
44 lands: 23 97.57% | 22 34 97.58% | 20 31 40 94.15% | 18 28 36 42 85.96% | 17 26 33 39 43 74.09% | 15 23 30 35 40 44 59.99% | 14 21 27 32 37 41 44 45.86% | 12 19 25 30 34 38 41 44 33.15% | 6.98 | |
45 lands: 23 97.52% | 22 34 97.49% | 20 31 40 94.41% | 19 29 37 43 87.29% | 17 26 33 39 44 75.96% | 16 24 30 36 41 45 62.64% | 14 21 28 33 38 42 45 48.77% | 13 19 25 30 35 39 42 45 35.99% | 6.98 | |
46 lands: 23 97.46% | 22 35 97.59% | 20 32 41 94.90% | 19 29 37 44 88.29% | 18 27 34 40 45 77.97% | 16 24 31 37 42 46 65.20% | 14 22 28 34 38 43 46 51.64% | 13 20 26 31 35 40 43 46 38.89% | 6.98 | |
47 lands: 23 97.41% | 22 35 97.54% | 21 32 41 95.23% | 19 29 38 44 89.20% | 18 27 35 41 46 79.78% | 16 25 31 37 42 46 67.53% | 15 22 29 34 39 43 47 54.49% | 13 20 26 31 36 40 44 47 41.80% | 6.98 | |
48 lands: 24 97.67% | 22 35 97.47% | 21 33 42 95.66% | 19 30 38 45 90.15% | 18 28 35 42 47 81.49% | 16 25 32 38 43 47 69.94% | 15 23 29 35 40 44 48 57.34% | 13 21 27 32 37 41 45 48 44.82% | 6.99 | |
49 lands: 24 97.63% | 23 36 97.74% | 21 33 42 95.83% | 20 30 39 46 91.10% | 18 28 36 42 48 83.03% | 17 25 33 39 44 48 72.28% | 15 23 30 35 41 45 49 60.12% | 14 21 27 33 38 42 46 49 47.84% | 6.99 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment