Pull to refresh

Comments 23

В задаче CaseInComparison ошибка — забыли ToUpper() для b в коде string.Compare(a.ToUpper(), b).

И маленькая хотелка — нет ровно никакого смысла делать перегрузку страницы по нажатию «решение» в онлайн версии, можно просто скрывать/показывать элемент. Сейчас постоянные перегрузки раздражают.

Edit: как-то пропустил, что онлайн версия сгенерена автоматом. Имхо, очень просто написать свою, более удобную для подобного контента.
Спасибо за замечание — поправил.

Хотелка очень разумная. Не подскажете, как это на базе GitBook реализовать?
Свою генерилку написать можно, но несколько подкупает готова инфраструктура GitBook — автоматическая генерация на базе репозитория, версии для читалок, удобный доступ и всякие статистики. Быть может потом перейду на собственную генерацию, но для старта это был самый простой вариант.
Очень интересные задачи из раздела LINQ, почерпнул для себя новые идеи, буду их использовать.
У меня тоже накопилось множество задачек, но я их предпочитаю выкладывать в «интерактивном» виде. Пользователь читает условие задачи, пишет программу для её решения. Система её компилирует и прогоняет по тестам. Если набрал больше 50% — можешь переходить к следующей задаче. Не знаешь как решить — смотри видео-решение. Я разрабатывал и применял эту систему в пту, так вот школьникам очень нравится такой интерактив, дети решали задачи даже на чужих уроках. Сейчас в базе 128 задач: videosharp.info/console.
Посмотрел ваш сайт, достаточно интересно. Но у нас с вами немного разные направления. Практически для всех заданий из моего задачника достаточно просто запустить код, чтобы узнать ответ. Поэтому интерактив-то особо не требуется. И целевая аудитория — не школьники, которых нужно мотивировать, а разработчики, которые сами хотят разобраться детальней в особенностях платформы.
CorruptedString можно решить по-другому:
Console.SetCursorPosition(0, Console.CursorTop -1);
Console.WriteLine(«aaaaa»);
В задании подразумевается, что пользовательский код находится до строчки
Console.WriteLine("Hello");
Вопросики намекают на это, но я распишу задание чуть подробней.
Но тогда все еще проще:
Console.WriteLine(«aaaaa»);
return;
А если вы находитесь не в void-функции? Но направление ваших мыслей я понял, передалю задание так, чтобы подобные фокусы не считались.
Предлагаю еще задачи.

Что будет, если в Delegate.Target попадет объект значимого типа?

Классическая задача про значимый Enumerator списка
var list = new List {1, 2, 3};
while(list.GetEnumerator().MoveNext())
Console.WriteLine(list.GetEnumerator().Current);

Спасибо за мысль про делегаты. Подумываю сделать отдельную главу про делегаты и события.

А про Enumerator вопрос у меня есть: ValueTypes/Enumerator.
Это вам спасибо. Узнал, что раньше строковый массив StringBuilder копировался при вызове ToString. Может раньше и StringBuilder.Append был отдельный для StringBuilder. Я как раз об этом писал в своем блоге недавно.
Заметил еще, что не хватает задач на внимательность. Типа
var str = «1234qwer»;
str.Repalce(«1234», «rewq»);
Console.WriteLine(str);
Опять же задача про неизменяемость строк.
Хм… Надо подумать… Задачек на внимательность по программированию и так в этом мире хватает. Мне бы хотелось сделать такой задачник, в котором каждая задачка могла бы чему-то научить. Какой-то особенности платформы или нюансам транслирования C# в IL. Задачки «на внимательность» можно придумывать пачками, но я не уверен, что ими стоит наполнять конкретно эту книжку.
Всё просто
foreach раскрывается в следующий код: (условно)
var e = Foo().GetEnumerator();
while (e.MoveNext())
    Console.Write(e.Current);

State Machine в Foo раскрывается в следующий код GetEnumerator: (условно)
return new StateMachine { State = -1 };

И в следующий код MoveNext:
switch (this.State)
{
    case -1:
        this.State = 0;
        this.Current = 1; // трансформация из yield return 1;
        return true;
    case 0:
        Console.WriteLine("Foo"); // трансформация из аналогично кода
        this.State = 1;
        return false;
    default:
        return false;
}

Кстати про делегаты, есть вот такая задачка:
private delegate void Test(string text);
private void Test1(string text)
{
	Console.WriteLine("Test1 prints" + text);
}
private void Test2(string text)
{
	Console.WriteLine("Test2 prints" + text);
}

void Main()
{
	const string text = "test";
	var op = Test2 - (Test2 + new Test(Test1));
	op(text);
}

Самая первая ссылка в посте (с www) отдает 404.
Спасибо за замечание, поправил.
Всё починил.
Система ссылок несколько раз менялась, в паре мест забыл проставить новые варианты.
Задача 3: «ValueTypes:Enumerator» в ответах:
фразу "А значит, при каждом обращении к методу
x.Items.MoveNext() мы будем работать не с оригинальным енумератором, а с его
копией..."
сразу и не понял. Я Долго пытался выяснить -> к чему иметь оригинальный экземпляр Enumerator?
Пока не дошел, что код var var x = new { Items = ....} это кортеж с неизменяемыми полями.
И оказывается что речь идет о том, что при вызове x.Items.MoveNext() происходит создание временного экземпляра структуры(точнее копирование полей в анонимную область в стеке являющую собой структуру Enumerator), у которой и вызывается MoveNext(), у которой успешно изменяется состояние(позиционируется на первый элемент), но дальше она не используется, символьной ссылки на нее нет.
И каждый раз в начале цикла одна и та же область в стеке заново переписывается readonly экземпляром от x.Items, сбрасываясь тем самым.
Написал сюда, может кому-то поможет быстрее понять эту задачу.
Sign up to leave a comment.

Articles