Διαδρομές
/
Factor
Factor
/
Ασκήσεις
/
Βελγικά βαγόνια
Βελγικά βαγόνια

Βελγικά βαγόνια

Άσκηση εκμάθησης

Εισαγωγή

Μερικές φορές χρειάζεται να δεις μια ακολουθία ως μια σειρά από κομμάτια αντί για στοιχείο προς στοιχείο. Τα λεξιλόγια 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" κτλ.

1. Σύζευξε βαγόνια σε τρένα

Όρισε τη συνάρτηση couple ώστε να παίρνει έναν πίνακα από βαγόνια και ένα μήκος n, και να επιστρέφει μη επικαλυπτόμενα τρένα των n βαγονιών το καθένα. Το τελευταίο τρένο μπορεί να είναι μικρότερο αν ο αριθμός δεν διαιρείται ακριβώς.

{ "coal" "coal" "coke" "ore" "ore" "timber" "timber" } 3 couple .
! => { { "coal" "coal" "coke" } { "ore" "ore" "timber" } { "timber" } }

2. Ρίξε μια ματιά στις συζεύξεις

Όρισε τη συνάρτηση peek-couplings ώστε να παίρνει έναν πίνακα από βαγόνια και να επιστρέφει κάθε γειτονικό ζεύγος, ώστε ο επιθεωρητής να μπορεί να εξετάσει κάθε σύζευξη.

{ "coal" "ore" "timber" "crates" } peek-couplings .
! => { { "coal" "ore" } { "ore" "timber" } { "timber" "crates" } }

3. Χώρισε την αλυσίδα στις διακλαδώσεις

Όρισε τη συνάρτηση split-at-junctions ώστε να παίρνει έναν πίνακα από βαγόνια και έναν πίνακα από junctions (βαγόνια που σηματοδοτούν ένα σημείο διακοπής), και να επιστρέφει τα τμήματα ανάμεσα στα βαγόνια-διακλαδώσεις. Τα ίδια τα βαγόνια-διακλαδώσεις δεν διατηρούνται.

{ "coal" "coal" "switch" "ore" "switch" "timber" }
{ "switch" } split-at-junctions .
! => { { "coal" "coal" } { "ore" } { "timber" } }

4. Ένωσε τα πανομοιότυπα φορτία

Όρισε τη συνάρτηση coalesce-cargo ώστε να παίρνει έναν πίνακα από βαγόνια και να ομαδοποιεί σε συνεχόμενες σειρές τα διαδοχικά βαγόνια που μεταφέρουν το ίδιο φορτίο.

{ "coal" "coal" "ore" "ore" "ore" "timber" "coal" } coalesce-cargo .
! => { { "coal" "coal" } { "ore" "ore" "ore" } { "timber" } { "coal" } }
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Factor Exercism

Έτοιμος να ξεκινήσεις την άσκηση Βελγικά βαγόνια;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Factor με 47 έννοιες163 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.