απορία σε prolog
Posted: Wed Jul 21, 2010 3:22 am
Λοιπόν, προσπαθώ να φτιάξω ένα πρόγραμμα σε prolog που θα δέχεται σαν όρισμα έναν πίνακα από πίνακες με στοιχεια αριθμούς από το 0-9. Φανταστειτε ότι κάθε πίνακας είναι ένας αριθμός π.χ.[1,2,3]-->123. Σκοπός μου είναι να μεγιστοποιήσω το άθροισμα των αριθμών αυτών με τις παρακάτω δύο διαδικασίες:
α) Μπορώ να "διαστρέψω" έναν αριθμό (κατά γραμμή) δηλαδή [α,β,γ]---->[9-α,9-β,9-γ]
β)Μπορώ να διαστρέψω κάθε ψηφίο ίδιας "σημαντικότητας" από κάθε αριθμό (κατά στήλη) δηλαδή [[α,β,γ],[δ,ε,ζ],[η,θ,ι]]----->[[α,9-β,γ],[δ,9-ε,ζ],[η,9-θ,ι]]
Ο αλγόριθμος που έχω σκεφτεί πάει ως εξής βλέπω ποιοι αριθμοί έχουν το MSB τους μεγαλύτερο του 5 και τους διαστρέφω κατά γραμμή και στη συνέχεια βλέπω ποια από τις στήλες έχει άθροισμα μικρότερο από (9*(length του πίνακα των πινάκων)) div 2 και τη διαστρέφω κατά στήλη.
Ο αλγόριθμός αυτός δουλεύει (στο χέρι) για κάθε test case που έχω ( γνωρίζω πως ανάλογα με τους αριθμούς μπορεί να βρεθεί αποδοτικότερος απλά αυτό δεν επηρεάζει την συγκεκριμένη απορία μου).
Παραθέτω τον κώδικα της υλοποίησης μέχρι εκεί που έχω φτάσει
Π.Χ.
?- check2([[1,2,3,4,5],[2,3,4,5,9],[0,0,9,3,9],[7,6,9,4,9]],1,L).
L = [[1, 7, 3, 4, 5], [2, 6, 4, 5, 9], [0, 9, 9, 3, 9], [7, 3, 9, 4, 9]].
και
?- check2([[1,2,3,4,5],[2,3,4,5,9],[0,0,9,3,9],[7,6,9,4,9]],2,L).
false.
?- check2([[1,2,3,4,5],[2,3,4,5,9],[0,0,9,3,9],[7,6,9,4,9]],4,L).
false.
α) Μπορώ να "διαστρέψω" έναν αριθμό (κατά γραμμή) δηλαδή [α,β,γ]---->[9-α,9-β,9-γ]
β)Μπορώ να διαστρέψω κάθε ψηφίο ίδιας "σημαντικότητας" από κάθε αριθμό (κατά στήλη) δηλαδή [[α,β,γ],[δ,ε,ζ],[η,θ,ι]]----->[[α,9-β,γ],[δ,9-ε,ζ],[η,9-θ,ι]]
Ο αλγόριθμος που έχω σκεφτεί πάει ως εξής βλέπω ποιοι αριθμοί έχουν το MSB τους μεγαλύτερο του 5 και τους διαστρέφω κατά γραμμή και στη συνέχεια βλέπω ποια από τις στήλες έχει άθροισμα μικρότερο από (9*(length του πίνακα των πινάκων)) div 2 και τη διαστρέφω κατά στήλη.
Ο αλγόριθμός αυτός δουλεύει (στο χέρι) για κάθε test case που έχω ( γνωρίζω πως ανάλογα με τους αριθμούς μπορεί να βρεθεί αποδοτικότερος απλά αυτό δεν επηρεάζει την συγκεκριμένη απορία μου).
Παραθέτω τον κώδικα της υλοποίησης μέχρι εκεί που έχω φτάσει
- Spoiler: εμφάνιση/απόκρυψη
Π.Χ.
?- check2([[1,2,3,4,5],[2,3,4,5,9],[0,0,9,3,9],[7,6,9,4,9]],1,L).
L = [[1, 7, 3, 4, 5], [2, 6, 4, 5, 9], [0, 9, 9, 3, 9], [7, 3, 9, 4, 9]].
και
?- check2([[1,2,3,4,5],[2,3,4,5,9],[0,0,9,3,9],[7,6,9,4,9]],2,L).
false.
?- check2([[1,2,3,4,5],[2,3,4,5,9],[0,0,9,3,9],[7,6,9,4,9]],4,L).
false.