Wyzwanie
Origami (składany papier) to kreatywna forma sztuki. O ile mi wiadomo, mistrz Origami woli kwadratowy papier. Zacznijmy od początku - zamień prostokątny papier na kwadratowy.
Więc papier jest podzielony na kwadraty. Usuwamy największy kwadrat, który dzieli jedną krótszą krawędź z bieżącym kształtem, krok po kroku (patrz obrazek poniżej). A jeśli pozostała część po jednym kroku jest mniejsza lub równa 0.001 * (area of the original paper), papier nie może być dalej dzielony. Możliwe, że w końcu nic nie pozostaje.
Twoim zadaniem jest obliczyć, ile kwadratów powstaje podczas procesu. Kwadrat w ostatnim kroku, który uniemożliwia podział papieru, jest liczony do wyniku.
Przykład (papier o 1.350szerokości / wysokości), wydajność wynosi 10:
Wejście i wyjście
Dane wejściowe: stosunek szerokości do wysokości dla papieru prostokątnego, jedna dziesiętna (lub liczba całkowita bez kropki) od 1.002do 1.999z minimalnym krokiem 0.001. Możesz także użyć dowolnego innego rozsądnego formatu opisującego stosunek. Po prostu wspomnij o tym w swojej odpowiedzi.
Wyjście: liczba kwadratowa, jedna liczba całkowita.
Przykład I / O
Format mapowania jest używany, aby utrzymać porządek na stronie, podczas gdy twój kod nie musi obsługiwać danych wejściowych listy ani być funkcją mapowania.
1.002 => 251
1.003 => 223
1.004 => 189
1.005 => 161
1.006 => 140
1.007 => 124
1.008 => 111
1.009 => 100
Dzięki @LuisMendo, oto wykres odpowiedzi.
Uwagi
- To jest golf golfowy, więc wygrywa najkrótszy kod
- Zwróć uwagę na standardowe luki
- To Ty decydujesz, jak postępować z wejściami i wyjściami, ale powinny one przestrzegać standardowych ograniczeń.
Tak poza tym...
- Skomentuj, jeśli masz coś niejasnego na temat wyzwania
- Osobiście sugerowałbym, że twoja odpowiedź zawiera wyjaśnienie, jeśli używasz języka golfowego
- Dzięki @GregMartin, przeczytaj jego odpowiedź na dobre matematyczne wyjaśnienie wyzwania.
Przykładowy kod
Oto nieoznakowana wersja kodu 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;
}
Wszystkie obliczenia związane z przykładowym kodem wymagają dokładności 6 cyfr dziesiętnych, co jest objęte float.

