Koko / Говнокод #27176 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 MAKAKA, (Updated )

Комментарии (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 это похоже не больше, чем классический тернарник 🙂
                    Ответить
                    • Ну т.е. это и есть or в пёрловом смысле. Исполнить и вернуть левую хуйню если она засчиталась как тру, иначе исполнить и вернуть правую хуйню.
                      Ответить
                      • да, примерно.
                        в JS тоже есть такая идиома с ||, она везде может быть, где любой тип приводится к булу
                        Ответить
        • Это бы означало, что существует такой элемент, для которого замыкание возвращает 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.
                Ответить
                  • чтобы посчитать 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, поэтому это удобно. А здесь придётся возвращать какой-нибудь nullable<T>, который потом никуда не засунуть без проверки...
          Ответить
    • > Предлагаю не мелочиться, и кидать NoSuchElementException при попытке итерации по пустой коллекции

      Ну это совсем пиздец же.
      Ответить
          • > бесплатны

            Да нет, просто он сам настолько тормозной, что исключения на этом фоне не заметны. А второй вызов или боксинг в тупл заметен будет.
            Ответить
            • ну бесплатны на фоне всего питона имеетса ввиду
              Ответить
              • В крестах размотка стека тоже ничем не отличается от обычного возврата... Там только определение текущей позиции всё портит, емнип (я не про студию и костыль с SEH, а про нормальные zero-cost).
                Ответить
    • <?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".
      Ответить
    • ну придется бокситься, что не айс, так что лучше конечно сделать два метода
      один с нулом, Да

      а еще лучше с дефолтом
      Ответить
        • Почему это уёбку? Его комментарий, как минимум, выглядел адекватным.

          Вообще, где у нас zapret-info.govnokod.ru со списком уёбков с пояснениями и датами, кто и за что их таковыми признал?
          Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8