Sfida
Origami (carta pieghevole) è una forma d'arte creativa. Per quanto ne so, il maestro di Origami preferisce la carta quadrata. Partiamo dall'inizio: converti una carta rettangolare in una quadrata.
Quindi la carta è divisa in quadrati. Rimuoviamo il quadrato più grande che condivide un bordo più corto con la forma corrente, passo dopo passo (vedi l'immagine sotto). E se la parte rimanente dopo un passaggio è inferiore o uguale a 0.001 * (area of the original paper), la carta non può essere ulteriormente divisa. È possibile che alla fine non rimanga nulla.
Il tuo compito è calcolare quanti quadrati vengono realizzati durante il processo. Il quadrato nell'ultimo passaggio che rende impossibile dividere la carta viene conteggiato nell'output.
Esempio (un foglio di 1.350larghezza / altezza), l'output è 10:
Ingresso e uscita
Input: rapporto larghezza / altezza per la carta rettangolare, un decimale (o un numero intero senza punto) da 1.002a 1.999con un passo minimo di 0.001. È inoltre possibile utilizzare qualsiasi altro formato ragionevole che descriva il rapporto. Basta menzionarlo nella tua risposta.
Output: conteggio dei quadrati, un numero intero.
Esempio I / O
Un formato di mapping viene utilizzato per mantenere la pagina in ordine, mentre il codice non deve supportare un input di elenco né essere una funzione di mapping.
1.002 => 251
1.003 => 223
1.004 => 189
1.005 => 161
1.006 => 140
1.007 => 124
1.008 => 111
1.009 => 100
Grazie a @LuisMendo, ecco il grafico delle risposte.
Osservazioni
- Questo è un code-golf quindi vince il codice più breve
- Prestare attenzione alle scappatoie standard
- È tua libertà decidere come gestire l'input e l'output ma devono seguire le restrizioni standard.
A proposito...
- Commenta se hai qualcosa di poco chiaro sulla sfida
- Personalmente suggerirei che la tua risposta contenga una spiegazione se stai usando un linguaggio da golf
- Grazie a @GregMartin, leggi la sua risposta per una buona spiegazione matematica della sfida.
Codice di esempio
Ecco una versione non modificata del codice 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;
}
Tutti i calcoli relativi al codice di esempio richiedono un'accuratezza di 6 cifre decimali, che è coperta in float.

