public CipherToolPage()
        {
            InitializeComponent();

            _cipherMachine = new SubstitutionCipherMachine(_englishAlphabet);

            QuadgramDataset dataset = new QuadgramDataset(_englishAlphabet);

            Utils.ParseAndFill(dataset, "quadgrams_eng.txt");

            _textFitnessCalculator = new TextFitnessCalculator(dataset);

            Random random = new Random();

            TextBoxKey.Text = new string(TextBoxKey.Text.OrderBy(x => random.Next()).ToArray());
        }
        public SubstitutionCipherBreaker(HashSet <char> alphabet, TextFitnessCalculator fitnessCalculator, string encodedText)
        {
            _cipherMachine     = new SubstitutionCipherMachine(alphabet);
            _fitnessCalculator = fitnessCalculator;

            _text = _cipherMachine.ClearTextAndGetExternalSymbols(encodedText, out _symbols);

            _textLength     = _text.Length;
            _alphabetLength = alphabet.Count;

            _textArrayPool = ArrayPool <byte> .Create(_textLength, 10);

            _keyArrayPool = ArrayPool <byte> .Create(_alphabetLength, 1);

            _marksArrayPool = ArrayPool <bool> .Create(_alphabetLength, 1);

            _byteAlphabet = new HashSet <byte>(Enumerable.Range(0, _alphabetLength).Select(x => (byte)x).ToArray());
        }