Μερικές φορές χρειάζεται να δεις μια ακολουθία ως μια σειρά από κομμάτια αντί για στοιχείο προς στοιχείο. Τα λεξιλόγια grouping, splitting και splitting.monotonic σου δίνουν τέσσερις τρόπους να το κάνεις.
group: ασύνδετα κομμάτια μεγέθους n
group ( seq n -- groups )
USING: grouping ;
{ 1 2 3 4 5 6 7 } 3 group .
! => { { 1 2 3 } { 4 5 6 } { 7 } }
Αν το μήκος της ακολουθίας δεν είναι πολλαπλάσιο του n, το τελευταίο κομμάτι είναι μικρότερο από n.
clump: επικαλυπτόμενο συρόμενο παράθυρο μεγέθους n
clump ( seq n -- clumps )
USING: grouping ;
{ 1 2 3 4 5 } 2 clump .
! => { { 1 2 } { 2 3 } { 3 4 } { 4 5 } }
Αν η ακολουθία είναι μικρότερη από n, το αποτέλεσμα είναι κενό.
split-when: σπάσιμο όπου ένα κατηγόρημα είναι αληθέςsplit-when ( seq quot: ( elt -- ? ) -- pieces )
USING: splitting ;
{ 1 2 0 3 4 0 5 } [ zero? ] split-when .
! => { { 1 2 } { 3 4 } { 5 } }
Κάθε στοιχείο έχει τη δική του κλήση κατηγορήματος· τα στοιχεία για τα οποία το κατηγόρημα είναι αληθές είναι τα σημεία σπασίματος και δε διατηρούνται στο αποτέλεσμα.
monotonic-split: σπάσιμο σειρών όπου αποτυγχάνει ένας έλεγχος γειτονικών ζευγώνmonotonic-split ( seq quot: ( a b -- ? ) -- pieces )
USING: splitting.monotonic ;
{ 1 1 2 2 2 3 } [ = ] monotonic-split .
! => { { 1 1 } { 2 2 2 } { 3 } }
Το κατηγόρημα εκτελείται σε γειτονικά ζεύγη. Όσο επιστρέφει αληθές, η σειρά συνεχίζεται· όταν επιστρέφει f, ξεκινά ένα νέο κομμάτι. Με [ = ] παίρνεις σειρές ίσων στοιχείων· με [ <= ] παίρνεις μη φθίνουσες σειρές· και ούτω καθεξής.
group/clump: ξέρεις το μέγεθος που θέλεις.split-when: ξέρεις πώς μοιάζει ένα στοιχείο σπασίματος.monotonic-split: ξέρεις τι κάνει δύο γειτονικά στοιχεία να ανήκουν ακόμη μαζί.Είναι άλλη μια πολυάσχολη νύχτα στον σταθμό διαλογής της Αμβέρσας. Είσαι ο υπεύθυνος διαλογής της βάρδιας: τα εισερχόμενα φορτηγά βαγόνια πρέπει να ομαδοποιηθούν ξανά σε εξερχόμενα τρένα, οι συζεύξεις να επιθεωρηθούν, οι διαδρομές να χωριστούν στις διακλαδώσεις και τα πανομοιότυπα φορτία να ενωθούν για την τιμολόγηση.
Κάθε βαγόνι είναι μια συμβολοσειρά που ονομάζει αυτό που μεταφέρει: "coal", "timber", "crates" κτλ.
Όρισε τη συνάρτηση couple ώστε να παίρνει έναν πίνακα από βαγόνια και ένα μήκος n, και να επιστρέφει μη επικαλυπτόμενα τρένα των n βαγονιών το καθένα. Το τελευταίο τρένο μπορεί να είναι μικρότερο αν ο αριθμός δεν διαιρείται ακριβώς.
{ "coal" "coal" "coke" "ore" "ore" "timber" "timber" } 3 couple .
! => { { "coal" "coal" "coke" } { "ore" "ore" "timber" } { "timber" } }
Όρισε τη συνάρτηση peek-couplings ώστε να παίρνει έναν πίνακα από βαγόνια και να επιστρέφει κάθε γειτονικό ζεύγος, ώστε ο επιθεωρητής να μπορεί να εξετάσει κάθε σύζευξη.
{ "coal" "ore" "timber" "crates" } peek-couplings .
! => { { "coal" "ore" } { "ore" "timber" } { "timber" "crates" } }
Όρισε τη συνάρτηση split-at-junctions ώστε να παίρνει έναν πίνακα από βαγόνια και έναν πίνακα από junctions (βαγόνια που σηματοδοτούν ένα σημείο διακοπής), και να επιστρέφει τα τμήματα ανάμεσα στα βαγόνια-διακλαδώσεις. Τα ίδια τα βαγόνια-διακλαδώσεις δεν διατηρούνται.
{ "coal" "coal" "switch" "ore" "switch" "timber" }
{ "switch" } split-at-junctions .
! => { { "coal" "coal" } { "ore" } { "timber" } }
Όρισε τη συνάρτηση coalesce-cargo ώστε να παίρνει έναν πίνακα από βαγόνια και να ομαδοποιεί σε συνεχόμενες σειρές τα διαδοχικά βαγόνια που μεταφέρουν το ίδιο φορτίο.
{ "coal" "coal" "ore" "ore" "ore" "timber" "coal" } coalesce-cargo .
! => { { "coal" "coal" } { "ore" "ore" "ore" } { "timber" } { "coal" } }
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Factor με 47 έννοιες163 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.