Herausforderung
Origami (Faltpapier) ist eine kreative Kunstform. Soweit ich weiß, bevorzugt der Meister von Origami Karopapier. Beginnen wir von vorne - wandeln Sie ein rechteckiges Papier in ein quadratisches um.
Das Papier ist also in Quadrate unterteilt. Schritt für Schritt entfernen wir das größte Quadrat, das eine kürzere Kante mit der aktuellen Form teilt (siehe Bild unten). Wenn der verbleibende Teil nach einem Schritt kleiner oder gleich ist 0.001 * (area of the original paper), kann das Papier nicht weiter geteilt werden. Es ist möglich, dass endlich nichts mehr übrig bleibt.
Ihre Aufgabe ist es, zu berechnen, wie viele Quadrate während des Prozesses erstellt werden. Das Quadrat im letzten Schritt, durch das das Papier nicht mehr geteilt werden kann, wird in die Ausgabe einbezogen.
Beispiel (ein Papier mit 1.350Breite / Höhe), Ausgabe ist 10:
Ein- und Ausgang
Eingabe: Breiten- / Höhenverhältnis für das rechteckige Papier, eine Dezimalstelle (oder eine Ganzzahl ohne Punkt) von 1.002bis 1.999mit einem minimalen Schritt von 0.001. Sie können auch jedes andere vernünftige Format verwenden, das das Verhältnis beschreibt. Erwähne es einfach in deiner Antwort.
Ausgabe: Quadratzahl, eine ganze Zahl.
Beispiel I / O
Ein Zuordnungsformat wird verwendet, um die Seite aufgeräumt zu halten, während Ihr Code weder eine Listeneingabe unterstützen noch eine Zuordnungsfunktion sein muss.
1.002 => 251
1.003 => 223
1.004 => 189
1.005 => 161
1.006 => 140
1.007 => 124
1.008 => 111
1.009 => 100
Dank @LuisMendo sehen Sie hier die Antwortgrafik.
Bemerkungen
- Dies ist ein Code-Golf, also gewinnt der kürzeste Code
- Achten Sie auf Standardlücken
- Sie können frei entscheiden, wie Sie mit Ein- und Ausgängen umgehen möchten, sie sollten jedoch den Standardbeschränkungen folgen.
Apropos...
- Kommentar, wenn Sie etwas Unklares über die Herausforderung haben
- Persönlich würde ich vorschlagen, dass Ihre Antwort eine Erklärung enthält, wenn Sie eine Golfsprache verwenden
- Dank @ GregMartin, lesen Sie seine Antwort für eine gute mathematische Erklärung für die Herausforderung.
Beispielcode
Hier ist eine ungolfed Version von C ++ Code:
#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;
}
Alle im Beispielcode enthaltenen Berechnungen benötigen eine Genauigkeit von 6 Dezimalstellen, die in behandelt wird float.

