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
la source
|a/b-b/a-1|
est prometteuse, bien qu'une preuve serait en règlea/b
. La suppression du carré unitaire laisse le petit rectangle à droite qui représenteb/a
. Un rectangle d'or réalise donc une différence de 1.Réponses:
Gelée,
161514 octets1 octet enregistré grâce à @miles.
Essayez-le en ligne!
Explication
la source
÷/ạØp¶ÆDżṚ$ÇÞḢ
pour 14 octets, il retourne une liste[a, b]
donnéen
en argument./
. (C'est ce que j'ai fait dans ma solution Pyth.) S'éditera lorsque j'arriverai sur mon ordinateur portable.Pyth -
2423 octetsIl doit y avoir un meilleur moyen de trouver les diviseurs ...
Suite de tests .
la source
hoa.n3cFNm,d/Qdm*Fdty+1P
. TestsMatlab,
9681 octetsGolfé (-15 octets), accessoires à Luis Mendo
Original:
Ce n'est de loin pas une excellente solution, mais ma première tentative de code-golf. Ce que c'est drôle!
la source
not
par~
pour économiser quelques octets. En outre, en utilisant la deuxième sortie demin
vous pouvez vous débarrasser defind
:a=find(~(mod(n,1:n)));[~,c]=min(abs(a./(n./a)-1.618));[a(c) n/a(c)]
n=input('');
au lieu defunction w(n);
puis vous avez une paire supplémentaire()
autour dumod
.05AB1E , 21 octets
Code:
Utilise l' encodage CP-1252 . Essayez-le en ligne!
la source
Mathematica, 51 octets
L'
opérateur de suffixe de Mathematica pour la transposition (affiché en exposantT
dans Mathematica).Mathematica a un intégré
GoldenRatio
, mais 1.618 est beaucoup plus court, surtout parce que le premier nécessite égalementN@
.la source
Pyth,
212018 octetsEssayez-le en ligne. Suite de tests.
Explication
S
plage inclu ive de 1 à l'entrée.f
ilter pour les nombres qui divisent l'entrée!%QT
.[that list, that list reversed]
_B
. Les diviseurs inversés d'un nombre sont la même liste que le nombre divisé par chacun des diviseurs.[numerator, denominator]
.o
rt les paires par laa
différence absolue du rapport de la pairecFN
et du nombre d'or.n3
.h
et imprimez.la source
Javascript (ES6), 73 octets
Nous recherchons des:
Ensuite, la solution est soit [a, n / a] ou [b, n / b] . Nous comparons n / φ - a² avec b² - n / φ pour trouver quelle expression est la plus proche de zéro.
La formule utilisée dans le code sont basées sur φ / 2 qui peut être écrit de manière plus courte que φ avec la même précision:
.809
vs1.618
.Donc:
et:
Complexité
Le nombre d'itérations dépend fortement du nombre de facteurs de n. Le pire des cas se produit lorsque n est premier, car nous devons effectuer toutes les itérations de 1 à n pour trouver ses 2 seuls diviseurs. C'est ce qui se passe avec 199999. Par contre, 9699690 est à 19 lisses et on retrouve rapidement deux diviseurs de part et d'autre du point de rupture √ (n / φ) ≈ 2448.
Cas de test
la source
JavaScript (ES6), 83 octets
Retourne en fait la paire ( a , b ) qui minimise la valeur absolue de a / b - b / a -1, mais cela fonctionne pour tous les cas de test au moins, bien que je suppose que je pourrais économiser 4 octets en utilisant le test 1.618 à la place .
la source
Brachylog , 41 octets
Essayez-le en ligne!
Explication
Prédicat principal:
Prédicat 1: la sortie est un couple
[A:B]
tel queA*B = Input
Prédicat 2: Calculez la distance entre
A/B
et φ.Prédicat 3: convertir un int en un flottant en inversant son inverse
la source
φ
un littéral prédéfini dans Brachylog? Ou où est-il défini dans le code?$A
A
forAu
;)Haskell (Lambdabot), 86 octets
la source
php, 103 octets
Produit un avis (cela n'interrompt pas l'exécution) sur $ i non affecté. Il doit donc être exécuté dans un environnement qui coupe les avis.
la source
php -r '…'
(où-r
est gratuitement). Et certainement pas besoin de la forme longue, commeshort_open_tag
c'est le cas par défaut.-r
et$argv
fonctionnent bien ensemble: pastebin.com/vcgb5pT2<?php
par<?
pour économiser trois octets.Python 3, 96 octets
Solution assez simple. Utilise cette réponse SO .
Essayez-le en ligne
La même solution en Python 2 est d'un octet de plus.
la source