Στη 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 να κάνει το αναλογικά τέλειο πάρτι πίτσας;
Πρώτα από όλα, κάθε υπέροχη πίτσα ξεκινά με μια νόστιμη ζύμη!
Η Lilly προτιμά τις λεπτές, τραγανές πίτσες με πιο χοντρή κόρα. Η ζύμη που χρειάζεται για το κέντρο είναι σταθερή, 200g, αλλά κάθε 20cm κόρας απαιτούν 45g ζύμης.
Ευτυχώς, η Lilly υπολόγισε την εξίσωση για τα γραμμάρια ζύμης (g) με βάση τον αριθμό των πιτσών (n) και τη διάμετρό τους (d):
g = n * (((45 * pi * d) / 20) + 200)
Η Lilly χρειάζεται μια συνάρτηση που:
Για παράδειγμα, για να φτιάξεις 4 πίτσες με διάμετρο 30cm:
(dough-calculator 4 30) ; => 1648
Η Lilly είναι σχολαστική όταν απλώνει τη σάλτσα της, αλλά το μέγεθος των πιτσών της μπορεί να μην είναι σταθερό.
Για να βρει τη διάμετρο (d), χρησιμοποιεί την παρακάτω εξίσωση, με τη σάλτσα που έχει απλώσει (s) ως μεταβλητή:
d = square-root of ((40 * s) / (3 * pi))
Η Lilly χρειάζεται μια συνάρτηση που υπολογίζει τη διάμετρο της πίτσας (d) από κάθε χιλιοστόλιτρο σάλτσας που έχει απλωθεί (s).
Για παράδειγμα, δεδομένου ότι η Lilly έχει χρησιμοποιήσει 250ml σάλτσας:
(size-from-sauce 250) ; => 32.57
Στον πλανήτη της Lilly, όλα τα τυριά έρχονται σε τέλειους κύβους και πωλούνται με βάση το μέγεθος. (Τι περίμενες; Εξωγήινος πλανήτης είναι, άλλωστε...)
Για άλλη μια φορά, η Lilly υπολόγισε μια εξίσωση για τον αριθμό των πιτσών (n) κάποιας διαμέτρου (d) που φτιάχνονται από έναν κύβο τυριού με μήκος πλευράς (l):
n = (2 * (l^3)) / (3* pi * (d^2))
Φτιάξε μια συνάρτηση που:
Για παράδειγμα, δεδομένου ενός κύβου τυριού 25x25x25cm και πιτσών με διάμετρο 30cm:
(pizzas-per-cube 25 30) ; => 3
Τέλος, η 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
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Common Lisp με 27 έννοιες92 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.