Wiederholen eine Liste, in der Scala
Ich bin ein Scala noob. Ich haben beschlossen, schreiben ein spider solitaire solver als erste übung die Sprache zu lernen und die funktionale Programmierung im Allgemeinen.
Möchte ich generieren, die einem zufällig gemischten Kartenstapel mit 1, 2 oder 4 Anzüge. Hier ist, was ich kam mit:
val numberOfSuits = 1
(List("clubs", "diamonds", "hearts", "spades").take(numberOfSuits) * 4).take(4)
welche zurückgeben sollte
List("clubs", "clubs", "clubs", "clubs")
List("clubs", "diamonds", "clubs", "diamonds")
List("clubs", "diamonds", "hearts", "spades")
je nach dem Wert von numberOfSuits, außer es gibt keine Liste mit "multiplizieren" - operation, die ich finden kann. Hab ich es vermissen? Gibt es eine bessere Art und Weise zu erzeugen, das komplette deck vor dem mischen?
BTW, ich plan auf dem verwenden einer Enumeration für die Anzüge, aber es war leichter zu geben auf meine Frage mit den Saiten. Ich werde die Liste oben generierten und mit einem für das Verständnis, Durchlaufen die Anzüge und eine ähnliche Liste Karte "gehört" zu generieren, die ein komplettes deck.
- Der interessante Teil dieses Projektes wird die Schaffung der unveränderlichen Generationen der tableau (aktuelle layout der Karten). Ich bitte das aktuelle tableau für eine Liste von regelgemäßen Zügen, kehrte als Tupel von (Spalte Quelle Spalte "Ziel", und die source-position). Ich habe dann gelten zu den jeweils aktuellen tableau in a recursive fashion mit einer Art mini-max-Algorithmus zum finden der "besten" zu bewegen. Ich will auch die Karte Objekt unveränderlich, so der tableaus ("tableaux?") haben, um zu wissen, ob eine Karte aufgedeckt ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie schauen, bis die scaladoc für das Objekt
List
. Es hat alle Arten von interessanten Methoden für die Erstellung von Listen. Zum Beispiel, der folgende tut genau das, was Sie wollten:Einen viel schöneren code, jedoch wäre dies (Scala 2.7):
Auf Scala 2.8
tabulate
ist Curry, so dass die richtige syntax wäre:List.tabulate(4, i => suits.apply(i % numberOfSuits))
erfordert nichtapply
nennen. Ich würde dies ändern, umList.tabulate(4, i => suits(i % numberOfSuits))
Glätten einer endlichen Listen von Listen:
Reduzieren unendlichen Strom von Listen, nehmen Sie die ersten N Elemente:
Können Sie eine numerische Sequenz und
flatMap
statt sich zu vermehren.Funktioniert dies in 2.7.x auch.
Edit: da Sie weniger Erfahrung mit Scala, vielleicht sind Sie noch nicht gekommen, über die pimp-my-library-pattern. Wenn Sie wollen multiplizieren Sie Ihre Listen eine Menge, können Sie fügen Sie eine benutzerdefinierte Konvertierung-Klasse:
und jetzt können Sie
(In der Regel, um die Wiederverwendung solcher implicits, deklarieren Sie diese in einem Objekt und importieren Sie dann MyObject._ um die implizite Konvertierung und die entsprechende Klasse im Umfang.)
Wenn Sie
cats
Bibliothek, können Sie Gebrauch machen vonSemigroup
's MethodecombineN
. Es repeates eine ListeN
Zeiten.