Pizza Pi

Pizza Pi

Exercício de aprendizagem

Introdução

Em Common Lisp, tal como em muitas linguagens, os números existem em vários tipos. Dois dos mais básicos são:

Números inteiros

Tal como muitas linguagens, o Common Lisp tem números inteiros. São números sem parte decimal (como -6, 0, 25, 1234, etc.).

O Common Lisp não define limites para a magnitude dos inteiros. Os inteiros podem ser arbitrariamente grandes (ou pequenos, se forem negativos).

Em geral, se estás a trabalhar apenas com números inteiros, deves dar preferência aos inteiros, porque não sofrem a mesma perda de precisão que os números de vírgula flutuante ao longo de muitos cálculos.

Números de vírgula flutuante

Tal como muitas linguagens, o Common Lisp tem números de vírgula flutuante. São números fracionários ou inteiros que incluem uma parte decimal (como 3.14, -1.7, 99.99, 2048.0).

Aritmética

O Common Lisp usa os operadores aritméticos habituais para a maioria das operações, mas é um pouco invulgar por usar uma "notação prefixa" em vez da mais familiar "notação infixa".

De forma mais visual:

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

Embora a notação prefixa transforme algumas operações, como 2 + 2, na forma um pouco menos familiar (+ 2 2), torna muito mais fácil operar com vários números ao mesmo tempo.

Matemática básica

O Common Lisp tem todas as funções típicas: +, -, *, / para a adição, a subtração, a multiplicação e a divisão.

Ao pensar na divisão, podes querer saber o resto de uma divisão. Isso faz-se com a função mod (de módulo), que recebe um número e um divisor como argumentos:

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

Comparar números

Por fim, pode ser-te útil comparar números diferentes com funções como = (igual), /= (diferente de) e >= (maior ou igual a). Quando estas comparações são verdadeiras (como em (= 1 1)), devolvem T e, quando não são (como em (> 0 1)), devolvem NIL.

Instruções

A Lilly, a alienígena de Lisp, adora cozinhar. Quer dar uma festa de pizza com os amigos, mas, para aproveitar ao máximo os ingredientes, gostaria de saber exatamente de quanto de cada ingrediente vai precisar antes de começar.

Para resolver isto, a Lilly esboçou um programa que automatiza parte do planeamento, mas precisa da tua ajuda para o terminar. Ajudas a Lilly a dar a festa de pizza perfeitamente proporcionada?

1. A proporção da massa

Antes de mais, todas as grandes pizzas começam com uma massa deliciosa!

A Lilly é fã de pizzas finas e crocantes, com uma borda mais grossa. A massa necessária para o meio é sempre 200 g, mas cada 20 cm de borda exige 45 g de massa.

Felizmente, a Lilly calculou a equação que dá os gramas de massa (g) a partir do número de pizzas (n) e do seu diâmetro (d):

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

A Lilly precisa de uma função que:

  • Receba o número de pizzas (n) e o seu diâmetro (d)
  • E devolva a massa necessária, arredondada ao grama mais próximo (g).

Por exemplo, para fazer 4 pizzas com 30 cm de diâmetro:

(dough-calculator 4 30) ; => 1648

2. Um toque de molho

A Lilly é meticulosa a espalhar o molho, mas o tamanho das suas pizzas pode ser irregular.

Para descobrir o diâmetro (d), usa a equação abaixo, com o molho espalhado (s) como variável:

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

A Lilly precisa de uma função que calcule o diâmetro da pizza (d) a partir de cada mililitro de molho espalhado (s).

Por exemplo, se a Lilly usou 250 ml de molho:

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

3. Queijo, por favor

No planeta da Lilly, todo o queijo vem em cubos perfeitos e é vendido por tamanho. (O que estavas à espera? Afinal, este é um planeta alienígena...)

Mais uma vez, a Lilly calculou uma equação para o número de pizzas (n) de um determinado diâmetro (d) que se fazem a partir de um cubo de queijo com aresta (l):

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

Cria uma função que:

  • Receba a aresta de um cubo de queijo (l) e o diâmetro das pizzas (d),
  • E devolva o número de pizzas (n) que se fazem, arredondando por defeito.

Por exemplo, para um cubo de queijo de 25x25x25 cm e pizzas com 30 cm de diâmetro:

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

4. Uma partilha justa

Por fim, a Lilly quer que as suas pizzas se dividam em 8 fatias cada e sejam distribuídas igualmente pelos amigos.

Cria uma função que:

  • Receba um número de pizzas e um número de amigos
  • e devolva T se as pizzas se distribuírem igualmente pelos amigos e NIL caso contrário.

Por exemplo:

;; 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
Editar via GitHub A ligação abre numa nova janela ou separador
Common Lisp Exercism

Estás pronto para começar Pizza Pi?

Inscreve-te no Exercism para aprenderes e dominares Common Lisp com 27 conceitos92 exercícios, e mentoria humana real, tudo grátis.