Ανάλυση SGF

Ανάλυση SGF

Δύσκολο

Οδηγίες

Ανάλυση μιας συμβολοσειράς Smart Game Format.

Το SGF είναι μια τυποποιημένη μορφή για την αποθήκευση αρχείων επιτραπέζιων παιχνιδιών, ιδίως του γκο.

Το SGF είναι μια αρκετά απλή μορφή. Ένα αρχείο SGF περιέχει συνήθως ένα μόνο δέντρο κόμβων, όπου κάθε κόμβος είναι μια λίστα ιδιοτήτων. Η λίστα ιδιοτήτων περιέχει ζεύγη κλειδιού-τιμής· κάθε κλειδί μπορεί να εμφανιστεί μόνο μία φορά, αλλά μπορεί να έχει πολλαπλές τιμές.

Σε αυτή την άσκηση θα αναλύσεις μια συμβολοσειρά SGF και θα επιστρέψεις μια δομή δέντρου από ιδιότητες.

Ένα αρχείο SGF μπορεί να μοιάζει κάπως έτσι:

(;FF[4]C[root]SZ[19];B[aa];W[ab])

Πρόκειται για ένα δέντρο με τρεις κόμβους:

  • Ο κόμβος κορυφής έχει τρεις ιδιότητες: FF[4] (κλειδί = "FF", τιμή = "4"), C[root](κλειδί = "C", τιμή = "root") και SZ[19] (κλειδί = "SZ", τιμή = "19"). (Το FF δηλώνει την έκδοση του SGF, το C είναι ένα σχόλιο και το SZ είναι το μέγεθος της σανίδας.)
    • Ο κόμβος κορυφής έχει ένα μόνο παιδί, το οποίο έχει μία μόνο ιδιότητα: B[aa]. (Ο μαύρος παίζει στο σημείο που κωδικοποιείται ως "aa", δηλαδή στο σημείο 1-1).
      • Ο κόμβος B[aa] έχει ένα μόνο παιδί, το οποίο έχει μία μόνο ιδιότητα: W[ab].

Όπως μπορείς να φανταστείς, ένα αρχείο SGF περιέχει πολλούς κόμβους με ένα μόνο παιδί, γι' αυτό υπάρχει μια συντομογραφία γι' αυτό.

Το SGF μπορεί να κωδικοποιήσει παραλλαγές του παιχνιδιού. Οι παίκτες του γκο γυρίζουν συχνά πίσω όταν αναλύουν τα παιχνίδια τους (ας δοκιμάσουμε αυτό, δεν δουλεύει, ας δοκιμάσουμε εκείνο) και το SGF υποστηρίζει παραλλαγές ακολουθιών παιχνιδιού. Για παράδειγμα:

(;FF[4](;B[aa];W[ab])(;B[dd];W[ee]))

Εδώ ο ριζικός κόμβος έχει δύο παραλλαγές. Η πρώτη (η οποία κατά σύμβαση δείχνει τι παίχτηκε πραγματικά) είναι εκείνη όπου ο μαύρος παίζει στο 1-1. Ο μαύρος έλαβε αυτό το αρχείο από τον δάσκαλό του, ο οποίος του επισήμανε ένα πιο λογικό παίξιμο στο δεύτερο παιδί του ριζικού κόμβου: B[dd] (σημείο 4-4, ένα πολύ συνηθισμένο άνοιγμα για να πάρεις τη γωνία).

Ένα κλειδί μπορεί να έχει πολλαπλές τιμές συνδεδεμένες με αυτό. Για παράδειγμα:

(;FF[4];AB[aa][ab][ba])

Εδώ το AB (προσθήκη μαύρων) χρησιμοποιείται για να προσθέσει τρεις μαύρες πέτρες στη σανίδα.

Όλες οι τιμές των ιδιοτήτων θα είναι του τύπου SGF Text. Δεν χρειάζεται να υλοποιήσεις κανέναν άλλο τύπο τιμής. Αν και μπορείς να διαβάσεις την πλήρη τεκμηρίωση του τύπου Text, παρακάτω υπάρχει μια σύνοψη των σημαντικών σημείων:

  • Οι αλλαγές γραμμής αφαιρούνται αν βρίσκονται αμέσως μετά από ένα \, διαφορετικά παραμένουν ως αλλαγές γραμμής.
  • Όλοι οι χαρακτήρες κενού εκτός από την αλλαγή γραμμής μετατρέπονται σε κενά.
  • Το \ είναι ο χαρακτήρας διαφυγής. Κάθε μη-λευκός χαρακτήρας μετά το \ εισάγεται ως έχει. Κάθε χαρακτήρας κενού μετά το \ ακολουθεί τους παραπάνω κανόνες. Σημείωσε ότι το SGF δεν έχει ακολουθίες διαφυγής για χαρακτήρες κενού, όπως \t ή \n.

Πρόσεξε να μην μπερδέψεις:

  • Τη συμβολοσειρά όπως αναπαρίσταται μέσα σε ένα κυριολεκτικό συμβολοσειράς στα τεστ
  • Τη συμβολοσειρά που περνάει στον αναλυτή SGF

Οι ακολουθίες διαφυγής στα κυριολεκτικά συμβολοσειρών μπορεί να έχουν ήδη υποστεί επεξεργασία από τον αναλυτή της γλώσσας προγραμματισμού, πριν περάσουν στον αναλυτή SGF.

Υπάρχουν μερικές ακόμη πολυπλοκότητες στο SGF (και γενικά στην ανάλυση), τις οποίες μπορείς ως επί το πλείστον να αγνοήσεις. Να υποθέσεις ότι η είσοδος είναι κωδικοποιημένη σε UTF-8 και ότι τα τεστ δεν θα περιέχουν ιδιότητα charset, οπότε μην ανησυχείς γι' αυτό. Επιπλέον, μπορείς να υποθέσεις ότι όλες οι αλλαγές γραμμής είναι σε στυλ unix (\n, στα τεστ δεν θα υπάρχει \r ή \r\n) και ότι στα τεστ δεν θα υπάρχει προαιρετικός κενός χώρος ανάμεσα σε ιδιότητες, κόμβους κ.λπ.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
F# Exercism

Έτοιμος να ξεκινήσεις την άσκηση Ανάλυση SGF;

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