Κατάφερα να ολοκληρώσω το Advent of Code φέτος. Ήταν η πρώτη μου φορά που το επιχειρούσα, οπότε ήθελα να γράψω τις εντυπώσεις μου.

Σχετικά με το AoC

Το Advent of Code (AoC) είναι ένα ημερολόγιο εμφάνισης παζλ προγραμματισμού που αναπτύχθηκε από τον Eric Wastl, που ξεκίνησε το 2015.

Κάθε μέρα από την 1η Δεκεμβρίου έως τις 25 Δεκεμβρίου αποκαλύπτεται ένα νέο παζλ, στις 5 π.μ. ώρα Ηνωμένου Βασιλείου. Κάθε παζλ έχει 2 μέρη. Για να ξεκλειδώσετε το 2ο μέρος, πρέπει πρώτα να υποβάλετε τη σωστή απάντηση για το 1ο. Δεν υπάρχει χρονικό όριο για την ολοκλήρωση του παζλ (μπορείτε ακόμα να το κάνετε τώρα), αλλά τα πρώτα 100 άτομα που θα ολοκληρώσουν το παζλ λαμβάνουν μια βαθμολογία. Ωστόσο, είναι πολύ δύσκολο να μπεις στην κατάταξη, καθώς φαίνεται ότι οι πιο γρήγοροι άνθρωποι τις ολοκληρώνουν σε λιγότερο από ένα λεπτό (είναι δυνατό; Χρειάζομαι αρκετά λεπτά για να διαβάσω το πρόβλημα… 😅), και υπάρχουν πολλοί που το επιχειρούν. Η φετινή χρονιά ξεκίνησε με περισσότερα από 200.000 άτομα να συμμετάσχουν. Εάν βρίσκεστε στο Ηνωμένο Βασίλειο, πρέπει επίσης να ξυπνήσετε νωρίς (δεν μπορώ 😂).

Ωστόσο, τα παζλ γίνονται ελαφρώς πιο δύσκολα όσο προχωρούν οι μέρες. Τα Σαββατοκύριακα τείνουν να είναι ακόμα πιο δύσκολα. Έτσι, αν δεν τα παρατήσετε, μπορεί να ανεβείτε υψηλότερα στην κατάταξη. Ήμουν 44Κ στην κατάταξη της πρώτης ημέρας, αλλά κατέληξα 5Κ στην 25η. Ο ιστότοπος παρέχει επίσης μερικά ενδιαφέροντα στατιστικά, ώστε να μπορείτε να δείτε το ποσοστό ολοκλήρωσης κάθε παζλ.

Για ποιο λόγο

Μπορείτε να το κάνετε για να διαγωνιστείτε ή απλά για να εξασκηθείτε. Στην περίπτωσή μου, ήταν κυρίως για εξάσκηση. Είμαι συνήθως απασχολημένος με παράπλευρα έργα, οπότε δεν σκέφτηκα ποτέ ότι ήθελα να κάνω στον εαυτό μου ακόμα περισσότερη δουλειά προγραμματισμού. Αλλά φέτος δεν έχω κάνει πολύ προγραμματισμό στο πλάι, οπότε άρχισα να ξεχνάω λίγο το Swift, καθώς είναι μια γλώσσα που χρησιμοποιώ μόνο στα παράπλευρα έργα μου. Αλλά έπρεπε να ελέγξω κάτι στο Swift για δουλειά, οπότε σκέφτηκα ότι το να κάνω το φετινό AoC στο Swift θα ήταν ένας καλός τρόπος για προθέρμανση.

Μου αρέσει το Swift και τα προβλήματα ήταν διασκεδαστικά, οπότε μπήκα γρήγορα σε αυτό. Αν και αργότερα άρχισα να κουράζομαι. Την ημέρα των Χριστουγέννων, το πρώτο μέρος δεν ήταν τόσο δύσκολο, αλλά το 2ο μέρος ήταν απλά να μαζέψω όλα τα αστέρια από τις προηγούμενες μέρες… 😅 Είχα 3 ημιτελή παζλ (ή μάλλον, 5 μέρη), οπότε έκανα λίγο μαραθώνιος προγραμματισμού για να τους τελειώσω όλους και κατέληξα λίγο κουρασμένος 🙈 Αν και μόλις τελειώσω, είναι μια υπέροχη αίσθηση ολοκλήρωσης. 👍

Πώς να το προσεγγίσετε

