- Поддерживать ум в тонусе через регулярную практику.
- Прокачка алгоритмического мышления, логики и навыков backend-разработки на C#.
- Углублённое понимание внутренних механизмов .NET и CLR.
- Лёгкий — задачи-разминки, не требуют сложных знаний, но требуют внимательности.
- Средний — задачи уровня опытного C# backend-разработчика, на логику и прикладные знания .NET.
- Insane — нестандартные, глубоко технические задачи, требующие глубокого понимания устройства CLR, памяти и поведения языка.
- ❌ Не подглядывать в чужие решения.
- ❓ Все вопросы по условиям — только в личных сообщениях (не в общем чате).
- 🧠 Не использовать ИИ-агентов или поисковые системы для нахождения готовых решений.
- ✅ Цель — честная прокачка, а не "найти ответ".
Уровень сложности: Лёгкий
Дана последовательность различных чисел от 1 до n включительно в виде массива. Из этих цифр можно составить k-значное число без повторений (где k равен длине массива). Требуется вернуть число, находящееся на заданной позиции в этом числе.
Формат входных данных:
- Массив
digits— массив целых чисел от 1 до n. - Целое число
position— позиция, от 1 до k, которую нужно вернуть.
Формат выходных данных:
- Целое число — число на позиции
positionв составленном числе.
Важно:
- Позиции нумеруются с 1 (не с 0).
- Все числа в массиве уникальны.
Вход:
digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
position = 1
Результат: 9
Вход:
digits = [1, 2, 3, 4, 5]
position = 4
Результат: 2
Шаблон: FindNumberAtPositionBySequenceTemplate.cs
Уровень сложности: Средний
В SQL-запросе могут встречаться выражения вида:
SELECT
column_name AS property_nameТребуется составить регулярное выражение, которое найдёт такие пары и создаст две именованные группы:
column— имя столбца в запросе (доAS);property— имя алиаса (послеAS).
Регулярное выражение должно быть применимо к тексту запроса и поддерживать множественные совпадения (флаг /g) в нечувствительном к регистру (/i) и мультистрочном (/m) режиме.
- Вернуть строку, содержащую регулярное выражение.
- Регулярное выражение должно использовать именованные группы
columnиproperty. - Алиасы и имена столбцов могут быть разделены произвольным количеством пробелов и табуляции.
- Одна строка — регулярное выражение в виде
string.
На входе — SQL-запрос в составе C#-метода:
SELECT
id AS id,
code AS code,
payer_account_number AS payeraccountnumber,
legal_entity AS legalentity
FROM read.account_contractsРезультат сопоставления:
- Группы
column:["id", "code", "payer_account_number", "legal_entity"] - Группы
property:["id", "code", "payeraccountnumber", "legalentity"]
Имя шаблона: FindColumnToPropertyMappingsTemplate.cs
Уровень сложности: Insane
Реализовать метод:
public void DoIt(string source, string target)Так, чтобы после его выполнения значение переменной source в вызывающем методе стало равно target, либо его префиксу — в зависимости от длины.
В C# строки:
- immutable (неизменяемые);
- передаются в методы по значению, даже если это ссылочный тип.
Тем не менее, цель задачи — добиться того, чтобы значение source изменилось в вызывающем коде.
- Если длина
source≥ длиныtarget, нужно полностью заменитьsourceнаtarget. - Если длина
source< длиныtarget, заменитьsourceна первыеsource.Lengthсимволов изtarget.
[Fact]
public void Test()
{
var text = "this is a magic bro";
DoIt(text, "good luck have fun!");
Assert.Equal("good luck have fun!", text); // ← этот тест должен пройти
var shortText = "abc";
DoIt(shortText, "hello world");
Assert.Equal("hel", shortText); // ← длина исходной строки 3
}- Метод
DoIt, изменяющийsourceнастолько глубоко, что изменения отражаются в вызывающем контексте. - Это возможно только с применением нестандартных техник.
Имя шаблона: ShadowOfAlmightyTemplate.cs
Первая задача будет разминкой для ума. Она является очень легкой и поэтому тут отсутсвуют бенчмарки и тесты.
Задание:
Дан массив возрастающих чисел от 0 до n в котором отсутствует одно число.
Необходимо найти отсутствующее число. Метод принимает массив чисел, необходимо вернуть отсутствующее число.
Пример: [0, 1, 2, 4, 5] => 3
Решение оставляем в папке FindMissingNumber за основу берем FindMissingNumberTemplate.cs
Эта задача является небольшим вызовом и откроет для Вас что-то новое и интересное. Предстоит заняться самостоятельно ресерчем - что является частью задания. Желаю успехов.
Задание:
У нас есть проект Problems.Analyzers.Sample, в котором в папке RenameContracts находятся dtoшки которые не соответствуют правилам наименования:
- имя record должно содержать в себе: rootFolder + baseName + currentFolder
- rootFolder - корневая папка, в нашем случае - CreateOrder
- baseName - название dto
- currentFolder - папка в которой лежит dto: в нашем случае Request или Response
Необходимо с помощью Roslyn api написать анализатор и code-fix. Анализатор будет находить такие dto, а с помощью code-fix будет происходить исправление наименований. Ожидается что code-fix исправит наименования так:
- папка Request
- CreateOrder -> CreateOrderRequest
- CreateOrderHeader -> CreateOrderHeaderRequest
- CreateOrderHeaderParameters -> CreateOrderHeaderParametersRequest
- папка Response
- CreateOrder -> CreateOrderResponse
- Line -> CreateOrderLineResponse
Исправление и анализ должен производится только в папке RenameContracts.
Принцип работы:
- анализатор и код фикс размещаем в проекте Problems.Analyzers
- очищаем решение (solution clean)
- билдим Problems.Analyzers
- билдим Problems.Analyzers.Sample
- ide подсвечивает проблемные dto и предлагает исправление
- принимаем исправления
- при необходимости Problems.Analyzers.Tests используйте для тестов
Текста для анализатора:
public const string DiagnosticId = "AB0001";
private static readonly LocalizableString Title = new LocalizableResourceString(
nameof(Resources.AB0001Title),
Resources.ResourceManager,
typeof(Resources));
private static readonly LocalizableString MessageFormat =
new LocalizableResourceString(
nameof(Resources.AB0001MessageFormat),
Resources.ResourceManager,
typeof(Resources));
private static readonly LocalizableString Description =
new LocalizableResourceString(
nameof(Resources.AB0001Description),
Resources.ResourceManager,
typeof(Resources));
private const string Category = "Naming";
private static readonly DiagnosticDescriptor Rule = new(
DiagnosticId,
Title,
MessageFormat,
Category,
DiagnosticSeverity.Warning,
isEnabledByDefault: true,
description: Description);