Sie sind der Besitzer eines Restaurants. Sie eröffnen ein neues Gebiet in Cartesia, wo es nur eine Hauptstraße gibt, die als y-Achse bezeichnet wird. Sie möchten Ihr Restaurant so platzieren, dass Sie die Gesamtentfernung von Ihrem Restaurant und jedem der Häuser in diesem Bereich minimieren.
Eingabe :
Die Eingabe wird sein
n, the number of houses
house1
house2
house3
...
houseN
wo jedes Haus eine Koordinate in der Form ist x y
. Jede Einheit entspricht einem Kilometer.
Sie können Eingaben als Zeichenfolge verwenden oder eine Funktion bereitstellen, die die Eingabe in einem beliebigen Format als Argument verwendet.
Ausgabe : Die y-Koordinate Ihres Restaurants (denken Sie daran, dass sie sich auf der y-Achse befindet). Eigentlich wird es am Straßenrand liegen, aber der Unterschied ist vernachlässigbar.
Wenn n-tes Haus die Entfernungsfunktion ist h_n
und D
ist, möchten Sie im Wesentlichen eine k
solche finden , D(h_0, (0, k)) + D(h_1, (0, k)) + D(h_2, (0, k)) + ... + D(h_n, (0, k))
die minimiert ist.
Beachten Sie, dass die Entfernung so berechnet wird, als ob der Kunde in einer genau geraden Linie von seinem Haus zum Restaurant fährt. Das ist die Entfernung von (x, y)
zu Ihrem Restaurant sqrt(x^2 + (y - k)^2)
.
Die Ausgabe sollte auf mindestens 2 Dezimalstellen genau sein.
Die Ausgabe kann als Zeichenfolge gedruckt oder von der Funktion zurückgegeben werden.
Beispiel Ein- / Ausgabe:
Input:
2
5.7 3.2
8.9 8.1
Output:
5.113013698630137
Die Gesamtentfernung in diesem Beispiel beträgt ungefähr 15.4003
Kilometer.
Dies ist Code Golf - der kürzeste Code gewinnt.
PS Ich interessiere mich auch für eine mathematische Lösung, die nicht nur brachial ist. Es wird nicht den Code Golf gewinnen, aber es wird einige positive Stimmen bekommen. Hier ist, wie ich das Beispielproblem gemacht habe:
Sei Punkt A bei A (5.7, 3.2) und B bei B (8.9, 8.1). Der Lösungspunkt bei (0, k) sei C. Reflektiere A über die y-Achse, um A 'bei (-5.7, 3.2) zu erhalten. Der Abstand von A 'zu C ist gleich dem Abstand von A zu C. Daher kann das Problem auf den Punkt C reduziert werden, so dass A'C + CB minimiert wird. Offensichtlich wäre dies der Punkt C, der auf der Linie A'B liegt.
Ich weiß nicht, ob dies gut auf 3 oder mehr Punkte verallgemeinern würde.
quelle
D
? Euklidisch?sqrt(diffX^2 + diffY^2)
? Dann Euklidisch. Ich weiß, dass es nicht perfekt zum Szenario passt, gehe aber davon aus, dass der Kunde in einer geraden Linie von seinem / ihrem Haus aus reist.Antworten:
C
315302 BytesDas ist alles andere als hübsch und auch nicht zu kurz. Ich dachte, da ich den Längenwettbewerb nicht gewinnen werde, kann ich versuchen, den (theoretischen) Genauigkeitswettbewerb zu gewinnen! Der Code ist wahrscheinlich ein oder zwei Zehnerpotenzen schneller als die Bruteforce-Lösung und stützt sich auf ein bisschen mathematischen Blödsinn.
Wir definieren eine Funktion,
g(N,S)
die die Anzahl der HäuserN
und eine Reihe von Häusern als Eingabe verwendetS[][2]
.Hier ist es mit einem Testfall enträtselt:
Welche Ausgänge:
Warnung: Für ein umfassendes Verständnis sind möglicherweise Kenntnisse in einigen Berechnungen erforderlich!
Reden wir also über die Mathematik.
Wir kennen die Entfernung von unserem gewünschten Punkt
(0, k)
und einem Hausi
:Und so kann die Gesamtentfernung
D
vonn
Häusern wie folgt definiert werden:Wir möchten diese Funktion minimieren, indem wir eine Ableitung in Bezug auf nehmen
k
und gleich setzen0
. Lass es uns versuchen. Wir wissen, dass die Derivate vonD
wie folgt beschrieben werden können:Aber die erste Teilableitung von jedem
Di
ist ziemlich schlecht ...Leider wird es auch mit sehr schnell katastrophal
n == 2
, diese Derivate zu setzen0
und nach ihnenk
zu suchen. Wir brauchen eine robustere Methode, auch wenn sie eine Annäherung erfordert.Geben Sie Taylor-Polynome ein.
Wenn wir den Wert
D(k0)
sowie alleD
Derivate von kennenk0
, können wirD
als Taylor-Serie umschreiben :Nun, diese Formel enthält eine Menge Dinge, und ihre Ableitungen können ziemlich unhandlich werden, aber wir haben jetzt eine polynomielle Approximation von
D
!Wenn wir ein wenig rechnen, finden wir die nächsten zwei Ableitungen von,
D
indem wir die Ableitungen vonDi
wie zuvor auswerten :Durch Abschneiden und Auswerten der Ableitungen können wir uns nun
D
einem Polynom 3. Grades der Form annähern :Wo
A, B, C, D
sind einfach reelle Zahlen.Nun können wir dies minimieren. Wenn wir eine Ableitung nehmen und gleich 0 setzen, erhalten wir eine Gleichung der Form:
Unter Berücksichtigung von Kalkül und Substitutionen finden wir diese Formeln für
a, b, and c
:Jetzt gibt unser Problem uns 2 Lösungen, die durch die quadratische Formel gegeben sind:
Die gesamte Formel für
k
wäre eine enorme Belastung für das Ausschreiben, also machen wir es hier und im Code in Stücken.Da wissen wir das umso höher
k
immer den Mindestabstand unserer Näherung ergibtD
(ich habe einen wirklich wunderbaren Beweis dafür, für den der Rand dieses Papiers nicht ausreicht ...), müssen wir nicht einmal den kleineren berücksichtigen Die Lösungen.Ein letztes Problem bleibt bestehen. Aus Gründen der Genauigkeit ist es erforderlich, dass wir mit a beginnen
k0
, das sich zumindest in dem Bereich befindet, in dem wir die Antwort erwarten. Zu diesem Zweck wählt mein Code das geometrische Mittel der y-Werte jedes Hauses.Aus Sicherheitsgründen wiederholen wir das gesamte Problem neunmal und ersetzen es
k0
durchk
, bei jeder Iteration Genauigkeit zu gewährleisten.Ich habe nicht nachgerechnet, wie viele Iterationen und wie viele Ableitungen wirklich notwendig sind, aber ich habe mich entschieden, auf Nummer sicher zu gehen, bis ich die Genauigkeit bestätigen kann.
Wenn Sie das mit mir geschafft haben, vielen Dank! Ich hoffe, Sie haben verstanden, und wenn Sie Fehler bemerken (von denen es wahrscheinlich viele gibt, bin ich sehr müde), lassen Sie es mich bitte wissen!
quelle
TI-BASIC, 20
Übernimmt Eingaben auf dem Homescreen Ihres Taschenrechners der Serie TI-83 oder 84 in dieser Form (Sie können eine
2:
erste eingeben, die ignoriert wird):Wenn die Häuser immer weniger als eine Milliarde Kilometer vom Ursprung entfernt sind, kann E99 durch E9 mit einer Größe von 18 Byte ersetzt werden.
Gab es eine auf Mathematica basierende Golfsprache, konnte sie diese Herausforderung in 10-14 Bytes gewinnen.
quelle
Mathematica, 42 Bytes
Dies ist eine anonyme Funktion, die eine Liste von Paaren als Hauskoordinaten verwendet und die gewünschte y-Koordinate zurückgibt.
Es ist eine ziemlich einfache Implementierung. Wir mappen
Norm[#-{0,k}]&
auf jede Hauskoordinate (die den Abstand zu einem unbestimmten Punkt{0,k}
auf der y-Achse berechnet ) und summieren sie alle mitTr[...]
(für trace, wasTotal
für 1-d-Listen äquivalent ist ). Dann verwenden wir die BequemlichkeitMinimize
, um das Minimum dieser Summe in zu findenk
. Dies ergibt ein Ergebnis des Formulars. Daher{distance, {k -> position}
müssen wir das Gesuchtek/.Last@
extrahierenposition
.quelle
Pyth, 33 Bytes
Dies ist die Brute-Force-Lösung: Sie ordnet alle möglichen Standorte des Restaurants mit einer Auflösung von 0,001 km nach der Gesamtentfernung zu den Häusern und wählt dann den Standort mit der geringsten Gesamtentfernung aus. Es nimmt die Hausstandorte als Liste von 2 Eintragslisten von Floats auf STDIN.
Demonstration.
Die Auflösung kann bei gleicher Codelänge zwischen 1e-2 km und 1e-10 km eingestellt werden, jedoch mit exponentiellen Verzögerungen in der Laufzeit.
Ich habe das Gefühl, das könnte noch etwas mehr sein, ich werde es mir später noch einmal ansehen.
quelle
^T3
ist besonders beeindruckend.Python 2, 312
quelle
R
145143126Ich vermute, hier ist noch viel Platz zum Golfen. So ziemlich eine Brute-Force-Methode. Ich würde gerne einen schöneren Weg finden, dies zu tun. Ich dachte, geometrische Mittel könnten helfen, aber leider nein.
Testlauf
Wenn nur zwei Häuser in Betracht gezogen werden müssen, liefert das Folgende ein akzeptables Ergebnis. Es fällt jedoch auf drei. Ich kann es im Moment nicht weiter verfolgen, aber ich dachte, einige der Gehirne hier könnten etwas damit anfangen.
quelle
MATLAB, 42
Wenn es in Ordnung ist, die Eingabe als zu übernehmen
dann diese Aussage
kehrt zurück
5.113014445748538
.Wenn man Thomas Kwas Methode schamlos stiehlt, könnte man sie auf mindestens 30 reduzieren:
quelle
n
Hausnummer zu arbeiten ? Da ist es was die Frage verlangt.I
.