Pizza Pi

Pizza Pi

Exercício de aprendizagem

Introdução

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

Números inteiros

Como muitas linguagens, o Common Lisp tem números inteiros. São números inteiros sem ponto 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 negativos).

Em geral, se você estiver trabalhando apenas com números inteiros, prefira os inteiros, pois eles não sofrem a mesma perda de precisão que os números de ponto flutuante sofrem ao longo de muitos cálculos.

Números de ponto flutuante

Como muitas linguagens, o Common Lisp tem números de ponto flutuante. São números fracionários ou inteiros que incluem um ponto decimal (como 3.14, -1.7, 99.99, 2048.0).

Aritmética

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

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 tanto incomum (+ 2 2), ela torna muito mais fácil operar com mais de um número ao mesmo tempo.

Matemática básica

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

Ao considerar a divisão, você pode querer saber o resto de uma divisão. Isso é feito pela 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

Comparando números

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

Instruções

Lilly, a alienígena de Lisp, adora cozinhar. Ela quer fazer uma festa de pizza com os amigos, mas, para aproveitar ao máximo os ingredientes, quer saber exatamente de quanto vai precisar de cada um antes de começar.

Para resolver isso, Lilly esboçou um programa que automatiza parte do planejamento, mas precisa da sua ajuda para terminá-lo. Você vai ajudar a Lilly a fazer a festa de pizza perfeitamente proporcional?

1. Uma proporção de massa

Antes de tudo, toda boa pizza começa com uma massa deliciosa!

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

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

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

Lilly precisa de uma função que:

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

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

(dough-calculator 4 30) ; => 1648

2. Um toque de molho

Lilly é meticulosa ao aplicar o molho, mas o tamanho das pizzas dela pode variar.

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

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

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

Por exemplo, se Lilly usou 250ml de molho:

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

3. Um pouco de queijo, por favor

No planeta de Lilly, todo queijo vem em cubos perfeitos e é vendido por tamanho. (O que você esperava? Afinal, é um planeta alienígena...)

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

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

Crie uma função que:

  • Receba o lado de um cubo de queijo (l) e o diâmetro das pizzas (d),
  • E retorne o número de pizzas (n) feitas, arredondando para baixo.

Por exemplo, dado um cubo de queijo de 25x25x25cm e pizzas de 30cm de diâmetro:

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

4. Uma divisão justa

Por fim, Lilly quer que cada pizza seja dividida em 8 fatias e distribuída igualmente entre os amigos.

Crie uma função que:

  • Receba um número de pizzas e um número de amigos
  • e retorne T se as pizzas puderem ser distribuídas igualmente entre os 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 O link abre em uma nova janela ou aba
Common Lisp Exercism

Tudo pronto para começar Pizza Pi?

Crie sua conta no Exercism para aprender e dominar Common Lisp com 27 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.