Eine positive ganze Zahl n kann als Rechteck mit ganzzahligen Seiten a , b dargestellt werden, so dass n = a * b ist . Das heißt, der Bereich repräsentiert die Nummer. Im Allgemeinen sind a und b für ein gegebenes n nicht eindeutig .
Bekanntlich gefällt ein Rechteck dem Auge (oder dem Gehirn?) Besonders gut, wenn sich seine Seiten im goldenen Schnitt befinden : φ = (sqrt (5) +1) / 2 ≈ 1.6180339887 ...
Kombiniert man diese beiden Tatsachen, besteht der Zweck dieser Aufgabe darin, eine ganze Zahl n in das Produkt zweier ganzer Zahlen a , b zu zerlegen , deren Verhältnis so nahe wie möglich an φ liegt (mit der üblichen Metrik für ℝ). Die Tatsache, dass φ irrational ist, impliziert, dass es ein eindeutiges Lösungspaar ( a , b ) gibt.
Die Herausforderung
Bei einer positiven ganzen Zahl n werden positive ganze Zahlen a , b ausgegeben , so dass a * b = n und die absolute Differenz zwischen a / b und φ minimiert wird.
Als Beispiel n = 12 betrachten. Die Paare ( a , b ), die a * b = n erfüllen, sind: (1, 12), (2,6), (3,4), (4,3), ( 6,2), (12,1). Das Paar, dessen Verhältnis φ am nächsten kommt, ist (4,3), was 4/3 = 1,333 ergibt.
Regeln
Funktionen oder Programme sind akzeptabel.
Der Zähler ( a ) sollte zuerst in der Ausgabe erscheinen und der Nenner ( b ) an zweiter Stelle . Ansonsten sind Ein- und Ausgabeformate wie gewohnt flexibel. Beispielsweise können die beiden Zahlen als Zeichenfolgen mit einem geeigneten Trennzeichen oder als Array ausgegeben werden.
Der Code sollte theoretisch für beliebig große Zahlen funktionieren. In der Praxis kann dies durch Speicher- oder Datentypbeschränkungen begrenzt sein.
Es ist ausreichend, eine ungefähre Version von φ zu berücksichtigen , sofern diese bis zur dritten Dezimalstelle oder besser genau ist . Das heißt, die absolute Differenz zwischen dem wahren φ und dem ungefähren Wert sollte 0,0005 nicht überschreiten. Zum Beispiel ist 1,618 akzeptabel.
Bei Verwendung einer ungefähren, rationalen Version von φ ist die Wahrscheinlichkeit gering, dass die Lösung nicht eindeutig ist. In diesem Fall können Sie jedes Paar a , b ausgeben , das das Minimierungskriterium erfüllt.
Kürzester Code gewinnt.
Testfälle
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
quelle
|a/b-b/a-1|
ist vielversprechend, obwohl ein Beweis angebracht wärea/b
. Wenn Sie das Einheitsquadrat entfernen, bleibt das kleine Rechteck auf der rechten Seite, das für stehtb/a
. Ein goldenes Rechteck erreicht daher eine Differenz von 1.Antworten:
Jelly,
161514 Bytes1 Byte dank @miles gespeichert.
Probieren Sie es online!
Erläuterung
quelle
÷/ạØp¶ÆDżṚ$ÇÞḢ
von 14 Bytes wird eine als Argument[a, b]
angegebene Liste zurückgegebenn
./
. (Das habe ich in meiner Pyth-Lösung getan.) Wird bearbeitet, wenn ich auf meinen Laptop komme.Pyth -
2423 BytesEs muss einen besseren Weg geben, die Teiler zu finden ...
Test Suite .
quelle
hoa.n3cFNm,d/Qdm*Fdty+1P
. TestsMatlab,
9681 BytesGolf (-15 Bytes), Requisiten für Luis Mendo
Original:
Dies ist bei weitem keine großartige Lösung, aber mein erster Versuch, Code-Golf zu spielen. Was für ein Spaß!
quelle
not
durch~
ein paar Bytes zu speichern. Mit der zweiten Ausgabe von könnenmin
Sie außerdem Folgendes entfernenfind
:a=find(~(mod(n,1:n)));[~,c]=min(abs(a./(n./a)-1.618));[a(c) n/a(c)]
n=input('');
stattdessenfunction w(n);
ein zusätzliches Paar von()
um das habenmod
.05AB1E , 21 Bytes
Code:
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
Mathematica, 51 Bytes
Das
ist Mathematicas Postfix - Operator für die Umsetzung (als Exponent angezeigtT
in Mathematica).Mathematica hat eine eingebaute
GoldenRatio
, aber 1.618 ist viel kürzer, vor allem, weil der erstere auch erfordertN@
.quelle
Pyth,
212018 BytesProbieren Sie es online aus. Testsuite.
Erläuterung
S
von 1 bis Eingang.f
Zahlen teilen die Eingabe!%QT
.[that list, that list reversed]
_B
. Die umgekehrten Teiler einer Zahl sind dieselbe Liste wie die Zahl, die durch jeden der Teiler geteilt wird.[numerator, denominator]
.o
rt die Paare durch diea
absolute Differenz des Verhältnisses des PaarescFN
und des goldenen Verhältnisses.n3
.h
und drucken Sie.quelle
Javascript (ES6), 73 Byte
Wir suchen nach:
Dann lautet die Lösung entweder [a, n / a] oder [b, n / b] . Wir vergleichen n / φ - a² mit b² - n / φ , um herauszufinden, welcher Ausdruck am nächsten an Null liegt.
Die tatsächliche Formel im Code verwendet wird , basiert auf φ / 2 , die in einem kürzeren Weg als φ mit der gleichen Präzision geschrieben werden können:
.809
vs1.618
.Deshalb:
und:
Komplexität
Die Anzahl der Iterationen hängt stark von der Anzahl der Faktoren von n ab. Der schlimmste Fall tritt auf, wenn n eine Primzahl ist, weil wir alle Iterationen von 1 bis n ausführen müssen, um die einzigen 2 Teiler zu finden. Dies ist, was mit 199999 passiert. Andererseits ist 9699690 19-glatt und wir finden schnell zwei Teiler auf beiden Seiten der Bruchstelle √ (n / φ) ≈ 2448.
Testfälle
quelle
JavaScript (ES6), 83 Byte
Gibt tatsächlich das ( a , b ) -Paar zurück, das den absoluten Wert von a / b - b / a -1 minimiert , aber dies funktioniert zumindest für alle Testfälle, obwohl ich 4 Bytes sparen könnte, indem ich stattdessen den 1.618-Test verwende .
quelle
Brachylog , 41 Bytes
Probieren Sie es online!
Erläuterung
Hauptprädikat:
Prädikat 1: Output ist ein
[A:B]
solches PaarA*B = Input
Prädikat 2: Berechnen Sie den Abstand zwischen
A/B
und φ.Prädikat 3: Konvertieren Sie ein int in ein float, indem Sie das inverse invertieren
quelle
φ
Ist Brachylog ein vordefiniertes Wort? Oder wo ist es im Code definiert?$A
A
fürAu
;)Haskell (Lambdabot), 86 Bytes
quelle
PHP, 103 Bytes
Erzeugt einen Hinweis (dies unterbricht die Ausführung nicht) zu nicht zugewiesenem $ i und sollte daher in einer Umgebung ausgeführt werden, in der Benachrichtigungen stummgeschaltet werden.
quelle
php -r '…'
(-r
kostenlos). Und definitiv keine Notwendigkeit für die lange Form, wieshort_open_tag
standardmäßig aktiviert ist.-r
und$argv
arbeiten gut zusammen: pastebin.com/vcgb5pT2<?php
mit<?
zu speichern drei Bytes.Python 3, 96 Bytes
Ziemlich einfache Lösung. Nutzt diese SO-Antwort .
Probieren Sie es online aus
Dieselbe Lösung in Python 2 ist ein Byte länger.
quelle