Обновить
54

Пользователь

42
Подписчики
Отправить сообщение
Решение уровней 04.* на три кирпича:

Теперь наконец добрался до того, что еще не решено, так-что решаю в реальном времени.

Осторожно, спойлер!
04.01
    public static bool Puzzle(bool x, bool y) {
        return x || y;
    }


04.02
    public static bool Puzzle(bool x, bool y) {
        return x && y;
    }


04.03
    public static bool Puzzle(int x) {
         return x < 50;
    }


04.04
    public static bool Puzzle(int x, int y) {
        return x < y;
    }


04.05
    public static int Puzzle(int i) {
        return (i == 0)? 0: Math.Abs(i)/i;
    }


04.06
    public static bool Puzzle(int i, int j) {
        return true;
    }


Необъяснимо, но у меня прошел такой код.

Второй раз тесты поменялись и прошел другой код:
    public static bool Puzzle(int i, int j) {
        return false;
    }


Если у кого-нибудь есть мысли по этому поводу, буду рад их послушать.

04.07
    public static int Puzzle(int i) {
        return (i < 100)? 2: 3;
    }


04.08
    public static string Puzzle(int i) {
        return (i % 2 == 0)? "even": "odd";
    }


04.09
    public static string Puzzle(int i) {
        return ((i % 5 == 0)? "": "not a ") + "multiple of 5";
    }


04.10
    public static string Puzzle(int i, int x) {
        return ((i % x == 0)? "": "not a ") + ("multiple of " + x);
    }


04.11
    public static string Puzzle(int i, int j, int k) {
        if (i / (double)j == j / (double)k && (i!=j)) return "yes!";
        return "no";
    }


04.12
    public static int Puzzle(int i) {
        if (i < 8) return 0;
        if (i < 15) return 7;
        return 21;
    }


Да. Этот вариант лучше.
Решение уровней 03.* на три кирпича:
Осторожно, спойлер!
03.01
Никакой код не дал 3 кирпича.

    public static int Puzzle(int number, int power) {
         return (int)Math.Pow(number, power);
    }

не проходит опять-же из-за плохих тестов.

Простой цикл дает 2 кирпича.

Как и такой изврат:
    public static int Puzzle(int number, int power) {
         return Enumerable
               .Range(0, power)
               .Select(x => number)
               .Aggregate(1, (i, j) => i*j);
    }


За решение буду признателен.

03.02
    public static int Puzzle(int i) {
        return (i == 0)? 1: i * Puzzle(i-1);
    }


03.03
    public static int Puzzle(int lowerBound, int upperBound) {
        int product = 1;
        for (int i = lowerBound; i <= upperBound; ++i) {
            product *= i;
        }
        return product;
    }


Можно и Linq.

03.04
    public static int Puzzle(int n) {
        return (n <= 0)? 0: (n+1) / 2 * ((n + 1) / 2 - 1);
    }


03.05
    public static int Puzzle(int n) {
        return n*(n+1)*(n+2)/6;
    }


03.06
    public static string Puzzle(string word) {
        return string.Join(" ", (new string('_', word.Length)).AsEnumerable());
    }


03.07
    public static string Puzzle(string s) {
        return string.Join("", 
            s.Select(
                c => (char)((c > 117)? (c - 21): (c + 5))
            )
        );
    }


Код ужасный, но ради кирпичей и не такое напишешь.

03.08
    public static int Puzzle(int x) {
        string s = "";
        s += x;
        return s.Length;
    }


Да. Спасибо. Писал методом Copy-Paste, чтобы не набирать 13 раз теги, ошибки не заставили себя ждать.
Решение уровней 02.* на три кирпича:
Осторожно, спойлер!
02.01
    public static int[] Puzzle(int n) {
        return Enumerable.Range(0, n).ToArray();
    }


02.02
    public static int[] Puzzle(int n) {
        return Enumerable.Range(0, n).Select(x => x * n).ToArray();
    }


02.03
    public static int[] Puzzle(int n) {
        return Enumerable.Range(0, n).Select(x => x * x).ToArray();
    }


02.04
    public static int Puzzle(int[] v) {
        int sum = 0;
        foreach (int e in v) {
            sum += e;
        }
        return sum;
    }


Удивительно, но более простой и правильный
    public static int Puzzle(int[] v) {
        return v.Sum();
    }

не проходит из-за ужасно подобранных тестов.

02.05
    public static int Puzzle(int n) {
        return (n-1)*(n)*(2*n-1)/6;
    }


02.06
    public static int Puzzle(string s) {
        return (new Regex("[^a]")).Replace(s, "").Length;
    }


Опять-же, лучший код
    public static int Puzzle(string s) {
        return s.Count(c => 'a' == c);
    }

дает всего 2 кирпича.

02.07
    public static int Puzzle(string s, char x) {
        Regex rx = new Regex("[^" + x + "]");
        return rx.Replace(s, "").Length;
    }


И снова, код получше
public static int Puzzle(string s, char x) {
    return s.Count(c => x == c);
}

всего 2 кирпича. Может MS накладывает штраф за использование Linq?

