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.350
szerokoś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.002
do 1.999
z 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
.