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]
dadan
como 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
not
por~
para guardar algunos bytes. Además, utilizando la segunda salida demin
usted 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índiceT
en 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
S
rango inclusivo de 1 a entrada.f
Indique 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]
.o
ta los pares por laa
diferencia bsoluta de la relación del parcFN
y la relación de oro.n3
.h
e 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:
.809
vs1.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 = Input
Predicado 2: Calcule la distancia entre
A/B
y φ.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?$A
A
forAu
;)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-r
es gratis). Y definitivamente no hay necesidad de la forma larga, comoshort_open_tag
está activado por defecto.-r
y$argv
están trabajando bien juntos: pastebin.com/vcgb5pT2<?php
con<?
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