Dodatnia liczba całkowita n może być reprezentowana przez prostokąt z bokami liczb całkowitych a , b takimi, że n = a * b . Oznacza to, że obszar reprezentuje liczbę. Na ogół, i b nie są unikatowe dla danego n .
Jak dobrze wiadomo, prostokąt jest szczególnie przyjemny dla oka (czy jest to mózg?), Gdy jego boki są w złotym stosunku , φ = (sqrt (5) +1) / 2 ≈ 1.6180339887 ...
Łącząc te dwa fakty, celem tego wyzwania jest rozkład liczby całkowitej n na iloczyn dwóch liczb całkowitych a , b, których stosunek jest jak najbardziej zbliżony do φ (przy zwykłej metodzie na ℝ). Fakt, że φ jest irracjonalny, oznacza, że istnieje unikalna para rozwiązań ( a , b ).
Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą n , wyjściowe dodatnie liczby całkowite a , b są takie, że a * b = n i absolutna różnica między a / b i φ jest zminimalizowana.
Jako przykład rozważmy n = 12. Pary ( a , b ), które spełniają a * b = n, to: (1, 12), (2,6), (3,4), (4,3), ( 6,2), (12,1). Para, której stosunek jest najbliższy φ, wynosi (4,3), co daje 4/3 = 1,333.
Zasady
Funkcje lub programy są dopuszczalne.
Licznik ( ) powinien pojawić się pierwszy na wyjściu, a mianownik ( b ) drugi . Poza tym formaty wejściowe i wyjściowe są jak zwykle elastyczne. Na przykład dwie liczby mogą być wyprowadzane jako ciągi znaków z dowolnym rozsądnym separatorem lub jako tablica.
Kod powinien działać teoretycznie dla dowolnie dużych liczb. W praktyce może to być ograniczone pamięcią lub ograniczeniami typu danych.
To wystarczy, aby rozważyć przybliżoną wersję cp , tak długo, jak to jest dokładne aż do trzeciej po przecinku lub lepszej. Oznacza to, że bezwzględna różnica między prawdziwą φ a przybliżoną wartością nie powinna przekraczać 0,0005. Na przykład 1.618 jest akceptowalny.
Podczas korzystania z przybliżonej, racjonalnej wersji φ istnieje niewielkie prawdopodobieństwo, że rozwiązanie nie jest unikalne. W takim przypadku możesz wygenerować dowolną parę a , b, która spełnia kryterium minimalizacji.
Najkrótszy kod wygrywa.
Przypadki testowe
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
źródło
|a/b-b/a-1|
jest obiecujący, chociaż dowód byłby w porządkua/b
. Usunięcie kwadratu jednostki pozostawia mały prostokąt po prawej stronie, który reprezentujeb/a
. Złoty prostokąt osiąga zatem różnicę 1.Odpowiedzi:
Galaretka,
161514 bajtówZapisano 1 bajt dzięki @miles.
Wypróbuj online!
Wyjaśnienie
źródło
÷/ạØp¶ÆDżṚ$ÇÞḢ
14 bajtów zwraca listę[a, b]
podanąn
jako argument./
. (Tak zrobiłem w moim rozwiązaniu Pyth.) Będę edytować, kiedy wejdę na laptopa.Pyth -
2423 bajtyMusi być lepszy sposób na znalezienie dzielników ...
Pakiet testowy .
źródło
hoa.n3cFNm,d/Qdm*Fdty+1P
. TestyMatlab,
9681 bajtówGra w golfa (-15 bajtów), rekwizyty dla Luisa Mendo
Oryginalny:
To zdecydowanie nie jest świetne rozwiązanie, ale moja pierwsza próba gry w golfa. Co za zabawa!
źródło
not
przez,~
aby zaoszczędzić kilka bajtów. Ponadto, korzystając z drugiego wyjściamin
, możesz pozbyć sięfind
:a=find(~(mod(n,1:n)));[~,c]=min(abs(a./(n./a)-1.618));[a(c) n/a(c)]
n=input('');
zamiastfunction w(n);
tego masz dodatkową parę()
wokółmod
.05AB1E , 21 bajtów
Kod:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
Mathematica, 51 bajtów
Jest
to operator postfiksu Mathematica do transpozycji (wyświetlany jako indeks górnyT
w Mathematica).Mathematica ma wbudowane
GoldenRatio
, ale 1.618 jest znacznie krótszy, zwłaszcza, że ten pierwszy również wymagaN@
.źródło
Pyth,
212018 bajtówWypróbuj online. Zestaw testowy.
Wyjaśnienie
S
zakres włączenia od 1 do wejścia.f
ilter dla liczb dzielących dane wejściowe!%QT
.[that list, that list reversed]
_B
. Odwrócone dzielniki liczby są tą samą listą, co liczba podzielona przez każdy z dzielników.[numerator, denominator]
.o
rt pary przeza
bsolute różnicę stosunku parycFN
i złotego podziału.n3
.h
i wydrukuj.źródło
JavaScript (ES6), 73 bajty
Szukamy:
Następnie rozwiązaniem jest [a, n / a] lub [b, n / b] . Porównujemy n / φ - a² z b² - n / φ aby dowiedzieć się, które wyrażenie jest najbliższe zeru.
Rzeczywista formuła zastosowana w kodzie oparta jest na φ / 2, które można zapisać w krótszy sposób niż φ z tą samą precyzją:
.809
vs1.618
.W związku z tym:
i:
Złożoność
Liczba iteracji silnie zależy od liczby czynników n. Najgorszy przypadek występuje, gdy n jest liczbą pierwszą, ponieważ musimy wykonać wszystkie iteracje od 1 do n, aby znaleźć tylko 2 dzielniki. Tak dzieje się w przypadku 199999. Z drugiej strony 9699690 ma 19-gładkie i szybko znajdujemy dwa dzielniki po obu stronach punktu przerwania √ (n / φ) ≈ 2448.
Przypadki testowe
źródło
JavaScript (ES6), 83 bajty
Właściwie zwraca parę ( a , b ), która minimalizuje wartość bezwzględną a / b - b / a -1, ale działa to przynajmniej dla wszystkich przypadków testowych, chociaż myślę, że mógłbym zaoszczędzić 4 bajty za pomocą testu 1.618 zamiast tego .
źródło
Brachylog , 41 bajtów
Wypróbuj online!
Wyjaśnienie
Główny predykat:
Predykat 1: Dane wyjściowe to kilka
[A:B]
takich, żeA*B = Input
Predykat 2: Oblicz odległość między
A/B
i φ.Predykat 3: Konwertuj liczbę całkowitą na liczbę zmiennoprzecinkową, odwracając jej odwrotność
źródło
φ
predefiniowany dosłowność w Brachylog? Lub gdzie jest to zdefiniowane w kodzie?$A
A
forAu
;)Haskell (Lambdabot), 86 bajtów
źródło
php, 103 bajty
Powoduje powiadomienie (nie przerywa wykonywania) o nieprzypisanym $ i, dlatego powinno być uruchamiane w środowisku, które wycisza powiadomienia.
źródło
php -r '…'
(gdzie-r
jest za darmo). I zdecydowanie nie potrzeba długiej formy, ponieważshort_open_tag
jest ona domyślnie włączona.-r
i$argv
współpracują dobrze: pastebin.com/vcgb5pT2<?php
z<?
aby zapisać trzech bajtów.Python 3, 96 bajtów
Całkiem proste rozwiązanie. Wykorzystuje tę SO odpowiedź .
Wypróbuj online
To samo rozwiązanie w Pythonie 2 jest dłuższe o jeden bajt.
źródło