Как мне вычислить argmax функции в списке в Stanza?

Я хотел бы знать, есть ли функция для вычисления argmax функции f в списке чисел (целые, длинные, числа с плавающей запятой) numbers в Станце.

Он будет иметь следующее поведение:

      defn argmax (f, numbers: Tuple) :
  val N = length(numbers)
  if N == 0 :
    fatal("Can't compute the argmax of an empty tuple")

  var max-index = 0
  var max-value = numbers[0]

  for idx in 1 to N do :
    val value = f(numbers[idx])
    if value > max-value :
      max-index = idx
      max-value = value
  
  max-index

defn f (x) :
  x * x

println $ argmax(f, [1, 6, 2, 5])

Результат :

      1

Спасибо!

2 ответа

Один способ создать argmax выполнен в функциональном стиле:

      defn argmax (nums:Tuple<Comparable>) :
  reduce(fn (a, b) : a when (a[1] > b[1]) else b, zip(0 to false, nums))[0]

который применяет попарно maxнад набором объединенных индексов и значений. Чтобы завершить решение, вы должны использовать следующее:

      defn f (x) :
  x * x

defn argmax (f, nums:Tuple<Comparable>) :
  argmax(map(f, nums))

Вы можете использовать пару функций argmax! и argmax?, что является распространенной идиомой в строфе, где операция последовательности может завершиться неудачно (в данном случае, когда кортеж пуст)

Например:

      defpackage argmax: 
  import core
  import collections

defn argmax? (vals:Seqable<Comparable>) -> False|Int:
  false when empty?(to-seq(vals)) else argmax!(vals)

defn argmax! (vals:Seqable<Comparable>) -> Int: 
  defn compare (left:[Comparable, Int], right:[Comparable, Int]):
    left when left[0] > right[0] else right
  val [_, argmax] = reduce(compare, zip(vals, 0 to false))
  argmax

val vals = [1, 6, 2, 5]
println("argmax of [%,] is: %_" % [vals, argmax!(vals)])
println("argmax of empty tuple is: %_" % [argmax?([])])

Чтобы применить функцию к произвольной последовательности, вы можете использовать seq

      val vals = [1, 6, 2, 5]
defn f (x): 
  x * x
println("argmax of f = %_" % [argmax?(seq(f, vals))])

Аннотации типов необязательны, они здесь для ясности.

Другие вопросы по тегам