Desafío
Origami (papel plegable) es una forma creativa de arte. Hasta donde yo sé, el maestro de Origami prefiere el papel cuadrado. Comencemos desde el principio: convierta un papel rectangular en uno cuadrado.
Entonces el papel se divide en cuadrados. Eliminamos el cuadrado más grande que comparte un borde más corto con la forma actual, paso a paso (ver la imagen a continuación). Y si la parte restante después de un paso es menor o igual que 0.001 * (area of the original paper)
, el papel no se puede dividir más. Es posible que al final no quede nada.
Su tarea es calcular cuántos cuadrados se forman durante el proceso. El cuadrado en el último paso que hace que el papel no se pueda dividir se cuenta en la salida.
Ejemplo (un papel de 1.350
ancho / alto), la salida es 10:
Entrada y salida
Entrada: relación ancho / alto para el papel rectangular, un decimal (o un entero sin el punto) de 1.002
a 1.999
con un paso mínimo de 0.001
. También puede usar cualquier otro formato razonable que describa la relación. Solo mencionalo en tu respuesta.
Salida: recuento cuadrado, un entero.
Ejemplo de E / S
Se utiliza un formato de mapeo para mantener ordenada la página, mientras que su código no necesita admitir una entrada de lista ni ser una función de mapeo.
1.002 => 251
1.003 => 223
1.004 => 189
1.005 => 161
1.006 => 140
1.007 => 124
1.008 => 111
1.009 => 100
Lista de todas las respuestas.
Gracias a @LuisMendo, aquí está el gráfico de respuestas.
Observaciones
- Este es un código de golf, por lo que el código más corto gana
- Presta atención a las lagunas estándar
- Es su libertad decidir cómo manejar la entrada y salida, pero deben seguir las restricciones estándar.
Por cierto...
- Comenta si tienes algo poco claro sobre el desafío
- Personalmente, sugeriría que su respuesta contenga una explicación si está utilizando un lenguaje de golf
- Gracias a @GregMartin, lea su respuesta para una buena explicación matemática del desafío.
Código de ejemplo
Aquí hay una versión no codificada del 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 los cálculos relacionados en el código de ejemplo necesitan una precisión de 6 dígitos decimales, que está cubierto float
.