Pizza Pi

Pizza Pi

Exercício de aprendizagem

Introdução

Números inteiros

Um número inteiro é um número sem parte decimal que pertence ao conjunto {..., -2, -1, 0, 1, 2, ...}. Os valores máximo e mínimo de um inteiro dependem do sistema onde o PHP corre. Tipicamente, na maioria dos sistemas modernos, um inteiro é um valor de 64 bits, ou seja, pode representar desde -9_223_372_036_854_775_808 até 9_223_372_036_854_775_807, inclusive.

<?php

$a = 1234;
$a = 1_234_567;

Podes escrever valores literais inteiros noutra base que não a base 10, usando um prefixo de base:

<?php

$a = 0123; // octal number (equivalent to 83 decimal)
$a = 0o123; // octal number (as of PHP 8.1.0)
$a = 0x1A; // hexadecimal number (equivalent to 26 decimal)
$a = 0b11111111; // binary number (equivalent to 255 decimal)

Retirado da documentação do PHP

Números de vírgula flutuante

Em PHP, os números de vírgula flutuante são usados para representar um subconjunto dos números reais. Começam por um ou mais algarismos separados por um separador decimal.

<?php

$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;
$d = 1_234.567; // as of PHP 7.4.0

Armadilhas comuns

Nem todos os números e operações aritméticas podem ser efetuados com números de vírgula flutuante. Usar números de vírgula flutuante para representar euros e cêntimos pode dar origem a erros de arredondamento.

<?php

$result = 0.1 + 0.2; // => 0.30000000000000004

Operadores aritméticos

O PHP disponibiliza vários operadores para efetuar operações aritméticas. O PHP segue a ordem de operações matemática padrão para os seus operadores aritméticos. Os operadores disponibilizados pelo PHP são:

  • Identidade (+)
  • Negação (-)
  • Adição (+)
  • Subtração (-)
  • Multiplicação (*)
  • Divisão (/)
  • Módulo (%)
  • Exponenciação (**)
$moles = +'10';
$aLotOfMoles = 6.022 * 10**23 * $moles;

Instruções

A Lilly adora cozinhar. Quer organizar uma festa de pizza com os amigos. Para aproveitar ao máximo os ingredientes, precisa de saber quanto de cada ingrediente vai precisar antes de começar.

Para resolver isto, a Lilly esboçou um programa para automatizar parte do planeamento, mas precisa da tua ajuda para o terminar. Vais ajudar a Lilly a organizar a festa de pizza proporcionalmente perfeita?

1. Uma proporção de massa

A Lilly é fã de pizzas finas e estaladiças, com uma massa mais fina. A massa necessária para o meio é no mínimo 200 g, mas cada pessoa servida precisa de mais 20 g de massa.

grams = pizzas * ((persons * 20) + 200)

A Lilly precisa de uma função que:

  • Recebe o número de pizzas
  • O número de pessoas que cada pizza vai servir
  • E devolve a massa necessária, arredondada ao grama mais próximo.

Por exemplo, para fazer 4 pizzas que alimentam 8 pessoas:

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateDoughRequirement(4, 8);
// => 1440

2. Um toque de molho

A Lilly é meticulosa a aplicar o molho, mas o tamanho das suas pizzas pode ser irregular. Pela sua experiência, sabe que são precisos 125 mL de molho por pizza. A Lilly precisa de uma função que calcule quantas latas de molho deve comprar.

cans of sauce = pizzas * sauce per pizza / sauce can volume

Por exemplo, dado que a Lilly precisa de fazer 8 pizzas e cada lata tem 250 mL:

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateSauceRequirement(8, 250);
// => 4

3. Queijo, por favor

O queijo vem em cubos perfeitos e é vendido por tamanho.

A fórmula que a Lilly usa não é a fórmula da área da pizza, pois ela não quer que o queijo cubra toda a área. Decidiu usar a seguinte fórmula para determinar quantas pizzas de um determinado diâmetro (diameter) se podem fazer a partir de um cubo de queijo com um determinado comprimento de aresta (cheese_dimension):

pizzas = (cheese_dimension³) / (thickness * PI * diameter)

Cria uma função que:

  • Recebe a medida da aresta de um cubo de queijo
  • Recebe a espessura desejada da camada de queijo
  • Recebe o diâmetro da pizza
  • E usa a fórmula da Lilly para devolver o número de pizzas que se podem fazer, arredondando para baixo.

Por exemplo, dado um cubo de queijo de 25x25x25 cm, uma camada de queijo de 0,5 cm de espessura e pizzas com 30 cm de diâmetro:

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateCheeseCubeCoverage(25, 0.5, 30);
// => 331

4. Uma partilha justa

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

Cria uma função que:

  • Recebe um número de pizzas e um número de amigos
  • E devolve o número de fatias que sobram se cada pessoa levar o mesmo número de fatias.

Por exemplo:

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateLeftOverSlices(2, 4);
// => 0
$pizza_pi->calculateLeftOverSlices(4, 3);
// => 2
Editar via GitHub A ligação abre numa nova janela ou separador
PHP Exercism

Estás pronto para começar Pizza Pi?

Inscreve-te no Exercism para aprenderes e dominares PHP com 11 conceitos122 exercícios, e mentoria humana real, tudo grátis.