Zuerst würde ich das Rad ... das Verfahren max nicht neu erfinden bereits in RichInt
definiert ist, so dass Sie a max b
schreiben kann, für a
und b
ganze Zahlen.
ALso,
slice
ist veraltet, daher
statt lst.slice(0, num)
ich lst.take(num)
verwenden würde. Veraltete Methoden werden wahrscheinlich weg sein, wenn Scala 2.8 gestartet wird.
EDIT: der Tat, wie Daniel darauf hingewiesen wird slice(Int, Int)
nicht veraltet. Ich hatte es sehr eilig, als ich das zuerst schrieb, und ich dachte an slice(Int)
, was drop(Int)
entspricht. Ich finde immer noch lst.take(num)
um klarer zu sein als lst.slice(0, num)
:).
(nitpick) Ihre letzte Zeile kompiliert auch nicht, da Sie vergessen haben, Nil
am Ende Ihrer Abfolge von Contras hinzuzufügen. 1::2::3::4
, würde am Ende aufrufen ::
auf einem Int
, die diese Methode nicht haben. Deshalb müssen Sie am Ende Nil
hinzufügen (rufen Sie ::
auf Nil
auf).
Auch der Algorithmus, den Sie verwendet haben, ist auf den ersten Blick nicht offensichtlich. So wie ich das schreiben würde, ist wie folgt:
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
Ich glaube, dass die letzte Zeile erklärt ganz gut, was der Algorithmus tun soll - nehmen Ihnen ein Schiebefenster aus der Liste, berechnet das Produkt in diesem Schiebefenster und dann bekomme ich das Maximum der berechneten Produkte (Ich habe die maximale Funktion als sort(_ > _).head
aus Faulheit implementiert, ich hätte etwas O (n) und nicht O (n log (n)) machen können, wenn Leistung kritisch war ... es läuft immer noch unter einer Sekunde aber).
Beachten Sie, dass die Schiebefunktion in der Scala 2.8-Bibliothek enthalten ist (siehe Daniel's post, von wo ich inspiriert wurde, diese Definition von Gleiten zu schreiben).
EDIT: Hoppla ...Entschuldigung für die /:
. Ich mag nur die Prägnanz und die Tatsache, dass das Anfangselement der Falte vor der Liste steht. Sie könnten in äquivalenter Weise product
wie die folgende schreiben, noch deutlicher zu sein:
def product(xs: List[Int]): Int = xs.foldLeft(1)(_ * _)
-- Flaviu Cipcigan
Dank Flaviu, das ist die erhoffte Antwort. Ich brauchte 5 Minuten, um Ihre Lösung zu verstehen, vor allem wegen der sehr übersichtlichen Syntax, die Sie verwenden. Operatoren kenne ich noch nicht, also ist etwas wie "1 /: xs" auf den ersten Blick völlig kryptisch. –
Ich bin froh, dass ich helfen konnte. Ich habe den Beitrag bearbeitet, um die weniger kryptische Definition des Produkts zu bieten;). –
Wird 'Slice' veraltet? Ich sehe keine Warnungen zu 2.8 oder 2.7.4. –