- PVSM.RU - https://www.pvsm.ru -
Привет!
В начале лета многие крупные компании проводят стажировки для студентов последних курсов и выпускников технических специальностей. Мне посчастливилось попасть в ряды таких молодых специалистов в компанию СКБ Контур. Наше знакомство с миром разработки программного обеспечения началось с мероприятия под кодовым названием “Креш-курс” — четырехдневная интенсивная выездная школа. Было много всего интересного, увлекательного и познавательного, но об одном из наших особых развлечений хочется рассказать подробнее. Итак, сегодня у нас Code Retreat!
Прежде всего, о формате Code Retreat. Это встреча разработчиков, состоящая из нескольких сессий программирования, удовлетворяющих простым правилам:
На первый взгляд мероприятие может показаться мягко говоря странным, с непривычными, некомфортными и нереалистичными правилами. Но стоит в нем поучаствовать и мнение кардинально меняется!
На креш-курсе я узнал о Code Retreat впервые и, как оказалось впоследствии, не только я один. А началось все с безобидной первой итерации, где нам предложили реализовать игру «Жизнь». Мы расселись по парам, таймер был запущен и…
Ограничения:
Надо сказать, что у большинства через отведенный промежуток времени было готово решение и оно работало. Затем было 10 минут перерыва на кофе с печеньками, жонглирование(?!) и полное удаление написанного кода! Кроме того, смена пар.
Ограничения:
По окончании стандартная операция с удалением написанного кода и поеданием печенек =) И, конечно, смена пар!
Ограничения:
На этой итерации стало гораздо веселее! Но впереди маячила заключительная, четвертая итерация! А сначала, как вы уже догадались, удаление кода и смена пар!
Ограничения:
Честно сказать, заключительная итерация у большинства продлилась гораздо дольше 45 минут, так как всем хотелось получить работающую программу. И никто не не хотел сдаваться еще долгое время =)
Два слова: это нечто! Трудно передать все эмоции от произошедшего в нескольких абзацах. Ситуация накалялась тем, что мы не знали какие будут ограничения в следующий раз и на первой итерации даже не представляли, что получится в конце. Понравилось всем! Отзывы, которыми делились стажеры между собой, только положительные. Настоятельно рекомендую всем, у кого есть возможность, устроить что-то подобное.
Какую же пользу приносит Code Retreat? На самом деле тут можно долго перечислять все его достоинства, но стоит сказать об основных.
Креш-курс закончился, я описал только одно из многочисленных развлечений, ну а стажировка [1] в Контуре в самом разгаре! Всем удачи!
Спасибо за внимание! =) И обязательно попробуйте, можете отписаться о своих впечатлениях в комментариях.
Авторы кода ниже Denxc [2] и Sleipnir [3]
/*
Ограничения:
1. Нет переменных.
2. Нет циклов.
3. Нет условных операторов.
4. Длина любого метода не превышает 3-х строк.
5. Длина кода класса Game не превышает 60 строк.
*/
class Game
{
private HashSet<Point> aliveCells;
private IEnumerable<Point> movingVectors = new List<Point>()
{
new Point(-1, -1), new Point(-1, 0), new Point(-1, 1),
new Point(0, -1), new Point(0, 1),
new Point(1, -1), new Point(1, 0), new Point(1, 1)
};
public Game(IEnumerable<Point> initCells)
{
aliveCells = new HashSet<Point>(initCells);
}
public Game MakeStep()
{
return new Game(aliveCells.SelectMany(Neighbours).Where(ShouldAlive));
}
public void Show()
{
Console.Clear();
aliveCells.Where(c => c.X >= 0 && c.Y >= 0 && c.X < Console.WindowWidth && c.Y < Console.WindowHeight)
.Select(PrintPoint).ToArray();
}
public bool PrintPoint(Point cell)
{
Console.SetCursorPosition(cell.X, cell.Y);
Console.Write('*');
return true;
}
public IEnumerable<Point> Neighbours(Point cell)
{
return movingVectors.Select(c => new Point(c.X + cell.X, c.Y + cell.Y));
}
public bool ShouldAlive(Point cell)
{
var aliveNeighboursCount = Neighbours(cell).Count(aliveCells.Contains);
return aliveNeighboursCount == 3 || aliveNeighboursCount == 2 && aliveCells.Contains(cell);
}
}
//А вот как это можно использовать:
public static void Run(Game game)
{
game.Show();
Thread.Sleep(40);
Run(game.MakeStep());
}
Run(new Game(new HashSet<Point>()
{
new Point(21, 23), new Point(21,21), new Point(21,22),
new Point(22, 21), new Point(20, 22)
}
)
);
Скачать исходники, исполняемый файл и увидеть результат можно тут [4].
Автор: Denxc
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/39282
Ссылки в тексте:
[1] стажировка: http://kontur.ru/education/programs/intern
[2] Denxc: http://habrahabr.ru/users/denxc/
[3] Sleipnir: http://habrahabr.ru/users/sleipnir/
[4] тут: https://github.com/SleipnirFr/GameOfLife
[5] Источник: http://habrahabr.ru/post/187448/
Нажмите здесь для печати.