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

    −12

    1. 1
    2. 2
    3. 3
    4. 4
    function sort(arr) {
    	for (var i = 0, j = 0, t, x; i in arr; i += +(x = ++j == arr.length), x && (j = 0), (arr[j] > arr[j + 1]) && (t = arr[j], arr[j] = arr[j + 1], arr[j + 1] = t));
    	return arr;
    }

    Сортировка массива по-сибирски.
    И ведь работает!

    Запостил: DiphenylOxalate, 12 Апреля 2017

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

    • Есть ещё пять уродских реализаций этой функции, и все, как ни странно, прекрасно работают: https://codepen.io/anon/pen/bWbOxb
      Ответить
    • Помогите прочитать, пожалуйста:
      Первое:
      for (var i = 0, j = 0, t, x; - это я так понимаю, входные данные.
      i in arr; - это я так понимаю, условие выхода
      i += +(x = ++j == arr.length), x && (j = 0), (arr[j] > arr[j + 1]) && (t = arr[j], rr[j] = arr[j + 1], arr[j + 1] = t)); - а вот эта жесть, собственно, итератор.
      Правильно?
      Меня несколько смущает "&&" в 3-м сегменте "for", я такого не встречал.

      Второе:
      (x = ++j == arr.length) - "х присвоить предувеличенный J, до тех пор, пока он равен текущей длине массива"?
      Ответить
      • https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
        Используя справочную таблицу, перепишите однострочник таким образом, чтобы получить человекочитаемый код.
        (Правильный ответ - камень).

        > смущает "&&"
        левая часть приводится к bool, если true, то выполняется правая часть
        Ответить
      • "Присвоить x true если предувеличенный J равен текущей длине массива."
        Ответить
      • Вы что, поехавший? Не читайте до обеда советских газет и подобный код.
        Сначала преобразуйте его эквивалентно к чему-то адекватному.
        for(x, y, z) ==== x; while(y){ z }
        x && y ==== if(x) y;
        x, y ==== x; y;
        function sort(arr) {
          var i = 0, j = 0, t;
          while(i in arr) {
            j++;
            if(j == arr.length) {
              i ++;
              j = 0;
            }
            if(arr[j] > arr[j + 1]) {
              t = arr[j];
              arr[j] = arr[j + 1];
              arr[j + 1] = t
            }
          }
          return arr;
        }

        Выходит неоптимальный пузырёк йаду.

        При переписывании ещё оказалось, что переменная x не нужна т.к. используется только для хранения условия ++j == arr.length для условного выполнения j=0.
        i += +(x = ++j == arr.length), x && (j = 0)
        равносильно
        ++j == arr.length && (i++, j = 0)
        равносильно
        ++j == arr.length && (j=+!i++)

        Последний вариант, как мне кажется, прекрасен. Жаль, что парсер не выдерживает записи ++!i++ (слева - два унарных оператора "плюс"). В сишке наверно сработало бы.
        Ответить
    • А между тем, в Яунде 24 градуса тепла
      Ответить
    • кто то докапался до старых добрых книжек по С, очевидно. уже давно жалею что эти книжки не коллекционирую. их не так много - они все отсносительно старые и короткие - и подобные перлы там есть.

      даже на русском как то была книжка с названием типа "лаконичное введение в с" - в мягкой обложке и тонюсенькая, страниц 40. но была первая книга которая мне арифметику с указателями объяснила, потому что без всяких лишних телодвежений и маханий руками.
      Ответить
      • > подобные перлы там есть
        А как их там характеризуют?
        Ответить
        • ни как не характеризуют. книги которые я видел были писаны трансцендентными аксакалами которые уже давно оставили позади мирские тривиальности. типа проблем нубов, которые не знают как к чему они относятся, пока им какой трансцендентный аксакал завет не оставит.

          вот это вроде бы одна из них - Programming Pearls by Jon Bentley:
          http://www.littledumbdoctor.com/index_files/Interview_Programming_pearls.pdf

          о к слову, во ща припомнил, для фанатов распределенных систем могу порекомендовать - Shared Data Clusters by Dilip Ranade. на коленке в шеле лепим CFS - советы от одного из авторов Veritas.
          Ответить
          • > проблем нубов,

            я в себе, к слову, нуба так и не убил. какой аксакал чего скажет - начинаю лепить как сказали. стадный инстинкт, ёпта.
            Ответить
          • > CFS

            А зачем лепить Chronic Fatigue Syndrome в шеле?

            > книги которые я видел были писаны трансцендентными аксакалами
            > вот это вроде бы одна из них - Programming Pearls by Jon Bentley

            Я так и не понял, является ли Бентли трансцендентным аксакалом. Я также не понял, хорошо им быть или плохо.
            Ответить
            • > > CFS

              > А зачем лепить Chronic Fatigue Syndrome в шеле?

              это Cluster FuckFile Systems, а не chronic erectile dysfunction.
              Ответить
          • Интересно.
            Ответить
      • показать все, что скрыточем плоха масенькая книжекчка Кернигана и Ритчи издательства "диалог наука"?

        http://cs8.pikabu.ru/images/big_size_comm/2016-10_2/147591947517821425.jpg
        Ответить
        • показать все, что скрытоКнижка хорошая. А вот ты - не очень.
          Ответить
        • > чем плоха масенькая книжекчка Кернигана и Ритчи

          ничем. жалею что была не моя первая книга по С.

          к слову в "перлах" рекомендуют "Elements of Programming Style" и "Software Tools" писаные Керниганом/Плауэром. надо будет посмотреть тоже.
          Ответить
          • Да, The C Programming Language — отличная книжка. У Кернигана все книги хорошие, недавняя The Go Programming Language мне тоже очень понравилась.
            Ответить
          • # чем плоха масенькая книжекчка Кернигана и Ритчи

            Тем, что там Керниган и Ритчи. Два индуса. Один коричневый, другой тоже коричневый.
            Ответить
    • Уже было недавно
      Ответить

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