1. JavaScript / Говнокод #27955

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    namespace Generics {
    
        function swap<T>(arr: T[], i: number, j: number): void {
            let temp: T = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    
        function sortHelper<T>(arr: T[], callbackfn?: (value1: T, value2: T) => number): T[] {
            if (arr.length <= 0 || !callbackfn) {
                return arr;
            }
            let len = arr.length;
            // simple selection sort.
            for (let i = 0; i < len - 1; ++i) {
                for (let j = i + 1; j < len; ++j) {
                    if (callbackfn(arr[i], arr[j]) > 0) {
                        swap(arr, i, j);
                    }
                }
            }
            return arr;
        }
    
        export function arraySort<T>(arr: T[], callbackfn?: (value1: T, value2: T) => number): T[] {
            return sortHelper(arr, callbackfn);
        }
    }
    
    function main() {
        print("testGenerics")
        let inArray = [4.0, 3.0, 4593.0, 23.0, 43.0, -1.0]
        Generics.arraySort(inArray, (x: number, y: number) => { return x - y })
        let expectedArray = [-1.0, 3.0, 4.0, 23.0, 43.0, 4593.0]
        for (let i = 0; i < expectedArray.length; i++) {
            assert(inArray[i] == expectedArray[i])
        }
    }

    ну вот и все.. можно считать последний говнокод... подходит миссия к концу.... и ... потом заархивить все и положить на полочку

    Запостил: ASD_77, 15 Января 2022

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

    • походу закончились говнокоды... "плак плак"... а сколько было фана...
      Ответить
      • а рекурсивные типы есть?
        а типы на строковых литералах?
        Ответить
        • вы наверно тут новенький и вам обломно пролистать все мои говнокоды :)?
          Ответить
        • https://govnokod.xyz/_27929/
          https://govnokod.xyz/_27913/
          Ответить
    • ну что вас впечатляют возможности моего компилятора? завидуйте с/c++ и не забудьте правильно [* & std::unique_t std::shared_t] херни понаставить ...
      Ответить
    • А чо так? Слился?
      Ответить
    • > function swap
      Какое-то говно, которое почему-то нужно объявлять вручную

      > function arraySort
      Какое-то говно, которого нет из коробки

      У меня в «С++» столько говна вручную писать не надо:
      #include <cassert>
      #include <algorithm>
      #include <vector>
      
      int main()
      {
          std::vector inArray {4.0, 3.0, 4593.0, 23.0, 43.0, -1.0};
          std::ranges::sort(inArray);
          auto expectedArray = {-1.0, 3.0, 4.0, 23.0, 43.0, 4593.0};
          assert( std::ranges::mismatch(inArray, expectedArray).in1 == inArray.end() );
      }
      Ответить
      • и не забудь xxxx "::" xxxx "::" xxxx "::" xxxx "::" xxxx "::" раставить а то как-то нечитаемо получается
        Ответить
      • в твоем говносорте нельзя указать критерий сортировки
        Ответить
        • схуяли? Also: Расставил:
          #include <cassert>
          #include <algorithm>
          #include <vector>
          
          int main()
          {
              using std::vector;
              using namespace std::ranges;
              vector inArray = {4.0, 3.0, 4593.0, 23.0, 43.0, -1.0};
              sort(inArray, greater{});
              auto expectedArray = {-1.0, 3.0, 4.0, 23.0, 43.0, 4593.0};
              assert( mismatch(inArray, expectedArray).in1 == inArray.end() );
          }
          Ответить
        • А ты в своем тупоскрипте можешь формально доказать, что сортировка действительно сортирует, а не делает какую-то хуйню?

          > Generics.arraySort(inArray, (x: number, y: number) => { return x - y })

          Вот например, что если тут какое-нибудь NaN будет? Или твоя сортировка только на массивах без NaN работает?
          Ответить
          • Чтоб сортировка через сравнения нормально работала, надо чтоб это сравнение отвечало определенным критериям, скажем вот есть у тебя функция
            bool cmp(double a, double b)
            {
              return a < b;
            }


            и надо чтоб было верно, что если есть три каких-то значения, "a, b, c" и при этом "cmp(a,b) == false" и "cmp(b, c) == false" то тогда верно и "cmp(a, c) == false" должно быть. А теперь представим себе, что a = 1.0, b = NaN, c = 2.0
            Что получится? (1.0 < NaN) это false, (NaN < 2.0) это false, но при этом (1.0 < 2.0) это true, в общем полная хуйня может при такой "сортировке" произойти
            Ответить
          • > Вот например, что если тут какое-нибудь NaN будет?
            Справедливости ради, сортировка по возрастанию последовательности с NaNами ма-те-ма-ти-чес-ки не определена.
            Для этого нужно определять, какое поведение нужно (куда пихать эти наны) и делать соответствующий компаратор.
            Вот то, что ±0 нормально не отсортирует, это минус.

            > Или твоя сортировка только на массивах без NaN работает?
            Большинство алгоритмов, работающих с дробными числами не ожидают NaN, INF, -0, и прочей плавучей хуйни, потому что в большинстве случаев подобная питушня — признак бага и ничего полезного с ней не сделать. В гцц даже -ffast-math сделали для тех кому похуй на питуха и его особенности.
            Ответить
            • парни вы не забыли что я пишу компилятор а не библиотечку для сортировки, а?
              Ответить
              • А через твой компилятор можно формально доказывать корректность сортировки?
                Ответить
                • каким это образом?
                  Ответить
                  • А это уже твои проблемы. Вот в Agda можно доказать через систему типов. https://www.twanvl.nl/blog/agda/sorting

                    Т.е. для доказательства сортировки надо доказать во-первых, что forall i, j in range 0 .. arrlen(a): if (i < j) then a[i] < a[j] и во-вторых что "output is a permutation of the input"
                    Ответить
                    • В названии «Agda» чувствуется что-то азербайджанское...
                      Ответить
                    • это далеко за пределами моего понимания и желания проимплементировать
                      Ответить
    • https://wandbox.org/permlink/rTTfamuer9zkJJth переписал на "GNU C"
      Ответить
      • Не, хуйня. Невозможно отсортировать массив double и сразу же после массив float.
        Можно же было запилить макрос-обёртку с нужным названием над qsort.
        Ответить
        • https://wandbox.org/permlink/jnNQQB50KNm9APd4 вот, улучшил препроцессорный шаблон
          Ответить

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