Um número inteiro positivo n pode ser representado como um retângulo com lados inteiros a , b , de modo que n = a * b . Ou seja, a área representa o número. Em geral, um e b não são únicos para um dado n .
Como é sabido, um retângulo é especialmente agradável aos olhos (ou é o cérebro?) Quando seus lados estão na proporção áurea , φ = (sqrt (5) +1) / 2 ≈ 1,6180339887 ...
Combinando esses dois fatos, o objetivo desse desafio é decompor um número inteiro n no produto de dois números inteiros a , b cuja razão seja o mais próximo possível de φ (com a métrica usual em ℝ). O fato de φ ser irracional implica que existe um par de soluções exclusivo ( a , b ).
O desafio
Dado um número inteiro positivo n , números inteiros positivos de saída a , b de tal forma que um * b = n e a diferença absoluta entre a / b e φ é minimizado.
Como exemplo, considere n = 12. Os pares ( a , b ) que satisfazem a * b = n são: (1, 12), (2,6), (3,4), (4,3), ( 6,2), (12,1). O par cuja razão está mais próxima de φ é (4,3), o que dá 4/3 = 1,333.
Regras
Funções ou programas são aceitáveis.
O numerador ( a ) deve aparecer primeiro na saída e o denominador ( b ) em segundo . Fora isso, os formatos de entrada e saída são flexíveis, como de costume. Por exemplo, os dois números podem ser impressos como cadeias de caracteres com qualquer separador razoável ou como uma matriz.
O código deve funcionar em teoria para números arbitrariamente grandes. Na prática, pode ser limitado por restrições de memória ou tipo de dados.
É suficiente considerar uma versão aproximada de φ , desde que seja precisa até a terceira casa decimal ou melhor. Ou seja, a diferença absoluta entre o valor verdadeiro φ e o valor aproximado não deve exceder 0,0005. Por exemplo, 1.618 é aceitável.
Ao usar uma versão aproximada e racional de φ, há uma pequena chance de que a solução não seja única. Nesse caso, você pode emitir qualquer par a , b que satisfaça o critério de minimização.
O menor código vence.
Casos de teste
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
fonte
|a/b-b/a-1|
é promissor, embora uma prova estaria em ordema/b
. A remoção do quadrado da unidade deixa o pequeno retângulo à direita que representab/a
. Por conseguinte, um rectângulo dourado atinge uma diferença de 1.Respostas:
Geléia,
161514 bytesGuardou 1 byte graças a @miles.
Experimente online!
Explicação
fonte
÷/ạØp¶ÆDżṚ$ÇÞḢ
14 bytes, ele retorna uma lista[a, b]
fornecidan
como argumento./
. (Foi o que fiz na minha solução Pyth.) Editará quando eu entrar no meu laptop.Pitão -
2423 bytesTem que haver uma maneira melhor de encontrar os divisores ...
Conjunto de Teste .
fonte
hoa.n3cFNm,d/Qdm*Fdty+1P
. TestesMatlab,
9681 bytesGolfe (-15bytes), adereços para Luis Mendo
Original:
Essa não é de longe uma ótima solução, mas minha primeira tentativa no código-golfe. Que divertido!
fonte
not
por~
para salvar alguns bytes. Além disso, usando a segunda saída demin
você pode se livrar defind
:a=find(~(mod(n,1:n)));[~,c]=min(abs(a./(n./a)-1.618));[a(c) n/a(c)]
n=input('');
vez defunction w(n);
ter um par extra()
ao redor domod
.05AB1E , 21 bytes
Código:
Usa a codificação CP-1252 . Experimente online!
fonte
Mathematica, 51 bytes
O
operador postfix do Mathematica para transposição (exibido como sobrescritoT
no Mathematica).O Mathematica possui um built-in
GoldenRatio
, mas o 1.618 é muito mais curto, especialmente porque o primeiro também exigeN@
.fonte
Pitão,
212018 bytesExperimente online. Suíte de teste.
Explicação
S
intervalo inclusivo de 1 a entrada.f
filtro para números que dividem a entrada!%QT
.[that list, that list reversed]
_B
. Os divisores invertidos de um número são a mesma lista que o número dividido por cada um dos divisores.[numerator, denominator]
.o
rt os pares pelaa
diferença bsolute da relação do parcFN
e da razão dourada.n3
.h
e imprima.fonte
Javascript (ES6), 73 bytes
Nós procuramos por:
Então, a solução é [a, n / a] ou [b, n / b] . Comparamos n / φ - a² com b² - n / φ para descobrir qual expressão está mais próxima de zero.
A fórmula real usado no código são baseados em φ / 2, que pode ser escrita de uma forma mais curta do que φ com a mesma precisão:
.809
vs1.618
.Assim sendo:
e:
Complexidade
O número de iterações depende muito do número de fatores de n. O pior caso ocorre quando n é primo, porque precisamos executar todas as iterações de 1 a n para encontrar seus únicos 2 divisores. É o que acontece com 199999. Por outro lado, 9699690 é 19 suave e rapidamente encontramos dois divisores em ambos os lados do ponto de ruptura √ (n / φ) ≈ 2448.
Casos de teste
fonte
JavaScript (ES6), 83 bytes
Na verdade, retorna o par ( a , b ) que minimiza o valor absoluto de a / b - b / a -1, mas isso funciona para todos os casos de teste pelo menos, embora eu ache que eu poderia salvar 4 bytes usando o teste 1.618 .
fonte
Braquilog , 41 bytes
Experimente online!
Explicação
Predicado principal:
Predicado 1: Saída é um par
[A:B]
queA*B = Input
Predicado 2: Calcule a distância entre
A/B
e φ.Predicado 3: Converter um int em um flutuador, invertendo seu inverso
fonte
φ
um literal predefinido no Brachylog? Ou onde é definido no código?$A
A
forAu
;)Haskell (Lambdabot), 86 bytes
fonte
php, 103 bytes
Produz um aviso (isso não interrompe a execução) sobre $ i não atribuído; portanto, ele deve ser executado em um ambiente que silencia avisos.
fonte
php -r '…'
(onde-r
é de graça). E definitivamente não há necessidade do formato longo, comoshort_open_tag
está ativado por padrão.-r
e$argv
estão trabalhando bem juntos: pastebin.com/vcgb5pT2<?php
por<?
para salvar três bytes.Python 3, 96 bytes
Solução bastante simples. Faz uso desta resposta SO .
Experimente online
A mesma solução no Python 2 é um byte a mais.
fonte