Desafio
Origami (papel dobrável) é uma forma criativa de arte. Tanto quanto eu sei, o mestre de Origami prefere papel quadrado. Vamos começar do começo - converta um papel retangular em um quadrado.
Então o papel é dividido em quadrados. Removemos o maior quadrado que compartilha uma aresta mais curta com a forma atual, passo a passo (veja a figura abaixo). E se a parte restante após uma etapa for menor ou igual a 0.001 * (area of the original paper)
, o papel não poderá mais ser dividido. É possível que nada permaneça finalmente.
Sua tarefa é calcular quantos quadrados são feitos durante o processo. O quadrado da última etapa que impossibilita a divisão do papel é contado na saída.
Exemplo (um papel de 1.350
largura / altura), a saída é 10:
Entrada e saída
Entrada: proporção largura / altura do papel retangular, um decimal (ou um número inteiro sem o ponto) de 1.002
para 1.999
com uma etapa mínima de 0.001
. Você também pode usar qualquer outro formato razoável que descreva a proporção. Apenas mencione isso na sua resposta.
Saída: contagem quadrada, um número inteiro.
Exemplo de E / S
Um formato de mapeamento é usado para manter a página organizada, enquanto seu código não precisa suportar uma entrada de lista nem ser uma função de mapeamento.
1.002 => 251
1.003 => 223
1.004 => 189
1.005 => 161
1.006 => 140
1.007 => 124
1.008 => 111
1.009 => 100
Graças a @LuisMendo, aqui está o gráfico de respostas.
Observações
- Este é um código de golfe, então o código mais curto ganha
- Preste atenção às brechas padrão
- É sua liberdade decidir como lidar com entradas e saídas, mas elas devem seguir as restrições padrão.
A propósito...
- Comente se você tem alguma dúvida sobre o desafio
- Pessoalmente, sugiro que sua resposta contenha uma explicação se você estiver usando um idioma de golfe
- Graças a @GregMartin, leia sua resposta para obter uma boa explicação matemática para o desafio.
Código de exemplo
Aqui está uma versão simplificada do código C ++:
#include <iostream>
#include <utility>
int f (double m)
{
double n = 1, k = 0.001;
int cnt = 0;
k *= m; // the target minimum size
while(m*n >= k)
{
m -= n; // extract a square
if(n > m)
std::swap(n, m); // keep m > n
++ cnt;
}
return cnt;
}
int main()
{
double p;
std::cin >> p;
std::cout << f(p);
return 0;
}
Todos os cálculos relacionados no código de exemplo precisam de uma precisão de 6 dígitos decimais, abrangidos float
.