Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,14 +1,3 @@
##���������� ��� .gitignore
#.gitignore

### ���������� ���������� ��� ������
## *.html
###� ����� ������������� �����
## !special.html
### ����� ������������ ���.���������.
## *.[ao]


*.suo
*.user
.vs/
Expand Down
18 changes: 0 additions & 18 deletions TestTask/CharType.cs

This file was deleted.

18 changes: 18 additions & 0 deletions TestTask/Enums/CharType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
namespace TestTask.Enums
{
/// <summary>
/// Тип букв
/// </summary>
public enum CharType
{
/// <summary>
/// Гласные
/// </summary>
Vowel,

/// <summary>
/// Согласные
/// </summary>
Consonants
}
}
74 changes: 74 additions & 0 deletions TestTask/Helpers/Extensions/CharExtension.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
namespace TestTask.Helpers.Extensions
{
/// <summary>
/// Расширение для char.
/// </summary>
internal static class CharExtension
{
#region Public Methods

/// <summary>
/// Проверяет символ английская ли глассная буква?
/// </summary>
/// <param name="value">Входной символ.</param>
/// <returns>Английская глассная буква?</returns>
public static bool IsEnglishVowel(this char value)
{
value = char.ToLowerInvariant(value);

switch (value)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
return true;

default:
return false;
}
}

/// <summary>
/// Проверяет символ русская ли глассная буква?
/// </summary>
/// <param name="value">Входной символ.</param>
/// <returns>Русская глассная буква?</returns>
public static bool IsRussianVowel(this char value)
{
value = char.ToLowerInvariant(value);

switch (value)
{
case 'а':
case 'е':
case 'ё':
case 'и':
case 'о':
case 'у':
case 'ы':
case 'э':
case 'ю':
case 'я':
return true;

default:
return false;
}
}

/// <summary>
/// Проверяет символ глассная ли буква?
/// </summary>
/// <param name="value">Входной символ.</param>
/// <returns>Глассная буква?</returns>
/// <remarks>Проверка русского и английского алфовита.</remarks>
public static bool IsVowel(this char value)
{
return IsRussianVowel(value) || IsEnglishVowel(value);
}

#endregion Public Methods
}
}
99 changes: 99 additions & 0 deletions TestTask/Helpers/FillLetterStatsHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
namespace TestTask.Helpers
{
using System.Collections.Generic;
using TestTask.Streams.Interfaces;
using TestTask.Structs;

/// <summary>
/// Хелпер для составления статистики букв.
/// </summary>
internal static class FillLetterStatsHelper
{
#region Public Methods

/// <summary>
/// Считывает из входящего потока все буквы, и возвращающает коллекцию статистик вхождения парных букв.
/// </summary>
/// <param name="stream">Стрим для считывания символов для последующего анализа</param>
/// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
/// <remarks>
/// В статистику должны попадать только пары из одинаковых букв, например АА, СС, УУ, ЕЕ и т.д.
/// Статистика - НЕ регистрозависимая!
/// </remarks>
public static Dictionary<char, LetterStats> FillDoubleLetterStats(IReadOnlyStream stream)
{
stream.ResetPositionToStart();

var statsByLetter = new Dictionary<char, LetterStats>();
char? prevLetter = null;

while (!stream.IsEof)
{
char originalLetter = stream.ReadNextChar();

// В статистику идут только буквы
if (!char.IsLetter(originalLetter))
{
prevLetter = null;

continue;
}

char letter = char.ToUpper(originalLetter); // НЕ регистрозависимо

// Если текущая буква равна предыдущей — это парная буква (AA, CC, ...)
if (prevLetter.HasValue && prevLetter.Value == letter)
{
// ВАЖНО: инкрементим статистику именно по букве
if (statsByLetter.TryGetValue(letter, out LetterStats stats))
{
stats.Count++;
statsByLetter[letter] = stats; // обязательно вернуть обратно
}
else
{
statsByLetter[letter] = new LetterStats { Count = 1, Letter = $"{letter}{letter}" };
}
}

prevLetter = letter;
}

return statsByLetter;
}

/// <summary>
/// Считывает из входящего потока все буквы, и возвращающает коллекцию статистик вхождения каждой буквы.
/// </summary>
/// <param name="stream">Стрим для считывания символов для последующего анализа</param>
/// <returns>Коллекция статистик по каждой букве, что была прочитана из стрима.</returns>
/// <remarks>Статистика РЕГИСТРОЗАВИСИМАЯ!</remarks>
public static Dictionary<char, LetterStats> FillSingleLetterStats(IReadOnlyStream stream)
{
stream.ResetPositionToStart();
Dictionary<char, LetterStats> statsByLetter = new Dictionary<char, LetterStats>();

while (!stream.IsEof)
{
char letter = stream.ReadNextChar();

if (char.IsLetter(letter))
{
if (statsByLetter.TryGetValue(letter, out LetterStats stats))
{
stats.Count++;
statsByLetter[letter] = stats; // обязательно вернуть обратно
}
else
{
statsByLetter[letter] = new LetterStats { Count = 1, Letter = letter.ToString() };
}
}
}

return statsByLetter;
}

#endregion Public Methods
}
}
47 changes: 47 additions & 0 deletions TestTask/Helpers/FilterCharStats.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
namespace TestTask.Helpers
{
using System.Collections.Generic;
using System.Linq;
using TestTask.Enums;
using TestTask.Helpers.Extensions;
using TestTask.Structs;

/// <summary>
/// Класс для фильтрации статистики букв.
/// </summary>
internal static class FilterCharStats
{
/// <summary>
/// Фильтруются все найденные буквы/парные буквы, содержащие в себе только гласные или согласные буквы.
/// (Тип букв для перебора определяется параметром charType)
/// Все найденные буквы/пары соответствующие параметру поиска - удаляются из переданной коллекции статистик.
/// </summary>
/// <param name="letters">Коллекция со статистиками вхождения букв/пар</param>
/// <param name="charType">Тип букв для анализа</param>
public static void RemoveCharStatsByType(Dictionary<char, LetterStats> letters, CharType charType)
{
List<char> list = letters.Select(x => x.Key).ToList();

foreach (char value in list)
{
switch (charType)
{
case CharType.Consonants:

if (!value.IsVowel())
{
letters.Remove(value);
}
break;

case CharType.Vowel:
if (value.IsVowel())
{
letters.Remove(value);
}
break;
}
}
}
}
}
16 changes: 0 additions & 16 deletions TestTask/IReadOnlyStream.cs

This file was deleted.

18 changes: 0 additions & 18 deletions TestTask/LetterStats.cs

This file was deleted.

Loading