Μπόουλινγκ

Μπόουλινγκ

Μέτριο

Οδηγίες

Υπολόγισε το σκορ ενός παιχνιδιού μπόουλινγκ.

Το μπόουλινγκ είναι ένα παιχνίδι όπου οι παίκτες κυλούν μια βαριά μπάλα για να ρίξουν κορύνες που είναι τοποθετημένες σε τρίγωνο. Γράψε κώδικα που να παρακολουθεί το σκορ ενός παιχνιδιού μπόουλινγκ.

Η βαθμολόγηση στο μπόουλινγκ

Το παιχνίδι αποτελείται από 10 καρέ. Ένα καρέ αποτελείται από μία ή δύο ρίψεις της μπάλας, με 10 κορύνες όρθιες κατά την αρχικοποίηση του καρέ. Υπάρχουν τρεις περιπτώσεις για τον υπολογισμό ενός καρέ.

  • Ένα ανοιχτό καρέ είναι όταν καταγράφεται σκορ μικρότερο του 10 για το καρέ. Σε αυτή την περίπτωση, το σκορ του καρέ είναι ο αριθμός των κορυνών που ρίχτηκαν.

  • Ένα σπέαρ είναι όταν και οι δέκα κορύνες ρίχνονται με τη δεύτερη ρίψη. Η συνολική αξία ενός σπέαρ είναι 10 συν ο αριθμός των κορυνών που ρίχνονται στην επόμενη ρίψη.

  • Ένα στράικ είναι όταν και οι δέκα κορύνες ρίχνονται με την πρώτη ρίψη. Η συνολική αξία ενός στράικ είναι 10 συν ο αριθμός των κορυνών που ρίχνονται στις επόμενες δύο ρίψεις. Αν ένα στράικ ακολουθείται αμέσως από ένα δεύτερο στράικ, τότε η αξία του πρώτου στράικ δεν μπορεί να προσδιοριστεί μέχρι να γίνει μία ακόμα ρίψη της μπάλας.

Ακολουθεί ένα παράδειγμα τριών καρέ:

Καρέ 1 Καρέ 2 Καρέ 3
X (στράικ) 5/ (σπέαρ) 9 0 (ανοιχτό καρέ)

Το καρέ 1 είναι (10 + 5 + 5) = 20

Το καρέ 2 είναι (5 + 5 + 9) = 19

Το καρέ 3 είναι (9 + 0) = 9

Αυτό σημαίνει ότι το τρέχον σύνολο είναι 48.

Το δέκατο καρέ στο παιχνίδι είναι ειδική περίπτωση. Αν κάποιος ρίξει σπέαρ ή στράικ, τότε παίρνει μία ή δύο μπάλες συμπλήρωσης αντίστοιχα. Οι μπάλες συμπλήρωσης υπάρχουν για να υπολογιστεί το σύνολο του 10ου καρέ. Το να σημειώσεις στράικ ή σπέαρ στη μπάλα συμπλήρωσης δεν δίνει στον παίκτη περισσότερες μπάλες συμπλήρωσης. Η συνολική αξία του 10ου καρέ είναι ο συνολικός αριθμός των κορυνών που ρίχτηκαν.

Για ένα δέκατο καρέ X1/ (στράικ και σπέαρ), η συνολική αξία είναι 20.

Για ένα δέκατο καρέ XXX (τρία στράικ), η συνολική αξία είναι 30.

Απαιτήσεις

Γράψε κώδικα που να παρακολουθεί το σκορ ενός παιχνιδιού μπόουλινγκ. Θα πρέπει να υποστηρίζει δύο λειτουργίες:

  • Η roll(pins : int) καλείται κάθε φορά που ο παίκτης ρίχνει μια μπάλα. Το όρισμα είναι ο αριθμός των κορυνών που ρίχτηκαν.
  • Η score() : int καλείται μόνο στο πολύ τέλος του παιχνιδιού. Επιστρέφει το συνολικό σκορ για εκείνο το παιχνίδι.

Υποδείξεις

Για να ολοκληρώσεις αυτή την άσκηση, πρέπει να υλοποιήσεις τη συνάρτηση score, που δέχεται μια ακολουθία από ρίψεις μπόουλινγκ και επιστρέφει το τελικό σκορ ή το κατάλληλο σφάλμα:

score :: [Int] -> Either BowlingError Int

data BowlingError = IncompleteGame
                  | InvalidRoll { rollIndex :: Int, rollValue :: Int }
                  deriving (Eq, Show)

Θα βρεις αυτούς τους ορισμούς ήδη στη θέση τους, αλλά από εσένα εξαρτάται να ορίσεις τη συνάρτηση.

Να θυμάσαι ότι η σουίτα δοκιμών περιμένει οι ρίψεις να είναι αριθμημένες ξεκινώντας από το μηδέν.

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

Έτοιμος να ξεκινήσεις την άσκηση Μπόουλινγκ;

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