1. Haskell / Говнокод #29167

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    (defun foo (baz s a)
      (let ((ref #'foo))
        (defun foo (baz s a)
          (let ((ref #'foo))
            (if (zerop a)
              s
              (funcall baz ref s a))))
        
        (if (functionp baz)
          (funcall baz ref (1+ s) (1- a))
          (funcall #'foo ref (1+ s) (1- a)))))

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

    Запостил: lisp-worst-code, 08 Августа 2025

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

    • g: Определение единицы от Николы Бурбаки
      Ответить
      • Да, помню. Примерно так: единица — это количество элементов во множестве, которое состоит из единственного элемента. Т. е. берём произвольный объект, оборачиваем его во множество и считаем количество элементов в получившемся множестве.

        *****

        В данном же примере используются два факта:
        1. s + a ≡ (s+1) + (a-1).
        2. s + 0 ≡ s.
        При этом инкремент и декремент (на единицу) считаются вполне определёнными операциями.

        Только это всё ещё запутано переопределением функции foo дважды.

        Предлагаю пойти дальше и определить умножение, используя два факта:

        1. p * a ≡ p + p * (a-1).
        2. p * 1 ≡ p.

        Сложение, естественно, вычислять функцией из данного говнокода, чтобы получить квадратичную сложность.
        Ответить
        • Варианты:

          p * a ≡ (p << 1) * (a >> 1) + p * (a % 2).

          p * a ≡ (p+1) * (a-1) + (p-a) + 1. Здесь придётся определить вычитание.
          Ответить
        • Перевёл на «C++».
          #include <iostream>
          
          template<auto A>
          concept non_negative= A >= 0;
          
          template<auto A, auto B> requires non_negative<A> && non_negative<B>
          struct adder
          {
              constexpr auto operator()() const {
                  return adder<A + 1, B - 1>{}();
              }
          };
          
          template<auto A>
          struct adder<A, 0>
          {
              constexpr auto operator()() const {
                  return A;
              }
          };
          
          int main()
          {
              std::cout << adder<12, 30>{}() << std::endl;
              return EXIT_SUCCESS;
          }
          Ответить
          • >requires

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

            Ну чтж, похвально, похвально.

            А в языках для анскилябрных петухов (пхп, джава -- это тот же пхп, только тормозит) принято сообщать об ошибке в рантоайме, и показывать ее пользователю

            пусть пользователь разбирается!
            Ответить
            • В 2025 году стандартизаторы добавили 65 новых ключевых слов?
              Ответить
              • Да, кстати, раньше же в крестах были сплошные &amp;&amp;&lt;&gt;||[]{}, а тут слова появились.
                Ответить
    • Мне кажется, вот ЭТО уже не переплюнуть:

      https://github.com/Herzult/SimplePHPEasyPlus

      Такой-то запах Индонезии...
      Ответить
      • Пых это такой пост-модерн: хуевая пародия на ЯЖУ которая сама по себе хуевая пародия на ООП.

        Искуство это палимпсест
        Один посрет -- другой поест
        Ответить
        • Зато оцени, как расширяемо:
          use SimplePHPEasyPlus\Number\NumberCollection;
          use SimplePHPEasyPlus\Number\SimpleNumber;
          use SimplePHPEasyPlus\Number\CollectionItemNumberProxy;
          use SimplePHPEasyPlus\Parser\SimpleNumberStringParser;
          use SimplePHPEasyPlus\Iterator\CallbackIterator;
          use SimplePHPEasyPlus\Operator\AdditionOperator;
          use SimplePHPEasyPlus\Operation\ArithmeticOperation;
          use SimplePHPEasyPlus\Operation\OperationStream;
          use SimplePHPEasyPlus\Engine;
          use SimplePHPEasyPlus\Calcul\Calcul;
          use SimplePHPEasyPlus\Calcul\CalculRunner;
          
          
          $numberCollection = new NumberCollection();
          
          $numberParser = new SimpleNumberStringParser();
          
          $firstParsedNumber = $numberParser-&gt;parse('1');
          $firstNumber = new SimpleNumber($firstParsedNumber);
          $firstNumberProxy = new CollectionItemNumberProxy($firstNumber);
          
          $numberCollection-&gt;add($firstNumberProxy);
          
          $secondParsedNumber = $numberParser-&gt;parse('1');
          $secondNumber = new SimpleNumber($secondParsedNumber);
          $secondNumberProxy = new CollectionItemNumberProxy($secondNumber);
          
          $numberCollection-&gt;add($secondNumberProxy);
          
          $addition = new AdditionOperator('SimplePHPEasyPlus\Number\SimpleNumber');
          
          $operation = new ArithmeticOperation($addition);
          
          $engine = new Engine($operation);
          
          $calcul = new Calcul($engine, $numberCollection);
          
          $runner = new CalculRunner();
          
          $runner-&gt;run($calcul);
          
          $result = $calcul-&gt;getResult();
          $numericResult = $result-&gt;getValue(); // 2


          Можно расширить для других систем счисления, для других пространств и даже не только для чисел. Только нужные классы-делегаты подставить.
          Ответить
    • Можно реализовать сложение столбиком для строкового десятичного представления. Точно скучно не будет.
      Ответить
    • Ещё можно так (для вещественных чисел): a + b = log(exp(a) * exp(b)).
      Ответить
    • Бзззз! Не умею писать на Лиспе, но вызов принимаю:

      https://govnokod.ru/29168
      Ответить
    • Петузы, хотите загадку?

      Я прибайндился к `INADDR_LOOPBACK`, а затем к `INADDR_ANY`
      Что произойдет?
      Ответить
      • А ничего не будет, занят уже адрес.
        Ответить
        • Правильный ответ het hangt af van.

          на виньсоке семантика такая
          >
          If an application does not care what local address is assigned, specify the constant value INADDR_ANY
          >
          https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-bind

          и ты не порвешь, но INADDR_ANY набиндится на ВСЕ адреса КРОМЕ лупбочного интерфейса

          Вот буквально
          c:\>netstat -nao  | findstr 50007
            TCP    0.0.0.0:50007          0.0.0.0:0              LISTENING       32048
            TCP    127.0.0.1:50007        0.0.0.0:0              LISTENING       25952



          grapig, he?
          Ответить
    • Зев акулы, волчий клык,
      Ночью сорванный мутник,
      Плоть сушеная колдуньи,
      Тис, наломанный в безлунье,
      Желчь козленка, селезенка
      Богомерзкого жидeнка,
      С чешуей драконья лапа,
      Губы турка, нос арапа,
      Пальчик детки удушенной,
      Под плетнем на свет рожденной,
      Тигра потрох размельченный —
      Вот в котел заправа наша,
      Чтобы гуще вышла каша..
      Ответить
    • https://www.govnokod.ru/29169
      Ответить

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