Un entier positif n peut être représenté comme un rectangle avec des côtés entiers a , b tels que n = a * b . Autrement dit, la zone représente le nombre. En général, a et b ne sont pas uniques pour un n donné .
Comme on le sait, un rectangle est particulièrement agréable à l'œil (ou est-ce le cerveau?) Lorsque ses côtés sont dans le nombre d' or , φ = (sqrt (5) +1) / 2 ≈ 1.6180339887 ...
En combinant ces deux faits, le but de ce défi est de décomposer un entier n en produit de deux entiers a , b dont le rapport est aussi proche que possible de φ (avec la métrique habituelle sur ℝ). Le fait que φ soit irrationnel implique qu'il existe une paire de solutions unique ( a , b ).
Le défi
Étant donné un entier positif n , les entiers positifs de sortie a , b tels que a * b = n et la différence absolue entre a / b et φ sont minimisés.
À titre d'exemple, considérons n = 12. Les paires ( a , b ) qui satisfont a * b = n sont: (1, 12), (2,6), (3,4), (4,3), ( 6,2), (12,1). La paire dont le rapport est le plus proche de φ est (4,3), ce qui donne 4/3 = 1,333.
Règles
Les fonctions ou programmes sont acceptables.
Le numérateur ( a ) doit apparaître en premier dans la sortie, et le dénominateur ( b ) en second . En dehors de cela, les formats d'entrée et de sortie sont flexibles comme d'habitude. Par exemple, les deux nombres peuvent être sortis sous forme de chaînes avec tout séparateur raisonnable ou sous forme de tableau.
Le code devrait fonctionner en théorie pour des nombres arbitrairement grands. En pratique, il peut être limité par des restrictions de mémoire ou de type de données.
Il suffit de considérer une version approximative de φ , tant qu'elle est précise jusqu'à la troisième décimale ou mieux. C'est, la différence absolue entre le vrai φ et la valeur approximative ne doit pas dépasser 0,0005. Par exemple, 1,618 est acceptable.
Lorsque vous utilisez une version approximative et rationnelle de φ, il est peu probable que la solution ne soit pas unique. Dans ce cas, vous pouvez sortir n'importe quelle paire a , b qui satisfait au critère de minimisation.
Le code le plus court gagne.
Cas de test
1 -> 1 1
2 -> 2 1
4 -> 2 2
12 -> 4 3
42 -> 7 6
576 -> 32 18
1234 -> 2 617
10000 -> 125 80
199999 -> 1 199999
9699690 -> 3990 2431
|a/b-b/a-1|
est prometteuse, bien qu'une preuve serait en règle