In questo esercizio dovrei scrivere una funzione che riceva un elenco di numeri interi come argomento e fornisca una matrice o un elenco di elenchi. Il punto nel fare la matrice è che gli interi rappresentano il numero di True
s in ogni colonna della matrice. Ad esempioCome trasformare un elenco di numeri interi in una matrice di vero e falso in Haskell
[2,4,1]
deve essere tradotto a:
che nel sistema è rappresentato come una lista di liste:
[ [0,1,0], [0,1,0], [1,1,0], [1,1,1] ]
Poiché non è facile da manipolare matrici (lista di liste) per colonne ho usato un trucco e ruotato la matrice di 90 gradi a sinistra usando transpose
che fa apparire la matrice qui di seguito:
Poi ho sviluppato il seguente algoritmo per risolvere il problema:
- Prendere il primo elemento della lista di input
- Creare una lista di lunghezza
maximum xs
(la lunghezza di ogni lista è uguale all'elemento massimo nell'elenco) - Metti così tanti
True
nell'elenco come determina il primo elemento. - riempimento nel resto della lista con
False
- Fare lo stesso per tutti gli elementi e ruotare la matrice
Ho cercato di implementare due soluzioni ma ognuno ha un problema che non riesco a risolvere:
Questo funziona per il primo elemento più che bene, ma non so come applicare a tutti gli elementi della lista di input
listToMatrix x = (replicate ((maximum x) - (head x)) False) ++ (replicate (head x) True)`
Questo funziona per tutti gli elementi ma non può mantenere la lunghezza dell'elenco interno in modo che le liste abbiano lunghezze diverse.
listToMatrix [email protected](x:xs) = ((replicate ((maximum lst) - x) False) ++ (replicate x True)) : listToMatrix xs`
Domanda 1: Come posso fare queste funzioni lavorano con modifiche minime?
Domanda 2: soluzioni più eleganti e compatte?
P.S. Ho usato 1 e 0 nelle matrici per renderle più leggibili ma in realtà sono True e False
È questo compito? –
È una sorta di progetto. Perché? – Infinity
Beh, almeno mostra uno sforzo, a differenza della maggior parte delle domande sui compiti SO. Non si limita a chiedere "codice gimme", ma fornisce un tentativo di soluzione. – chi