1. Куча / Говнокод #10330

    +119

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    s f g x = f x (g x)
    k x y   = x
    b f g x = f (g x)
    c f g x = f x g
    y f     = f (y f)
    cond p f g x = if p x then f x else g x
    fac  = y (b (cond ((==) 0) (k 1)) (b (s (*)) (c b pred)))

    Запостил: HaskellGovno, 20 Мая 2012

    Комментарии (32) RSS

    • Подсчёт факториала без введения параметра факториала. (То есть функция факториала возвращает функцию для подсчёта факториала).
      Ответить
      • >Подсчёт факториала без введения параметра факториала.
        Когда-то на С видел такое. ЧСХ кода было меньше.
        Ответить
        • > кода было меньше
          Сударь, позвольте: тут хаскель-то использется как псевдо-язык для определения комбинаторов, более идиоматчино было бы, например:
          import Control.Monad.Fix
          
          fac = fix $ \ f n -> if n == 0 then 1 else n * f (n - 1)
          Ответить
      • Примерно так:
        http://ideone.com/TsUN5
        Ответить
        • Хм, ну тогда уж замутить функцию без аргументов, которая просто вернет функцию вычисления факториала. Это ближе к топику.

          // эту функцию мы никому не дадим
          static int function fac_private(int n) {
            int res = 1, i;
            for (i=2; i<=n; i++) res *= i;
            return res;
          }
          // а эта доступна
          (int (*)(int)) fac() { return fac_private; }
          
          fac()(5);
          Ответить
          • Вся фишка в том, что аргументы функции для подсчета не используются (unused).
            Ответить
            • _AddressOfReturnAddress это майкрософтизм. Да и немного смущает "результат: Ошибка выполнения время: 0.02s память: 1720 kB сигнал: -1 ".
              Вердикт - не труъ.
              Ответить
              • >_AddressOfReturnAddress это майкрософтизм
                >Вердикт - не труъ.
                Кто бы спорил. Сначала же сказал, что "видел" - следовательно сей говнохак не мой.
                Я кстати нашел тот тред:
                http://govnokod.ru/5561
                Ответить
    • Но зачем?
      Ответить
      • Посоны во дворе сказали, что это круто. Все эти возможности в хаскеле нужны как раз, чтобы повыпендриваться. Подозреваю, что хаскел был создан как раз для этого.
        Ответить
        • Это могло бы быть круто, если код был бы за авторством тс,
          на что посимвольное совпадение с http://www.willamette.edu/~fruehr/haskell/evolution.html уж никак не намекает.

          Этот боян чуть ли не 3 раза на том же лоре появлялся, и в контексте всей заметки смотрится как (само)ирония. А здесь - как вброс.
          Ответить
          • На говнокоде этого говнокода ещё не было.
            Ответить
            • Какая у тебя мотивация-то? Может лучше прочитать, скажем, http://learnyouahaskell.com/chapters ? (вроде был и русский перевод, но за монетку).
              Ответить
    • Факториал на Y комбинаторе?
      Ответить
    • А, через Y-кокомбинатор?
      Ответить
    • Кстати cond, == и * тут не рулят. Нужно было юзать вместо них нумералы Чёрча:
      true x y = x
      false x y = y
      0 x y = x
      1 x y = y x
      2 x y = y (y x)
      ...
      Ответить
    • Можно использовать Хаскел для обфускации программ или как естественная матан-защита кода от быдлокодеров, клинических идиотов пользователей других быдло языков.
      Ответить
      • Нельзя, потому что в IO монаде на нем можно писать как на фортране :)

        А настоящий индус никогда не будет читать код предшественника, он просто будет прикручивать к нему свои велосипеды и костыли.
        Ответить
      • Мне почему-то померещилось в тексте слово "капча". А что, хорошая идея...
        Ответить
        • На говнокоде нужно добавить Хаскел-Капчу. Притом чтобы не сменялась, пока правильно не ответишь.
          Ответить
          • Нет, лучше генерить рандомную каждый раз. Чтобы не повторялась и не списывали.
            Ответить
          • Можно пример?
            Ответить
            • [color=grey][Cмеха ради][/color] написать [1,1,1,1,1,1,1,1,1,1] не длиннее, чем 12 символов.
              [0..9]>>[1] или 1<$[0..9]
              Ответить
              • > не длиннее, чем 12 символов
                > 1<$[0..9]
                Это только если не считать
                import Control.Applicative
                Если бы мне такая хрень понадобилась, я бы написал
                take 10 [1,1..]
                Но тут 15 символов
                Ответить
                • Но первый-то вариант подходит? :Р
                  А если для людей - лучше сразу replicate 10 1.
                  Ответить
                • А можно что-нибудь поинтереснее, например однострочник для:
                  http://vimgolf.com/challenges/4d6f45b938c0aa691b000003
                  Правда vim обогнать не получилось.
                  Ответить
              • Первым делом подумал написать replicate 10 1, но потом понял, что тогда на говнокод со своим знанием Хаскела не прошел бы. 14 символов. :(
                Ответить
                • А нефиг эзотерическую, даешь матан-капчу! Не осилил матан - идешь на метан.
                  Ответить
              • Что означает в хахахаскеле доллар и битовый сдвиг вправо?
                Ответить
                • Это означает "замапь константу слева на функтор справа".
                  В нашем случае получается тоже самое, что
                  map (\x -> 1) [0..9] -- или
                  const 1 `map` [0..9]
                  только <$ работает с любыми функторами: деревьями, Maybe и т.п.
                  Ответить
          • C++ капча может быть не менее увлекательной:
            http://stackoverflow.com/questions/9515327/default-constructors-initialization-of-pod-and-implicit-type-conversions-in-c
            Ответить

    Добавить комментарий