En primer lugar, yo no reinventar la rueda ... el método max ya está definido en RichInt
, para que pueda escribir a max b
, por a
y b
enteros.
Además,
slice
es obsoleto, por lo tanto, en lugar de
lst.slice(0, num)
me gustaría utilizar lst.take(num)
. Los métodos obsoletos probablemente desaparecerán cuando se inicie Scala 2.8.
EDIT: De hecho, como señaló Daniel, slice(Int, Int)
no está obsoleto. Tenía mucha prisa cuando inicialmente escribí esto, y estaba pensando en slice(Int)
, que es equivalente a drop(Int)
. Todavía encuentro que lst.take(num)
es más claro que lst.slice(0, num)
:).
(nitpick) Su última línea tampoco compila, ya que olvidó agregar Nil
al final de su secuencia de contras. 1::2::3::4
, terminaría invocando ::
en una Int
, que no tiene este método. Es por eso que debe agregar Nil
hasta el final (invoque ::
en Nil
).
Además, el algoritmo que haya utilizado no es evidente a primera vista. La forma en que iba a escribir esto es la siguiente:
val numbers = /*"--the string of numbers--"*/.map(_.asDigit).toList
def sliding[A](xs: List[A], w: Int): List[List[A]] = {
for(n <- List.range(0, xs.size - w))
yield xs drop n take w
}
def product(xs: List[Int]): Int = (1 /: xs) (_ * _)
sliding(numbers, 5).map(product).sort(_ > _).head
Siento que la última línea explica bastante bien lo que se supone que el algoritmo para hacer - tener una ventana deslizante de la lista, calcular el producto en esa ventana deslizante y a continuación, obtenga el máximo de los productos calculados (he implementado la función máxima como sort(_ > _).head
por pereza, podría haber hecho algo O (n) en lugar de O (n log (n)) si el rendimiento fue crítico ... todavía se ejecuta menos de un segundo)
Tenga en cuenta que la función deslizante estará en la biblioteca Scala 2.8 (consulte Daniel's post, donde me inspiré para escribir esta definición de deslizamiento).
EDIT: Vaya ...perdón por el /:
. Solo me gusta la concisión de esto y el hecho de que el elemento inicial del pliegue viene antes de la lista. Se podría escribir de forma equivalente product
como el siguiente, para ser más explícita:
def product(xs: List[Int]): Int = xs.foldLeft(1)(_ * _)
-- Flaviu Cipcigan
Gracias Flaviu, esa es la respuesta que esperaba. Me tomó 5 minutos entender su solución, principalmente debido a la sintaxis muy concisa, que usa. Todavía no conozco operadores, por lo que algo como '1 /: xs' es completamente críptico a primera vista. –
Me alegro de poder ayudar. He editado la publicación para proporcionar la definición menos críptica del producto;). –
¿Se está desaprobando el 'slice'? No veo ninguna advertencia en 2.8 o 2.7.4. –