Положительное целое число n можно представить в виде прямоугольника с целочисленными сторонами a , b, такого что n = a * b . То есть область представляет число. В общем, a и b не являются уникальными для данного n .
Как известно, прямоугольник особенно приятен глазу (или это мозг?), Когда его стороны находятся в золотом сечении , φ = (sqrt (5) +1) / 2 ≈ 1.6180339887 ...
Объединяя эти два факта, цель этой задачи состоит в том, чтобы разложить целое число n в произведение двух целых чисел a , b , отношение которых максимально приближено к φ (с обычной метрикой на ℝ). Тот факт, что φ иррационально, означает, что существует единственная пара решений ( a , b ).
Соревнование
Для заданного натурального числа n выведите натуральные числа a , b, такие что a * b = n, а абсолютная разница между a / b и φ сведена к минимуму.
В качестве примера рассмотрим n = 12. Пары ( a , b ), которые удовлетворяют a * b = n : (1, 12), (2,6), (3,4), (4,3), ( 6,2), (12,1). Пара, отношение которой ближе всего к φ, равно (4,3), что дает 4/3 = 1,333.
правила
Функции или программы приемлемы.
Числитель ( ) должен появиться первым на выходе, а знаменатель ( б ) второй . Кроме этого, форматы ввода и вывода, как обычно, гибкие. Например, два числа могут быть выведены в виде строк с любым разумным разделителем или в виде массива.
Код должен работать теоретически для сколь угодно больших чисел. На практике это может быть ограничено памятью или типом данных.
Достаточно рассмотреть приблизительную версию φ , если она точна с точностью до третьего знака после запятой или лучше. То есть абсолютная разница между истинным φ и приблизительным значением не должна превышать 0,0005. Например, 1.618 является приемлемым.
При использовании приблизительной, рациональной версии φ существует небольшая вероятность того, что решение не является уникальным. В этом случае вы можете вывести любую пару a , b, которая удовлетворяет критерию минимизации.
Самый короткий код выигрывает.
Контрольные примеры
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|
является многообещающей, хотя доказательство будет в порядкеa/b
. Удаление квадрата блока оставляет маленький прямоугольник справа, который представляетb/a
. Поэтому золотой прямоугольник достигает разницы 1.Ответы:
Желе,
161514 байтСохранено 1 байт благодаря @miles.
Попробуйте онлайн!
объяснение
источник
÷/ạØp¶ÆDżṚ$ÇÞḢ
для 14 байтов, он возвращает список,[a, b]
заданныйn
в качестве аргумента./
. (Это то, что я сделал в своем решении Pyth.) Будет редактировать, когда я попаду на свой ноутбук.Pyth -
2423 байтаДолжен быть лучший способ найти делители ...
Тестовый пакет .
источник
hoa.n3cFNm,d/Qdm*Fdty+1P
. ТестыMatlab,
9681 байтГольф (-15 байт), реквизит Луис Мендо
Оригинал:
Это далеко не отличное решение, но моя первая попытка использовать код-гольф. Как весело!
источник
not
на,~
чтобы сохранить несколько байтов. Также, используя второй выход,min
вы можете избавиться отfind
:a=find(~(mod(n,1:n)));[~,c]=min(abs(a./(n./a)-1.618));[a(c) n/a(c)]
n=input('');
вместо того,function w(n);
чтобы иметь дополнительную пару()
вокругmod
.05AB1E , 21 байт
Код:
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
Mathematica, 51 байт
Является постфиксного Mathematica в транспозиции (отображается в виде верхнего индексаT
в Mathematica).Mathematica имеет встроенный
GoldenRatio
, но 1.618 намного короче, особенно потому, что первый также требуетN@
.источник
Pyth,
212018 байтПопробуйте онлайн. Тестирование.
объяснение
S
диапазон от 1 до ввода.f
ilter для чисел для этого делят ввод!%QT
.[that list, that list reversed]
_B
. Обратные делители числа - это тот же список, что и число, деленное на каждый из делителей.[numerator, denominator]
.o
rt пары поa
абсолютной разности отношения парыcFN
и золотого сечения.n3
.h
и распечатать.источник
Javascript (ES6), 73 байта
Мы ищем:
Тогда решение будет либо [a, n / a], либо [b, n / b] . Мы сравниваем n / φ - a² с b² - n / φ чтобы выяснить, какое выражение ближе всего к нулю.
Текущая формула , используемая в коде основана на ф / 2 , который может быть записан в более коротком пути , чем ф с той же точностью:
.809
против1.618
.Следовательно:
и:
сложность
Количество итераций сильно зависит от количества факторов n. Наихудший случай возникает, когда n простое, потому что мы должны выполнить все итерации от 1 до n, чтобы найти только 2 его делителя. Это то, что происходит с 199999. С другой стороны, 9699690 является 19-гладким, и мы быстро находим два делителя по обе стороны от точки разрыва √ (n / φ) ≈ 2448.
Контрольные примеры
источник
JavaScript (ES6), 83 байта
На самом деле возвращает пару ( a , b ), которая минимизирует абсолютное значение a / b - b / a -1, но это работает как минимум для всех тестовых случаев, хотя я думаю, что я мог бы сэкономить 4 байта, используя вместо этого тест 1.618 ,
источник
Брахилог , 41 байт
Попробуйте онлайн!
объяснение
Основной предикат:
Предикат 1: Выходная пара
[A:B]
такая, чтоA*B = Input
Предикат 2: Вычислить расстояние между
A/B
и φ.Предикат 3: преобразовать int в число с плавающей точкой, инвертировав его обратное
источник
φ
предопределенный литерал в брахилоге? Или где это определено в коде?$A
A
дляAu
;)Haskell (Lambdabot), 86 байт
источник
php, 103 байта
Создает уведомление (это не прерывает выполнение) о неназначенном $ i, поэтому его следует запускать в среде, в которой уведомления отключены.
источник
php -r '…'
(где-r
это бесплатно). И определенно нет необходимости в длинной форме, какshort_open_tag
по умолчанию.-r
и$argv
хорошо работаем вместе: pastebin.com/vcgb5pT2<?php
на,<?
чтобы сохранить три байта.Python 3, 96 байт
Довольно простое решение. Использует этот так ответ .
Попробуйте онлайн
То же решение в Python 2 на один байт длиннее.
источник