Skip to content

Instantly share code, notes, and snippets.

@teryror
Last active September 25, 2020 15:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save teryror/57a3099a6566d1ab75bd3fd515ab0380 to your computer and use it in GitHub Desktop.
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.
/*
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!();
}
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