Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
28162cc
chore: clean up .gitignore and ignore .cp-images
NkL708 Feb 25, 2026
7202823
style: apply auto-formatting
NkL708 Feb 25, 2026
6404732
chore: migrate project to SDK-style .csproj for WSL compatibility
NkL708 Feb 25, 2026
1656ac4
refactor: rename stream variables and clarify args doc in Main
NkL708 Feb 25, 2026
a27f1c6
fix: add Console.ReadKey to prevent immediate exit
NkL708 Feb 25, 2026
064e438
refactor: rename _localStream to _fileStream for clarity
NkL708 Feb 26, 2026
37d5d34
fix: throw InvalidOperationException when stream is not initialized
NkL708 Feb 26, 2026
5e79e80
fix: replace Stream with StreamReader to support character encoding
NkL708 Feb 26, 2026
2b8877f
feat: implement ReadOnlyStream constructor and ReadNextChar
NkL708 Feb 26, 2026
fb92fb9
feat: implement IDisposable to ensure guaranteed file closure
NkL708 Feb 26, 2026
539dac4
chore: add .gitattributes and normalize line endings to LF
NkL708 Feb 26, 2026
232fbbb
refactor: rename LetterStats to CharStats and update related naming
NkL708 Feb 26, 2026
32ac3e1
fix: change CharStats from struct to class to fix mutation via reference
NkL708 Feb 26, 2026
6067739
feat: implement CollectSingleCharStats
NkL708 Feb 26, 2026
aec6a71
feat: implement CollectDoubleCharStats
NkL708 Feb 26, 2026
b2879e7
feat: implement RemoveCharStatsByType
NkL708 Feb 26, 2026
c2869ad
feat: implement PrintStatistic
NkL708 Feb 26, 2026
8e9ed23
docs: note architectural concern about single responsibility in Progr…
NkL708 Feb 26, 2026
1a2f35f
chore: add sample data files for manual testing
NkL708 Feb 26, 2026
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
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* text=auto
26 changes: 9 additions & 17 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
##���������� ��� .gitignore
#.gitignore

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


*.suo
*.user
.vs/
bin/
obj/
packages/
*.suo
*.user
.vs/
bin/
obj/
packages/

# Terminal Paste Image folder
.cp-images/
27 changes: 14 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
# Тестовое задание.
Доброго дня.

Доброго дня.
Данный репозиторий представляет из себя тестовое задание для выполнения перед собеседованием на вакансию разработчика C# в компанию Катрен.

Репозиторий уже содержит основные классы и методы для последующей разработки.
Большая часть уже описаных методов - _заглушки_, требующие реализации.
Репозиторий уже содержит основные классы и методы для последующей разработки.
Большая часть уже описаных методов - _заглушки_, требующие реализации.

Все методы/классы документированы и описывают своё предназначение и требуемое поведение.
Таким образом, чтобы понять что именно данный метод должен делать - достаточно внимательно прочитать его документацию.
Все методы/классы документированы и описывают своё предназначение и требуемое поведение.
Таким образом, чтобы понять что именно данный метод должен делать - достаточно внимательно прочитать его документацию.

Все места, требующие реализации, помечены _TODO_ маркером. Всего таких мест 9 шт.
Все _TODO_ маркеры можно найти нажатием _"Ctrl+W, T"_ (Visual Studio 2017) или любым другим удобным для Вас способом.
Все места, требующие реализации, помечены _TODO_ маркером. Всего таких мест 9 шт.
Все _TODO_ маркеры можно найти нажатием _"Ctrl+W, T"_ (Visual Studio 2017) или любым другим удобным для Вас способом.

Исходный код содержит ошибки/недоработки, которые необходимо исправить каким-либо способом процессе разработки.
Исходный код содержит ошибки/недоработки, которые необходимо исправить каким-либо способом процессе разработки.

В рамках разработки не запрещается как-либо модифицировать уже существующий код.
А именно допускается: создание/удаление/модификация методов/классов/структур и т.д., если этого требует ваша реализация.
В рамках разработки не запрещается как-либо модифицировать уже существующий код.
А именно допускается: создание/удаление/модификация методов/классов/структур и т.д., если этого требует ваша реализация.

__Для разработки настоятельно рекомендуется сделать Fork данного проекта.
И по готовности результат отдать на ревью методом Pull Request'a.__
**Для разработки настоятельно рекомендуется сделать Fork данного проекта.
И по готовности результат отдать на ревью методом Pull Request'a.**

Если данный способ по каким-то причинам Вам не представляется реализуемым, можете выслать результат в виде архива на почту кадровому агенту.
Если данный способ по каким-то причинам Вам не представляется реализуемым, можете выслать результат в виде архива на почту кадровому агенту.
36 changes: 18 additions & 18 deletions TestTask/LetterStats.cs → TestTask/CharStats.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
namespace TestTask
{
/// <summary>
/// Статистика вхождения буквы/пары букв
/// </summary>
public struct LetterStats
{
/// <summary>
/// Буква/Пара букв для учёта статистики.
/// </summary>
public string Letter;
/// <summary>
/// Кол-во вхождений буквы/пары.
/// </summary>
public int Count;
}
}
namespace TestTask
{
/// <summary>
/// Статистика вхождения буквы/пары букв
/// </summary>
public class CharStats
{
/// <summary>
/// Буква/Пара букв для учёта статистики.
/// </summary>
public string Char;

/// <summary>
/// Кол-во вхождений буквы/пары.
/// </summary>
public int Count;
}
}
48 changes: 30 additions & 18 deletions TestTask/CharType.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,30 @@
namespace TestTask
{
/// <summary>
/// Тип букв
/// </summary>
public enum CharType
{
/// <summary>
/// Гласные
/// </summary>
Vowel,

/// <summary>
/// Согласные
/// </summary>
Consonants
}
}
namespace TestTask
{
/// <summary>
/// Тип букв
/// </summary>
public enum CharType
{
/// <summary>
/// Гласные
/// </summary>
Vowel,

/// <summary>
/// Согласные
/// </summary>
Consonants
}

/// <summary>
/// Вспомогательный класс для классификации букв по типу.
/// </summary>
public static class CharTypeHelper
{
private const string RussianVowels = "аеёиоуыэюя";
// TODO: добавить латинские гласные при необходимости: "aeiou"

public static bool IsVowel(char c) =>
RussianVowels.Contains(char.ToLower(c));
}
}
33 changes: 17 additions & 16 deletions TestTask/IReadOnlyStream.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
namespace TestTask
{
/// <summary>
/// Интерфейс для работы с файлом в сильно урезаном виде.
/// Умеет всего 2 вещи: прочитать символ, и перемотать стрим на начало.
/// </summary>
internal interface IReadOnlyStream
{
// TODO : Необходимо доработать данный интерфейс для обеспечения гарантированного закрытия файла, по окончанию работы с таковым!
char ReadNextChar();

void ResetPositionToStart();

bool IsEof { get; }
}
}
using System;

namespace TestTask
{
/// <summary>
/// Интерфейс для работы с файлом в сильно урезаном виде.
/// Умеет всего 2 вещи: прочитать символ, и перемотать стрим на начало.
/// </summary>
internal interface IReadOnlyStream : IDisposable
{
char ReadNextChar();

void ResetPositionToStart();

bool IsEof { get; }
}
}
Loading