Όπως σας αρέσει, πραγματικά. Αλλά αυτό που έχω κάνει είναι να δημιουργήσω ένα ενιαίο έργο όπου βάζω όλα τα αρχεία για όλα τα παζλ. Είναι μια εφαρμογή CLI που πάντα επικαλούμαι διαβιβάζοντας ένα αρχείο με το όνομα day12_input.txt ή day23_example1.txt. Από το όνομα του αρχείου παίρνω τον αριθμό ημέρας και, στη συνέχεια, εκτελώ την αντίστοιχη συνάρτηση dayXX, από ένα μεγάλο διακόπτη (σκέφτηκα να χρησιμοποιήσω ανάκλαση για να καλέσω τη σωστή μέθοδο, αλλά το API Mirror του Swift σάς επιτρέπει να έχετε πρόσβαση μόνο στο χαρακτηριστικά, όχι τις μεθόδους). Μοίρασα αυτές τις λειτουργίες σε αρχεία με το όνομα WeekN.swift, 7 ημέρες ανά αρχείο, μόνο και μόνο επειδή δεν μου αρέσουν τα τεράστια αρχεία. Για σύντομες ασκήσεις, γράφω τον αλγόριθμο μέσα στη συνάρτηση εκείνης της ημέρας. Αλλά στις περισσότερες περιπτώσεις δημιουργώ ένα ξεχωριστό αρχείο με τη λειτουργικότητα και το επικαλούμαι από τη λειτουργία εκείνης της ημέρας. Δείτε παρακάτω, μετά από 25 ημέρες.

Το να τα έχω όλα σε ένα μόνο έργο ήταν χρήσιμο γιατί θα μπορούσα να χρησιμοποιήσω ξανά μέρος του κώδικα. Συνέχισα να ανακατασκευάζω καθώς πήγαινα, για να κάνω τον κώδικα πιο χρήσιμο. Άρχισα επίσης να προσθέτω συναρτήσεις δοκιμής. Επικαλέσθηκα αυτές τις δοκιμαστικές συναρτήσεις από την αντίστοιχη ημερήσια συνάρτηση, αν και ίσως θα μπορούσα να είχα δημιουργήσει ένα ξεχωριστό έργο δοκιμής. Αλλά σε αυτό το σημείο, ίσως είναι υπερβολική μηχανική του προβλήματος. 😅

Ο εντοπισμός σφαλμάτων κώδικα μπορεί επίσης να είναι διασκεδαστικός, ακόμη και όταν δεν είναι απαραίτητος. Προσπάθησα να κάνω κάποιες απεικονίσεις των προβλημάτων για να με βοηθήσουν να εντοπίσω σφάλματα, αλλά και επειδή είναι ωραίο. Υπάρχουν άνθρωποι στο Twitter που δημιουργούν εικόνες και κινούμενα σχέδια για ορισμένα από τα προβλήματα. Ακολουθούν μερικά ενδιαφέροντα που βρήκα: ημέρα 15 (αναζήτηση), άλλη μέρα 15, ημέρα 14 (πολυμερισμός), ημέρα 13 (οριγκάμι) στο C64 και ημέρα 13 κινούμενα σχέδια.

Έγραψα κάποιο κώδικα για να εξάγω τις δομές μου που μοιάζουν με εικόνα σε εικόνες και να δημιουργήσω κινούμενα σχέδια με τα βήματα των αλγορίθμων, και εδώ είναι μερικά από τα αποτελέσματα: ημέρα 11 (χταπόδι που αναβοσβήνει) και ημέρα 9 (λεκάνη καπνού).

συμπέρασμα

Δοκίμασέ το. Ακόμα κι αν δεν γνωρίζετε κανέναν προγραμματισμό, μπορεί να είναι ενδιαφέρον να διαβάσετε το πρόβλημα και να προσπαθήσετε να καταλάβετε εάν μπορείτε να το λύσετε μαθηματικά ή σε χαρτί. Μερικές φορές, μπορεί να είναι διασκεδαστικό να σκεφτόμαστε πόσες μεταθέσεις ενός συγκεκριμένου προβλήματος υπάρχουν.

Ίσως προγραμματίσετε εκ των προτέρων πότε πρόκειται να επιχειρήσετε να λύσετε τα προβλήματα. Έτυχε να έχω κάποιες διακοπές ώστε να μπορώ να περνάω κάποιες ώρες κάθε μέρα στο AoC. Υπάρχουν καλύτερα πράγματα να κάνετε τις διακοπές, ίσως, αλλά μπορείτε πάντα να πάρετε λίγο χαρτί μαζί σας και να σκεφτείτε το πρόβλημα ενώ ξεκουράζεστε σε ένα καφέ (επιτρέπονται οι περιορισμοί).

Ευχαριστούμε τον Eric Wastl για όλο τον χρόνο που αφιέρωσε για τη δημιουργία αυτών των παζλ. 😊

Δημοσιεύτηκε αρχικά στη διεύθυνση http://endavid.com.