In dieser Übung sollte ich eine Funktion schreiben, die eine Liste von ganzen Zahlen als Argument erhält und eine Matrix oder eine Liste von Listen gibt. Der Punkt bei der Herstellung der Matrix besteht darin, dass die ganzen Zahlen die Anzahl von True
s in jeder Spalte der Matrix darstellen.So transformieren Sie eine Liste von Ganzzahlen in eine Matrix von Wahr und Falsch in Haskell
, die im System als eine Liste von Listen dargestellt: Zum Beispiel
[2,4,1]
muss übersetzt werden
[ [0,1,0], [0,1,0], [1,1,0], [1,1,1] ]
Da es nicht einfach ist, Matrizen zu manipulieren (Liste von Listen) nach Spalten Ich habe einen Trick benutzt und rotiere die Matrix um 90 Grad nach links unter Verwendung von transpose
, was die Matrix so aussehen lässt unten:
Dann entwickelte ich den folgenden Algorithmus, um das Problem zu lösen:
- Nehmen Sie das erste Element der Eingabeliste
- Erstellen Sie eine Liste der Länge
maximum xs
(die Länge jedes Liste ist gleich dem maximalen Element in der Liste) - Setzen Sie so viele
True
in der Liste als das erste Element bestimmt. - Füllen Sie den Rest der Liste mit
False
- das gleiche für alle Elemente und drehen Sie die Matrix
ich versucht habe zwei Lösungen zu implementieren, aber jeder hat ein Problem, das ich nicht lösen kann:
Dieser funktioniert für das erste Element nur gut, aber ich weiß nicht, wie es von der Eingabeliste auf alle Elemente anwenden
listToMatrix x = (replicate ((maximum x) - (head x)) False) ++ (replicate (head x) True)`
Dies funktioniert für alle Elemente, kann aber die Länge der inneren Liste nicht beibehalten, so dass die Listen unterschiedliche Längen haben.
listToMatrix [email protected](x:xs) = ((replicate ((maximum lst) - x) False) ++ (replicate x True)) : listToMatrix xs`
Frage 1: Wie kann ich diese Funktionen machen mit minimalen Änderungen arbeiten?
Frage 2: Sind elegante und kompakte Lösungen?
P.S. Ich verwendete 1 und 0 in den Matrizen, um sie lesbarer zu machen, aber sie sind in der Tat True und False
Ist das Hausaufgaben? –
Es ist eine Art Projekt. Warum? – Infinity
Nun, zumindest zeigt es Anstrengung, im Gegensatz zu den meisten SO Hausaufgaben Fragen. Es fragt nicht einfach "gimme code", sondern bietet einen Lösungsansatz. – chi