Défi
L'origami (papier pliant) est une forme d'art créative. Pour autant que je sache, le maître d'Origami préfère le papier carré. Commençons par le début - convertissons un papier rectangulaire en papier carré.
Le papier est donc divisé en carrés. Nous supprimons le plus grand carré qui partage un bord plus court avec la forme actuelle, étape par étape (voir l'image ci-dessous). Et si la partie restante après une étape est inférieure ou égale à 0.001 * (area of the original paper)
, le papier ne peut plus être divisé. Il est possible que rien ne reste enfin.
Votre tâche consiste à calculer le nombre de carrés créés au cours du processus. Le carré de la dernière étape qui empêche le papier d'être divisé est compté dans la sortie.
Exemple (un papier de 1.350
largeur / hauteur), la sortie est 10:
Entrée et sortie
Entrée: rapport largeur / hauteur pour le papier rectangulaire, une décimale (ou un entier sans le point) de 1.002
à 1.999
avec un pas minimal de 0.001
. Vous pouvez également utiliser tout autre format raisonnable décrivant le rapport. Mentionnez-le simplement dans votre réponse.
Sortie: nombre carré, un entier.
Exemple d'E / S
Un format de mappage est utilisé pour garder la page bien rangée, tandis que votre code n'a pas besoin de prendre en charge une entrée de liste ni d'être une fonction de mappage.
1.002 => 251
1.003 => 223
1.004 => 189
1.005 => 161
1.006 => 140
1.007 => 124
1.008 => 111
1.009 => 100
Grâce à @LuisMendo, voici le graphique des réponses.
Remarques
- Ceci est un code-golf donc le code le plus court gagne
- Faites attention aux failles standard
- C'est à vous de décider comment gérer les entrées et les sorties, mais elles doivent respecter les restrictions standard.
Au fait...
- Commentez si vous avez quelque chose de peu clair sur le défi
- Personnellement, je dirais que votre réponse contient une explication si vous utilisez une langue de golf
- Merci à @GregMartin, lisez sa réponse pour une bonne explication mathématique du défi.
Exemple de code
Voici une version non golfée du code 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;
}
Tous les calculs liés à l'exemple de code nécessitent une précision de 6 chiffres décimaux, qui est couverte par float
.