Un número entero positivo n puede representarse como un rectángulo con lados enteros a , b tal que n = a * b . Es decir, el área representa el número. En general, una y b no son únicos para un determinado n .
Como es bien sabido, un rectángulo es especialmente agradable a la vista (¿o es el cerebro?) Cuando sus lados están en la proporción dorada , φ = (sqrt (5) +1) / 2 ≈ 1.6180339887 ...
Combinando estos dos hechos, el propósito de este desafío es descomponer un número entero n en el producto de dos números enteros a , b cuya relación sea lo más cercana posible a φ (con la métrica usual en ℝ). El hecho de que φ sea irracional implica que hay un par de solución único ( a , b ).
El reto
Dado un número entero positivo n , de salida enteros positivos a , b de tal manera que un * b = n y la diferencia absoluta entre un / b y φ se minimiza.
Como ejemplo, considere n = 12. Los pares ( a , b ) que satisfacen a * b = n son: (1, 12), (2,6), (3,4), (4,3), ( 6,2), (12,1). El par cuya relación es más cercana a φ es (4,3), lo que da 4/3 = 1.333.
Reglas
Las funciones o programas son aceptables.
El numerador ( a ) debe aparecer primero en la salida, y el denominador ( b ) segundo . Aparte de eso, los formatos de entrada y salida son flexibles como de costumbre. Por ejemplo, los dos números se pueden generar como cadenas con cualquier separador razonable o como una matriz.
El código debería funcionar en teoría para números arbitrariamente grandes. En la práctica, puede estar limitado por restricciones de memoria o de tipo de datos.
Es suficiente considerar una versión aproximada de φ , siempre que sea precisa hasta el tercer decimal o mejor. Es decir, la diferencia absoluta entre el verdadero φ y el valor aproximado no debe exceder 0.0005. Por ejemplo, 1.618 es aceptable.
Cuando se utiliza una versión aproximada y racional de φ, existe una pequeña posibilidad de que la solución no sea única. En ese caso, puede generar cualquier par a , b que satisfaga el criterio de minimización.
El código más corto gana.
Casos de prueba
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
fuente

|a/b-b/a-1|es prometedora, aunque una prueba estaría en ordena/b. Al quitar el cuadrado de la unidad se deja el pequeño rectángulo a la derecha que representab/a. Por lo tanto, un rectángulo dorado logra una diferencia de 1.Respuestas:
Jalea,
161514 bytesGuardado 1 byte gracias a @miles.
Pruébalo en línea!
Explicación
fuente
÷/ạØp¶ÆDżṚ$ÇÞḢpara 14 bytes, devuelve una lista[a, b]dadancomo argumento./. (Esto es lo que hice en mi solución Pyth). Se editará cuando me conecte a mi computadora portátil.Pyth -
2423 bytesTiene que haber una mejor manera de encontrar los divisores ...
Test Suite .
fuente
hoa.n3cFNm,d/Qdm*Fdty+1P. PruebasMatlab,
9681 bytesGolfed (-15bytes), accesorios para Luis Mendo
Original:
Esta no es una gran solución, pero mi primer intento de code-golf. ¡Qué divertido!
fuente
notpor~para guardar algunos bytes. Además, utilizando la segunda salida deminusted puede deshacerse defind:a=find(~(mod(n,1:n)));[~,c]=min(abs(a./(n./a)-1.618));[a(c) n/a(c)]n=input('');lugar defunction w(n);tener un par adicional()alrededormod.05AB1E , 21 bytes
Código:
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
Mathematica, 51 bytes
El
es el operador de postfix de Mathematica para la transposición (se muestra como un superíndiceTen Mathematica).Mathematica tiene un incorporado
GoldenRatio, pero 1.618 es mucho más corto, especialmente porque el primero también lo requiereN@.fuente
Pyth,
212018 bytesPruébalo en línea. Banco de pruebas.
Explicación
Srango inclusivo de 1 a entrada.fIndique los números que dividen la entrada!%QT.[that list, that list reversed]_B. Los divisores invertidos de un número son la misma lista que el número dividido por cada uno de los divisores.[numerator, denominator].ota los pares por laadiferencia bsoluta de la relación del parcFNy la relación de oro.n3.he imprima.fuente
Javascript (ES6), 73 bytes
Buscamos:
Entonces, la solución es [a, n / a] o [b, n / b] . Comparamos n / φ - a² con b² - n / φ para averiguar qué expresión está más cerca de cero.
La fórmula real utilizado en el código se basa en φ / 2 que se puede escribir de una manera más corta que φ con la misma precisión:
.809vs1.618.Por lo tanto:
y:
Complejidad
El número de iteraciones depende en gran medida del número de factores de n. El peor de los casos ocurre cuando n es primo, porque tenemos que realizar todas las iteraciones de 1 a n para encontrar sus únicos 2 divisores. Esto es lo que sucede con 199999. Por otro lado, 9699690 es 19-suave y rápidamente encontramos dos divisores a ambos lados del punto de ruptura √ (n / φ) ≈ 2448.
Casos de prueba
fuente
JavaScript (ES6), 83 bytes
En realidad, devuelve el par ( a , b ) que minimiza el valor absoluto de a / b - b / a -1, pero esto funciona para todos los casos de prueba al menos, aunque supongo que podría ahorrar 4 bytes usando la prueba 1.618 en su lugar .
fuente
Brachylog , 41 bytes
Pruébalo en línea!
Explicación
Predicado principal:
Predicado 1: la salida es un par
[A:B]tal queA*B = InputPredicado 2: Calcule la distancia entre
A/By φ.Predicado 3: Convierta un int en un flotante invirtiendo su inverso
fuente
φun literal predefinido en Brachylog? ¿O dónde se define en el código?$AAforAu;)Haskell (Lambdabot), 86 bytes
fuente
php, 103 bytes
Produce un aviso (esto no interrumpe la ejecución) sobre $ i no asignado, por lo que debe ejecutarse en un entorno que silencia los avisos.
fuente
php -r '…'(donde-res gratis). Y definitivamente no hay necesidad de la forma larga, comoshort_open_tagestá activado por defecto.-ry$argvestán trabajando bien juntos: pastebin.com/vcgb5pT2<?phpcon<?para guardar tres bytes.Python 3, 96 bytes
Solución bastante simple. Hace uso de esta respuesta SO .
Pruébalo en línea
La misma solución en Python 2 es un byte más largo.
fuente