@page "/"
<PageTitle>Penalty Shootout</PageTitle>
<p>@($"p_Diff1:\t{_pDiff1:P}")</p>
<p>@($"p_Diff2:\t{_pDiff2:P}")</p>
<p>@($"p_Diff3:\t{_pDiff3:P}")</p>
@code {
private double _pDiff1 = 0;
private double _pDiff2 = 0;
private double _pDiff3 = 0;
protected override void OnInitialized()
{
base.OnInitialized();
// create an array with number from 0 to 1023 in binary format
// {00000000, 00000001, 00000010, 00000011, ...}
var binaryArray = Enumerable.Range(0, 1024).Select(x => Convert.ToString(x, 2).PadLeft(10, '0')).ToArray();
// for each element in the array, take the binary number and convert it to a bool array
// {00000000} -> {false, false, false, false, false, false, false, false, false, false}
// {00000001} -> {false, false, false, false, false, false, false, false, false, true}
// ...
var boolArray = binaryArray.Select(x => x.Select(y => y == '1').ToArray()).ToArray();
// split each bool array into 2 parts of 5 elements each and write them to a new 2D array
// {false, false, false, false, false, false, false, false, false, false} -> {{false, false, false, false, false}, {false, false, false, false, false}}
// {false, false, false, false, false, false, false, false, false, true} -> {{false, false, false, false, false}, {false, false, false, false, true}}
// ...
var splitArray = boolArray.Select(x => new bool[][] { x.Take(5).ToArray(), x.Skip(5).ToArray() }).ToArray();
// number of diff1, diff2, diff3
var nDiff1 = 0;
var nDiff2 = 0;
var nDiff3 = 0;
// for each element in the split array
foreach (var item in splitArray)
{
var goalsTeam1 = 0;
var goalsTeam2 = 0;
// for each round
for (var i = 0; i < 5; i++)
{
// if team 1 can still win
if (Math.Abs(goalsTeam2 - goalsTeam1) <= 5 - i)
{
// if team 1 scores
if (item[0][i])
goalsTeam1++;
}
// if team 2 can still win
if (Math.Abs(goalsTeam1 - goalsTeam2) <= 5 - i)
{
// if team 2 scores
if (item[1][i])
goalsTeam2++;
}
}
// add the difference to the respective counter
switch (Math.Abs(goalsTeam1 - goalsTeam2))
{
case 0:
case 1:
nDiff1++;
break;
case 2:
nDiff2++;
break;
case 3:
nDiff3++;
break;
default:
throw new Exception("This cannot be and should not happen.");
break;
}
}
// calculate the probabilities of diff1, diff2, diff3
_pDiff1 = nDiff1 / 1024d;
_pDiff2 = nDiff2 / 1024d;
_pDiff3 = nDiff3 / 1024d;
}
}