Πίτσα Pi

Πίτσα Pi

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

Εισαγωγή

Στη Common Lisp, όπως και σε πολλές γλώσσες, οι αριθμοί έχουν αρκετούς τύπους. Δύο από τους πιο βασικούς είναι:

Ακέραιοι

Όπως και πολλές γλώσσες, η Common Lisp περιέχει ακέραιους αριθμούς. Αυτοί είναι ακέραιοι αριθμοί χωρίς υποδιαστολή (όπως -6, 0, 25, 1234, κ.λπ.).

Η Common Lisp δεν ορίζει όρια στο μέγεθος των ακεραίων. Οι ακέραιοι μπορούν να είναι αυθαίρετα μεγάλοι (ή μικροί, αν είναι αρνητικοί).

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

Αριθμοί κινητής υποδιαστολής

Όπως και πολλές γλώσσες, η Common Lisp περιέχει αριθμούς κινητής υποδιαστολής. Αυτοί είναι κλασματικοί ή ακέραιοι αριθμοί που περιλαμβάνουν υποδιαστολή (όπως 3.14, -1.7, 99.99, 2048.0).

Αριθμητική

Η Common Lisp χρησιμοποιεί τους τυπικούς αριθμητικούς τελεστές για τις περισσότερες πράξεις, αλλά έχει την ιδιαιτερότητα να χρησιμοποιεί "προθεματική σημειογραφία" αντί για την πιο οικεία "ενθεματική σημειογραφία".

Πιο παραστατικά:

;; Infix-notation (non-lisp languages)
1 + 2 + 3 + 4 + 5 ; => 15
;; Prefix-notation (lisp languages)
(+ 1 2 3 4 5)     ; => 15

Αν και η προθεματική σημειογραφία μετατρέπει κάποιες πράξεις όπως το 2 + 2 στη λιγότερο οικεία μορφή (+ 2 2), κάνει πολύ πιο εύκολο να εκτελείς πράξεις με περισσότερους από έναν αριθμούς ταυτόχρονα.

Βασικά μαθηματικά

Η Common Lisp έχει όλες τις τυπικές συναρτήσεις: +, -, *, / για πρόσθεση, αφαίρεση, πολλαπλασιασμό και διαίρεση.

Όταν εξετάζεις τη διαίρεση, μπορεί να θέλεις να ξέρεις το υπόλοιπο μιας διαίρεσης. Αυτό γίνεται με τη συνάρτηση mod (για modulo), η οποία δέχεται έναν αριθμό και έναν διαιρέτη ως ορίσματα:

(mod 4 2)  ; => 0
(mod 2 4)  ; => 2
(mod 10 3) ; => 1

Σύγκριση αριθμών

Τέλος, μπορεί να σου φανεί χρήσιμο να συγκρίνεις διαφορετικούς αριθμούς χρησιμοποιώντας συναρτήσεις όπως = (ίσο), /= (όχι ίσο με), και >= (μεγαλύτερο ή ίσο με). Όταν αυτές οι συγκρίσεις είναι αληθείς (όπως στην (= 1 1)), επιστρέφουν T και όταν δεν είναι (όπως στην (> 0 1)), επιστρέφουν NIL.

Οδηγίες

Η Lilly, η εξωγήινη της Lisp, λατρεύει το μαγείρεμα. Θέλει να κάνει ένα πάρτι πίτσας με τους φίλους της, αλλά για να αξιοποιήσει στο έπακρο τα υλικά της, θα ήθελε να ξέρει ακριβώς πόσο από κάθε υλικό θα χρειαστεί πριν ξεκινήσει.

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

1. Αναλογία ζύμης

Πρώτα από όλα, κάθε υπέροχη πίτσα ξεκινά με μια νόστιμη ζύμη!

Η Lilly προτιμά τις λεπτές, τραγανές πίτσες με πιο χοντρή κόρα. Η ζύμη που χρειάζεται για το κέντρο είναι σταθερή, 200g, αλλά κάθε 20cm κόρας απαιτούν 45g ζύμης.

Ευτυχώς, η Lilly υπολόγισε την εξίσωση για τα γραμμάρια ζύμης (g) με βάση τον αριθμό των πιτσών (n) και τη διάμετρό τους (d):

g = n * (((45 * pi * d) / 20) + 200)

Η Lilly χρειάζεται μια συνάρτηση που:

  • Παίρνει τον αριθμό των πιτσών (n) και τη διάμετρό τους (d)
  • Και επιστρέφει τη ζύμη που χρειάζεται, στρογγυλοποιημένη στο κοντινότερο γραμμάριο (g).

Για παράδειγμα, για να φτιάξεις 4 πίτσες με διάμετρο 30cm:

(dough-calculator 4 30) ; => 1648

2. Λίγη σάλτσα

Η Lilly είναι σχολαστική όταν απλώνει τη σάλτσα της, αλλά το μέγεθος των πιτσών της μπορεί να μην είναι σταθερό.

Για να βρει τη διάμετρο (d), χρησιμοποιεί την παρακάτω εξίσωση, με τη σάλτσα που έχει απλώσει (s) ως μεταβλητή:

d = square-root of ((40 * s) / (3 * pi))

Η Lilly χρειάζεται μια συνάρτηση που υπολογίζει τη διάμετρο της πίτσας (d) από κάθε χιλιοστόλιτρο σάλτσας που έχει απλωθεί (s).

Για παράδειγμα, δεδομένου ότι η Lilly έχει χρησιμοποιήσει 250ml σάλτσας:

(size-from-sauce 250) ; => 32.57

3. Λίγο τυρί, παρακαλώ

Στον πλανήτη της Lilly, όλα τα τυριά έρχονται σε τέλειους κύβους και πωλούνται με βάση το μέγεθος. (Τι περίμενες; Εξωγήινος πλανήτης είναι, άλλωστε...)

Για άλλη μια φορά, η Lilly υπολόγισε μια εξίσωση για τον αριθμό των πιτσών (n) κάποιας διαμέτρου (d) που φτιάχνονται από έναν κύβο τυριού με μήκος πλευράς (l):

n = (2 * (l^3)) / (3* pi * (d^2))

Φτιάξε μια συνάρτηση που:

  • Παίρνει το μήκος της πλευράς ενός κύβου τυριού (l) και τη διάμετρο των πιτσών (d),
  • Και επιστρέφει τον αριθμό των πιτσών (n) που φτιάχνονται, στρογγυλοποιώντας προς τα κάτω.

Για παράδειγμα, δεδομένου ενός κύβου τυριού 25x25x25cm και πιτσών με διάμετρο 30cm:

(pizzas-per-cube 25 30) ; => 3

4. Δίκαιη μοιρασιά

Τέλος, η Lilly θέλει οι πίτσες της να κόβονται σε 8 κομμάτια η καθεμία και να μοιράζονται δίκαια στους φίλους της.

Φτιάξε μια συνάρτηση που:

  • Παίρνει έναν αριθμό πιτσών και έναν αριθμό φίλων
  • και επιστρέφει T αν οι πίτσες μοιράζονται δίκαια στους φίλους και NIL διαφορετικά.

Για παράδειγμα:

;; For splitting 3 pizzas between 4 friends
(fair-share-p 3 4) ; => T
;; For splitting 2 pizzas between 3 friends
(fair-share-p 2 3) ; => NIL
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Common Lisp Exercism

Έτοιμος να ξεκινήσεις την άσκηση Πίτσα Pi;

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