Подписка

05 апреля 2011

Практика "говнокода"

Наткнулся сегодня вот на этот пост на Хабре. Делать было нечего (ну да, хорошо, делать было что, но лень как всегда), и я решил поупражняться в решении простой задачи. Сначала пишу первое решение что пришло в голову, затем пытаюсь его уместить в одну строку.
Условия задачи:
Напечатать на экране следующее:
1
2-1
1-2-3
4-3-2-1
1-2-3-4-5
6-5-4-3-2-1
(Естественно, вместо 6 может быть любое число).

Итак первое решение:
int MAX = 6;
for(int i = 1; i <= MAX; i++)
{
    if(i % 2 == 0)
        for(int j = i; j > 1; j--)
            if (j != 1)
             Console.Write(j.ToString() + "-");
            else
             Console.Write(j.ToString() + Environment.NewLine);
    else
        for(int k = 1; k <= i; k++)
            if (k != i)
             Console.Write(k.ToString() + "-");
            else
             Console.Write(k.ToString() + Environment.NewLine);
}
Затем попытался топорно свернуть его. Пришлось подумать. Вспомнил про Enumerable.Range.
int MAX = 6;
for (int i = 1; i <= MAX; i++) ((i % 2 == 0) ? Enumerable.Range(1, i).
Reverse().ToList() : Enumerable.Range(1, i).ToList()).ForEach(n => 
{ if (i % 2 == 0) if (n != 1) Console.Write(n.ToString() + "-"); else 
Console.Write(n.ToString() + Environment.NewLine); else if (n != i) 
Console.Write(n.ToString() + "-"); else Console.Write(n.ToString() + 
Environment.NewLine); });
Все это в одну строку (кроме int MAX = 6). Затем вспомнил про string.Join.
Финальная версия:
int MAX = 6;
for (int i = 1; i <= MAX; i++) Console.WriteLine(string.Join<int>(@"-", (i % 2 == 0) ? Enumerable.Range(1, i).Reverse() : Enumerable.Range(1, i)));

Комментариев нет:

Отправить комментарий