namespace Akwaier.Engine; /// De verdeelsleutel van de fusiebonus, tabel uit regels 2810-2819. public static class Bonus { private const double Tweederde = 2.0 / 3.0; /// /// Levert per rangplaats het deel van de pot. bevat het /// aandeelbezit van de zes spelers, aflopend gesorteerd. /// /// FIX: in het origineel stond de test B=C (regel 2814) voor de test B=C=D /// (regel 2816), waardoor die laatste onbereikbaar was. Hier staan de tests /// van specifiek naar algemeen. /// FIX: de breuken .66/.33/.17/.11/.085/.061 waren afgeronde benaderingen die /// samen op 0,99 uitkwamen in plaats van 1. Hier staan de exacte breuken. /// public static double[] Verdeling(IReadOnlyList bezit) { int a = bezit[0], b = bezit[1], c = bezit[2], d = bezit[3], e = bezit[4], f = bezit[5]; if (b == 0) // maar één aandeelhouder return new double[] { 1, 0, 0, 0, 0, 0 }; if (a == b && b == c) // drie gelijk aan kop return new[] { 1 / 3.0, 1 / 3.0, 1 / 3.0, 0, 0, 0 }; if (a == b) // twee gelijk aan kop return new double[] { 0.5, 0.5, 0, 0, 0, 0 }; if (b == c && c == d && d == e && e == f) // nummers 2 tot en met 6 gelijk return new[] { Tweederde, 1 / 15.0, 1 / 15.0, 1 / 15.0, 1 / 15.0, 1 / 15.0 }; if (b == c && c == d && d == e) // nummers 2 tot en met 5 gelijk return new[] { Tweederde, 1 / 12.0, 1 / 12.0, 1 / 12.0, 1 / 12.0, 0 }; if (b == c && c == d) // nummers 2 tot en met 4 gelijk return new[] { Tweederde, 1 / 9.0, 1 / 9.0, 1 / 9.0, 0, 0 }; if (b == c) // nummers 2 en 3 gelijk return new[] { Tweederde, 1 / 6.0, 1 / 6.0, 0, 0, 0 }; return new[] { Tweederde, 1 / 3.0, 0, 0, 0, 0 }; } }