1. Kotlin / Говнокод #27176

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    * Returns the largest value among all values produced by [selector] function
     * applied to each element in the collection.
     * 
     * @throws NoSuchElementException if the collection is empty.
     */
    @SinceKotlin("1.4")
    @OptIn(kotlin.experimental.ExperimentalTypeInference::class)
    @OverloadResolutionByLambdaReturnType
    @kotlin.internal.InlineOnly
    public inline fun <T, R : Comparable<R>> Iterable<T>.maxOf(selector: (T) -> R): R {
        val iterator = iterator()

    Запостил: MAKAKA, 25 Декабря 2020

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

    • >NoSuchElementException if the collection is empty.

      как это удобно.

      Предлагаю не мелочиться, и кидать NoSuchElementException при попытке итерации по пустой коллекции


      пидары
      Ответить
      • Ну а чему равен максимум пустой коллекции? Не возвращать же какой-нибудь MAX_INT.
        Ответить
        • да, я уже отписался ниже, что математически они правы

          но я бы сделал так: max(default=0) {..}
          или
          maxOrNull{..} ?: 0
          последнее мож и е, надо прове
          Ответить
          • Я бы просто проверил на пустоту перед началом вычислений. У тебя же, скорее всего, вся задача не имеет смысла на пустой коллекции, а не только поиск максимума.
            Ответить
            • я так и сделал, но было бы приятнее написат
              val q = maxOrNull{..} ?: return
              Ответить
              • Выглядит как код на "J", если честно.

                Это косплей на пёрловский or die что ли?
                Ответить
                • нет, это элвис и ретерн. Ничего сложно. Вникай:
                  fun getPetuh(): Petuh? {
                    return if (koko==pepe) Petuh() else null
                  }
                  fun doPetuh() {
                   val petuh = getPetuh() ?: return //если нул то и всё
                   petuh.koko() //никакого NPE
                  }


                  так понятно?
                  теперь
                  fun guiness() {
                    val oldiestPetuhAge = petuhs.maxOrNull { petuh.age } ?: return 
                    println("The oldiest petuh is $oldiestPetuhAge ")
                  }


                  18-летняя Ганнуся - самая старая курица в мире


                  Ответить
                  • Нихуя не понял. Что делает оператор "?:"?
                    Ответить
                    • Смотрит на левый операнд, если он не nil, возвращает его, иначе правый операнд.

                      Nil coalescing или как-то так

                      На J это похоже не больше, чем классический тернарник :-)
                      Ответить
                    • https://en.wikipedia.org/wiki/Elvis_operator
                      Ответить
                      • Ну т.е. это и есть or в пёрловом смысле. Исполнить и вернуть левую хуйню если она засчиталась как тру, иначе исполнить и вернуть правую хуйню.
                        Ответить
                        • да, примерно.
                          в JS тоже есть такая идиома с ||, она везде может быть, где любой тип приводится к булу
                          Ответить
                    • Переведи на «PHP».
                      Ответить
        • MIN_INT логичнее было бы
          Ответить
          • Это бы означало, что существует такой элемент, для которого замыкание возвращает MIN_INT
            А такого элемента нет
            Ответить
            • Почему это бы что-то означало? max(empty) = -inf - естественная питушня как для математики, так и для программирования.

              1. Определим максимум как минимальное значение, для которого не существует элементов множества больше этого значения.
              То есть располагаем элементы на этажах и смотрим, за кем первым приедет лифт (спускающийся лифт символизирует минимизацию этого значения).
              Если кто-то был, лифт первым приедет за максимумом по высоте. Определение максимума работает и даёт интуитивно понятный результат.
              Если никого не было, лифт уедет в подвал. Определение расширяет понятие максимума на пустое множество, называя минимальный элемент домена или минус бесконечность максимумом пустого множества.

              2. max = -inf; foreach(x in xs) if (x > max) max = x;
              Такой алгоритм даёт максимум для непустого множества и без переписывания кода называет минимальный элемент домена или минус бесконечность максимумом пустого множества.

              И питушня (1) в математике, и питушня (2) в программировании являются простыми питушнями, которые могут выдержать поединок на бритве Оккама, согласуются между собой и указывают на -inf без пердолинга с доопределениями.
              Ответить
              • max(empty) = empty
                А у тебя ничего и "минус бесконечность" стали тождественны, это ерунда. Так можно лишь для оптимизации, чтобы не ебаться с монадами там, где нет смазки.
                Ответить
                • > max(empty) = empty
                  Это какая-то нетипизированная питушня, которой стыдливо прикрывают (void*)0.
                  Уважающий себя максимум должен быть из домена, к которому принадлежит элемент множества. Как минимум, в программировании.
                  max({{{empty}}}) = {{empty}}
                  max({{empty}}) = {empty}
                  max({empty}) = empty
                  max(empty) = -inf

                  > у тебя ничего и "минус бесконечность" стали тождественны
                  у разработчиков SQL ничего и "минус бесконечность" стали тождественны потому, что у них max(empty) = empty.
                  Ответить
                  • а -inf это из какого домена?
                    а max(length(col)) например?
                    а max(name) from person?
                    Ответить
                    • чтобы посчитать max по коллекции типа Т достаточно лишь иметь стабильный оператор < (T, T)
                      а оператором < можно хоть двух лысых чертей сравнивать, например, два массива друг с другом (сравнение строк - частный случай сравнения массивов) или два кортежа
                      не понимаю где тут место для -inf
                      Ответить
                    • -inf - из R U {-inf, +inf} или из плавающего питуха без нанов
                      max({length(...)} \ {length(...)}) = 0
                      max({name(...)} \ {name(...)}) = ""
                      Ответить
              • >-inf -
                вот -inf - мог бы, а MIN_INT нет

                но у целых чисел нет инфа в погромировании
                Ответить
                • > вот -inf - мог бы, а MIN_INT нет
                  Какая между ними разница?

                  1. Определим максимум целых чисел из диапазона как минимальное значение, для которого не существует элементов множества больше этого значения.
                  То есть располагаем элементы на этажах и смотрим, за кем первым приедет лифт (спускающийся лифт символизирует минимизацию этого значения).
                  Если кто-то был, лифт первым приедет за максимумом по высоте. Определение максимума работает и даёт интуитивно понятный результат.
                  Если никого не было, лифт уедет в подвал. Определение расширяет понятие максимума на пустое множество, называя минимальный элемент диапазона максимумом пустого множества.

                  2. max = -INT_MIN; foreach(x in xs) if (x > max) max = x;
                  Такой алгоритм даёт максимум для непустого множества интов и без переписывания кода называет минимальный элемент из интов (INT_MIN) максимумом пустого множества.

                  И питушня (1) в математике, и питушня (2) в программировании являются простыми питушнями, которые могут выдержать поединок на бритве Оккама, согласуются между собой и указывают на INT_MIN без пердолинга с доопределениями.
                  Ответить
                  • > max = -INT_MIN
                    Тебя укусил карманный лев, проверь.
                    Ответить
                    • Случился кописраст.
                      -INT_MIN в том комментарии следует читать как INT_MIN.

                      > max = -INT_MIN; foreach(x in xs) if (x > max) max = x;
                      max = INT_MIN; foreach(x in xs) if (x > max) max = x;
                      Ответить
        • В базах данных он равен null, это всех устраивает.
          Ответить
          • В базах данных любой тип может содержать null, поэтому это удобно. А здесь придётся возвращать какой-нибудь nullable<T>, который потом никуда не засунуть без проверки...
            Ответить
      • > Предлагаю не мелочиться, и кидать NoSuchElementException при попытке итерации по пустой коллекции

        Ну это совсем пиздец же.
        Ответить
        • Ничего, питон каждый раз в конце массива кидает...
          Ответить
          • в питоне исключения бесплатны
            Ответить
            • > бесплатны

              Да нет, просто он сам настолько тормозной, что исключения на этом фоне не заметны. А второй вызов или боксинг в тупл заметен будет.
              Ответить
              • ну бесплатны на фоне всего питона имеетса ввиду
                Ответить
              • В «CPython» бросок исключения — это просто присваивание соответствующего поля в структурке из TLS. Размотка стека — тоже крайне проста и ничем не отличается от обычного возврата: https://github.com/python/cpython/blob/3.8/Python/ceval.c#L3725.
                Ответить
                • В крестах размотка стека тоже ничем не отличается от обычного возврата... Там только определение текущей позиции всё портит, емнип (я не про студию и костыль с SEH, а про нормальные zero-cost).
                  Ответить
    • хотя ма-те-ма-тически они правы, конечно
      Ответить
    • Почему бы null не возвращать, или что там у вас?
      Ответить
      • <?php var_dump(max([]));
        
        stdout:
        bool(false)
        
        stderr:
        PHP Warning:  max(): Array must contain at least one element in /home/GigJzn/prog.php on line 3


        Именно поэтому я за "PHP".
        Ответить
      • ну придется бокситься, что не айс, так что лучше конечно сделать два метода
        один с нулом, Да

        а еще лучше с дефолтом
        Ответить
    • Есть там maxOrNull - https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/max-or-null.html
      Да и вообще много похожих методов сделаны в двух вариантах - с исключением и с null -
      first/firstOrNull, last/lastOrNull, single/singleOrNull и тд
      Ответить
      • первый орнул, последний орнул, одинокий орнул
        Ответить
        • Хорошо орнул тот, кто орнул последним.
          Ответить
        • Уёбку ответил.
          Ответить
          • Почему это уёбку? Его комментарий, как минимум, выглядел адекватным.

            Вообще, где у нас zapret-info.govnokod.ru со списком уёбков с пояснениями и датами, кто и за что их таковыми признал?
            Ответить
            • Комменты его почитай. Он только с уёбками пиздит.
              Пример: https://govnokod.ru/14669#comment218119
              Ответить
          • Калибровка сбилась?
            Ответить

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