Vous êtes propriétaire d'un restaurant. Vous ouvrez dans une nouvelle zone de Cartesia où il n'y a qu'une seule route principale, connue sous le nom d'axe y. Vous souhaitez placer votre restaurant de manière à minimiser la distance totale entre votre restaurant et chacune des maisons de cette zone.
Entrée :
L'entrée sera
n, the number of houses
house1
house2
house3
...
houseN
où chaque maison est une coordonnée dans le formulaire x y
. Chaque unité représente un kilomètre.
Vous pouvez prendre l'entrée sous forme de chaîne ou fournir une fonction qui prend l'entrée, dans le format que vous choisissez, comme arguments.
Sortie : la coordonnée y de votre restaurant (rappelez-vous, elle sera située sur l'axe y). En fait, il sera situé sur le côté de la route, mais la différence est négligeable.
Essentiellement, si la nième maison est h_n
et D
est la fonction de distance, alors vous voulez trouver k
celle qui D(h_0, (0, k)) + D(h_1, (0, k)) + D(h_2, (0, k)) + ... + D(h_n, (0, k))
est minimisée.
Notez que la distance est calculée comme si le client se rendait exactement en ligne droite de sa maison au restaurant. C'est la distance de (x, y)
votre restaurant sqrt(x^2 + (y - k)^2)
.
La sortie doit être précise à au moins 2 décimales.
La sortie peut être imprimée sous forme de chaîne ou renvoyée par la fonction.
Exemple d'entrée / sortie:
Input:
2
5.7 3.2
8.9 8.1
Output:
5.113013698630137
La distance totale dans cet exemple est d'environ 15.4003
kilomètres.
C'est le golf de code - le code le plus court gagne.
PS Je m'intéresse aussi à une solution mathématique qui n'est pas seulement la force brute. Il ne gagnera pas le golf de code mais il obtiendra quelques votes positifs. Voici comment j'ai fait l'exemple du problème:
Soit le point A situé en A (5.7, 3.2) et B en B (8.9, 8.1). Soit le point de solution en (0, k) égal à C. Réfléchissez A sur l'axe des y pour faire A 'en (-5,7, 3,2). La distance de A 'à C est égale à la distance de A à C. Par conséquent, le problème peut être réduit au point C de telle sorte que A'C + CB soit minimisé. Évidemment, ce serait le point C qui se trouve sur la ligne A'B.
Je ne sais pas si cela généraliserait bien à 3 points ou plus.
la source
D
? Euclidienne?sqrt(diffX^2 + diffY^2)
t -il ? Puis euclidienne. Je sais que cela ne correspond pas parfaitement au scénario, mais supposons que le client se déplace en ligne droite de sa maison.Réponses:
C,
315302 octetsC'est loin d'être joli, et ce n'est pas court non plus. Je me suis dit que puisque je ne gagnerais pas le concours de longueur, je peux essayer de gagner le concours de précision (théorique)! Le code est probablement un ordre de grandeur ou deux plus rapide que la solution bruteforce, et repose sur un peu de tromperie mathématique.
Nous définissons une fonction
g(N,S)
qui prend en entrée le nombre de maisonsN
, et un tableau de maisonsS[][2]
.Ici, il est démêlé, avec un cas de test:
Quelles sorties:
Avertissement: La connaissance de certains calculs peut être nécessaire pour une compréhension complète!
Parlons donc des mathématiques.
Nous connaissons la distance de notre point souhaité
(0, k)
et d'une maisoni
:Et ainsi la distance totale
D
desn
maisons peut être définie comme suit:Ce que nous aimerions faire, c'est minimiser cette fonction en prenant une dérivée par rapport à
k
et en la réglant sur0
. Essayons. Nous savons que les dérivés deD
peuvent être décrits comme suit:Mais la première dérivée partielle de chacun
Di
est assez mauvaise ...Malheureusement, même avec
n == 2
, la définition de ces dérivés0
et leur résolutionk
deviennent très rapidement désastreuses. Nous avons besoin d'une méthode plus robuste, même si elle nécessite une approximation.Entrez Taylor Polynomials.
Si nous connaissons la valeur de
D(k0)
ainsi que tousD
les dérivés dek0
, nous pouvons réécrireD
sous forme de série Taylor:Maintenant, cette formule contient beaucoup de choses, et ses dérivés peuvent devenir assez lourds, mais nous avons maintenant une approximation polynomiale de
D
!En faisant un peu de calcul, nous trouvons les deux dérivées suivantes de
D
en évaluant les dérivées deDi
, comme précédemment:En tronquant et en évaluant les dérivées, nous pouvons maintenant approximer
D
comme un polynôme du 3ème degré de la forme:Où
A, B, C, D
sont simplement de vrais nombres.Maintenant , ce que nous pouvons minimiser. Lorsque nous prenons une dérivée et la mettons égale à 0, nous nous retrouverons avec une équation de la forme:
En faisant le calcul et les substitutions, nous proposons ces formules pour
a, b, and c
:Maintenant, notre problème nous donne 2 solutions données par la formule quadratique:
La formule entière pour
k
serait un fardeau énorme à écrire, donc nous le faisons en morceaux ici et dans le code.Puisque nous savons que le plus élevé
k
entraînera toujours la distance minimale de notre approximatifD
(j'en ai une preuve vraiment merveilleuse, que la marge de cet article est insuffisante pour contenir ...), nous n'avons même pas à considérer le plus petit des les solutions.Un dernier problème demeure. Pour des raisons de précision, il est nécessaire que nous commencions par un
k0
qui est au moins dans le stade où nous attendons la réponse. À cette fin, mon code choisit la moyenne géométrique des valeurs y de chaque maison.Comme un échec de sécurité, nous le répétons à nouveau tout le problème 9 fois, en remplaçant
k0
aveck
à chaque itération, pour assurer l' exactitude.Je n'ai pas fait le calcul du nombre d'itérations et du nombre de dérivés vraiment nécessaires, mais j'ai choisi de faire preuve de prudence jusqu'à ce que je puisse confirmer l'exactitude.
Si vous avez réussi cela avec moi, merci beaucoup! J'espère que vous avez compris, et si vous repérez des erreurs (dont il y en a probablement beaucoup, je suis très fatigué), faites le moi savoir!
la source
TI-BASIC, 20
Prend des informations sur l'écran d'accueil de votre calculatrice de la série TI-83 ou 84 sous cette forme (vous pouvez taper une
2:
première, qui serait ignorée):Si les maisons sont toujours à moins d'un milliard de kilomètres de l'origine, E99 peut être remplacé par E9 pour une taille de 18 octets.
S'il y avait un langage de golf basé sur Mathematica, il pourrait gagner ce défi en 10-14 octets.
la source
Mathematica, 42 octets
Il s'agit d'une fonction anonyme prenant une liste de paires comme coordonnées de la maison et renvoyant la coordonnée y souhaitée.
C'est une implémentation assez simple. Nous mappons
Norm[#-{0,k}]&
sur chaque coordonnée de la maison (qui calcule la distance à un point indéterminé{0,k}
sur l'axe y) et les additionnons tousTr[...]
(pour trace, ce qui équivaut àTotal
pour les listes 1-d). Ensuite, nous utilisons la pratiqueMinimize
pour trouver le minimum de cette sommek
. Cela donne un résultat du formulaire{distance, {k -> position}
, nous devonsk/.Last@
donc extraire ceposition
que nous recherchons.la source
Pyth, 33 octets
Voici la solution de la force brute: il commande tous les emplacements possibles du restaurant, avec une résolution de 0,001 km, par leur distance totale des maisons, puis sélectionne celui qui a la distance totale la plus faible. Il prend les emplacements des maisons comme une liste de 2 listes d'entrées de flotteurs sur STDIN.
Manifestation.
La résolution peut être définie de 1 à 2 km à 1 à 10 km à la même longueur de code, mais avec des ralentissements exponentiels lors de l'exécution.
J'ai l'impression que cela pourrait être joué au golf un peu plus, je le reverrai plus tard.
la source
^T3
est particulièrement impressionnante.Python 2, 312
la source
R,
145143126Il me reste beaucoup de terrain de golf là-dessus, je suppose. À peu près une méthode de force brute. J'aimerais trouver une meilleure façon de procéder. Je pensais que les moyens géométriques pouvaient aider, mais hélas non.
Essai
Il est intéressant de noter que s'il n'y a que deux maisons à considérer, ce qui suit donnera un résultat acceptable. Cependant, il tombe sur trois. Je ne peux pas aller plus loin pour le moment, mais je pensais que certains cerveaux ici pourraient être en mesure de faire quelque chose avec.
la source
MATLAB, 42
S'il est OK de prendre l'entrée comme
alors cette déclaration
retourne
5.113014445748538
.Volant sans vergogne la méthode de Thomas Kwa, vous pouvez la ramener à 30 au moins:
la source
n
nombre de maisons? Car c'est ce que demande la question.I
.