Решение уровней 01.* на три кирпича:
Осторожно, спойлер!
01.01
    public static int Puzzle(int x) {
        return -x;
    }


01.02
    public static int Puzzle(int x) {
        return -x;
    }


01.03
    public static int Puzzle(int x) {
        return x*x;
    }


01.04
    public static int Puzzle(int x) {
        return x*3;
    }


01.05
    public static int Puzzle(int x) {
        return x/3;
    }


01.06
    public static int Puzzle(int x) {
        return 4/x;
    }


01.07
    public static int Puzzle(int x, int y) {
        return x-y;
    }


01.08
    public static int Puzzle(int x, int y) {
        return x+2*y;
    }


01.09
    public static int Puzzle(int x, int y) {
        return x*y;
    }


01.10
    public static int Puzzle(int x, int y) {
        return x + y/3;
    }


01.11
    public static int Puzzle(int x, int y) {
        return x / y;
    }


01.12
    public static int Puzzle(int x, int y) {
        return x / y;
    }


01.13
    public static int Puzzle(int x) {
	return (x % 3 + 1);
    }


01.14
    public static int Puzzle(int x) {
	return 10 % x;
    }


01.15
    public static int Puzzle(int x, int y, int z) {
        return (x+y+z)/3;
    }


По многим числовым задачам помогает найти ответ сервис поиска последовательностей скажем oeis.org/

Например задачу 03.05 я решил так: получил два ответа (6 -> 56, 7-> 84), вбил в поиск, нашел последовательность oeis.org/A000292 применил любезно предоставленную мне формулу и получил 3 кирпичика.

И так получилось решить не одну числовую задачу.
Переключение раскладки на Caps Lock это очень здорово, особенно для тех кто часто переключается между двумя раскладками.

Плюс в linux-системе у меня к этому дополнительный бонус — индикатор Caps Lock'а показывает раскладку — горит — русская, не горит — английская.
Ладно бы сказали — NTFS больше не поддерживается, вместо IE по-умолчанию будет Firefox (а еще лучше Chrome), разрешено установить любую из 10 доступных DE, возможно запускать приложения под MacOS через Mine (гипотетический Wine для MacOS приложений), из-коробки включен эмулятор терминала с bash'ем и наконец-то можно забить переключение раскладки на Caps Lock!

Почему таких изменений нет и почему из-за них никто не переживает?

Важно лишь как в следующей версии Windows будет себя вести кнопка пуск.
Я думал об этом, но если вы посмотрите, то статья итак довольно длинная, у меня был небольшой выбор — либо больше ловушек, но покороче, либо больше информации о каждой ловушке, но ловушек меньше.

Я выбрал что-то среднее и в конечном итоге, последнюю запланированную ловушку даже пришлось убрать.
Мой опыт мне показывает, что как раз главное в коде — читаемость и поддерживаемость (при условии его работоспособности)

Вот вы и сами написали, что главное — работоспособность. Нерабочий чистый код никому не нужен. А рабочий грязный — нужен.

Поиск недостатков в любом коде

Иногда, согласитесь, нужно мириться с недостатками, особенно, если код чужой, тем более, что кажется одному хорошо, другому — недостатком (как пример я работаю в паре с одним программистом, ему кажется, что мутабельные объекты это нормально, а мне кажется, что это недостаток (когда можно без них)).

Неидеальный, но близкий к идеальному код можно написать за разумное время.

Значит идеальный нельзя таки.

Я понимаю, что автор подразумевает посвящение избыточного кол-ва времени на всё это, но перфекционизм не так плох, если это выражается в высоких требованиях к качеству кода


Да, Вы меня правильно поняли.

Спасибо за Ваше мнение, я обязательно учту Ваши пожелания при написании следующей статьи.
Ах, ну что Вы так серьезно. Разрешаю даже без указания авторства.
88 — это очень хорошо. Если учесть что в статье ~3200 слов, то «вы» встречается с частотой в 0.0275%.
И 15 из них можно вычесть, т.к. они часть шаблонной фразы «Признаки того, что вы в ловушке».

Ну а если серьезно, спасибо за замечание. Проанализирую ситуацию, если это плохо, буду исправляться.
Да все верно. Вы не верите, что О(n^2) сведет на нет все старания, но в тоже время не оставите такую «преждевременную» оптимизацию на потом.
Тут ключевые слова — «сделают из программы конфетку».

Никто не спорит, что сложность алгоритмов очень важна и я согласен с Вами, насчет О(n) против O(n^2).

Но это не самое главное в программировании. И использовать лучшие алгоритмы недостаточно для написания хорошего продукта.
Нет, к сожалению на английском я пишу плохо (хуже чем на русском).

Не буду против если кто-нибудь захочет перевести и опубликовать версию на любом другом языке.
По-секрету (только тссс!) скажу, что в черновом варианте статьи была ловушка №9 — гордость.
Вы, возможно в ловушке защитного программирования.

А может и нет. Признаки того, что вы в ловушке созданы для того, чтобы подумать, не доходите ли вы до крайности. Если нет — все хорошо, независимо от того, тестируете ли вы встроенную функцию max или нет.
И не забыть вакцины от перфекционизма!

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность