मुझे अपना रेस्तरां कहां रखना चाहिए?


15

आप एक रेस्तरां के मालिक हैं। आप कार्टेशिया में एक नए क्षेत्र में खोल रहे हैं जहां केवल एक मुख्य सड़क है, जिसे y- अक्ष के रूप में जाना जाता है। आप अपने रेस्तरां को ऐसे स्थान पर रखना चाहते हैं कि आप अपने रेस्तरां और उस क्षेत्र के प्रत्येक घर से कुल दूरी को कम से कम करें।

इनपुट :

इनपुट होगा

n, the number of houses
house1
house2
house3
...
houseN

जहां प्रत्येक घर फॉर्म में एक समन्वय है x y। प्रत्येक इकाई एक किलोमीटर का प्रतिनिधित्व करती है।

आप इनपुट को एक स्ट्रिंग के रूप में ले सकते हैं या एक फ़ंक्शन प्रदान कर सकते हैं जो इनपुट को लेता है, जो भी आप चुनते हैं, उसके तर्क के रूप में।

आउटपुट : आपके रेस्तरां का y- समन्वय (याद रखें, यह y- अक्ष पर स्थित होगा)। दरअसल, यह सड़क के किनारे स्थित होगा, लेकिन अंतर नगण्य है।

अनिवार्य रूप से, अगर nth house है h_nऔर Dडिस्टेंस फंक्शन है, तो आप kऐसा ढूंढना चाहते हैं, जो D(h_0, (0, k)) + D(h_1, (0, k)) + D(h_2, (0, k)) + ... + D(h_n, (0, k))कम से कम हो।

ध्यान दें कि दूरी की गणना की जाती है, हालांकि ग्राहक अपने घर से रेस्तरां तक ​​बिल्कुल सीधी रेखा में यात्रा करता है। यानी (x, y)आपके रेस्तरां से दूरी है sqrt(x^2 + (y - k)^2)

आउटपुट कम से कम 2 दशमलव स्थानों पर सटीक होना चाहिए।

आउटपुट को स्ट्रिंग के रूप में मुद्रित किया जा सकता है या फ़ंक्शन से वापस किया जा सकता है।

उदाहरण इनपुट / आउटपुट:

Input:
2
5.7 3.2
8.9 8.1
Output:
5.113013698630137

इस उदाहरण में कुल दूरी लगभग 15.4003किलोमीटर है।

यह कोड गोल्फ है - सबसे छोटा कोड जीतता है।

पुनश्च मैं भी एक गणितीय समाधान में रुचि रखता हूं जो केवल क्रूर बल नहीं है। यह कोड गोल्फ नहीं जीतेगा, लेकिन इसे कुछ अपवोट मिलेंगे। यहाँ मैं उदाहरण समस्या कैसे किया है:

बिंदु A को A (5.7, 3.2) और B को B (8.9, 8.1) पर स्थित करें। चलो समाधान बिंदु पर (0, के) सी हो। परावर्तक A- पर बनाने के लिए Y- अक्ष पर (-5.7, 3.2)। A 'से C तक की दूरी A से C की दूरी के बराबर है। इसलिए, समस्या को बिंदु C तक कम किया जा सकता है, जैसे A'C + CB को कम से कम किया जाता है। जाहिर है, यह वह बिंदु C होगा जो A'B की रेखा पर स्थित है।

मुझे नहीं पता कि यह 3 या उससे अधिक अंक के लिए सामान्य होगा।


दूरी के कार्य के लिए किस मीट्रिक का उपयोग किया जाता है D? इयूक्लिडियन?
रेटो कोराडी

1
भले ही केवल एक मुख्य सड़क है, लेकिन क्या हम मानते हैं कि एक ग्राहक अपने घर से रेस्तरां तक ​​एक सीधी रेखा में यात्रा करता है? या वे सीधे y अक्ष पर सीधे यात्रा करते हैं? (या दूसरे शब्दों में, क्या हम यू के लिए यूक्लिडियन या मैनहट्टन की दूरी का उपयोग करते हैं?)
ट्राइकोप्लेक्स

1
(यह उदाहरण से काम किया जा सकता है, लेकिन इसे स्पष्ट रूप से कहा जाए तो अच्छा होगा।)
ट्राइकोप्लाक्स

@trichoplax यूक्लिडियन? यूक्लिडियन का मतलब है sqrt(diffX^2 + diffY^2)? फिर यूक्लिडियन। मुझे पता है कि यह परिदृश्य पूरी तरह से फिट नहीं है, लेकिन यह मान लें कि ग्राहक अपने घर से किसी भी तरह एक सीधी रेखा में यात्रा करता है।
सोक्तिनपैक

5
क्या जटिल विमान पर घरों की स्थिति का प्रतिनिधित्व करने वाले जटिल संख्याओं की सूची के रूप में इनपुट स्वीकार्य है?
lirtosiast

जवाबों:


27

सी, 315 302 बाइट्स

t,i;double o,w,h,x,y,k,a,b,c;double g(N,S)double N,S[][2];{for(t=0;t<N;t++)k+=S[t][1];k/=N;for(i=0;i<9;i++){o=w=h=0;for(t=0;t<N;t++)x=S[t][0],y=S[t][1],a=y-k,c=k*k-2*k*y+x*x+y*y,o+=-a/sqrt(x*x+a*a),w+=x*x/pow(c,1.5),h+=3*x*x*a/pow(c,2.5);a=h/2;b=w-h*k;c=o-w*k+a*k*k;k=(-b+sqrt(b*b-4*a*c))/h;}return k;}

यह बहुत दूर है, और यह छोटा भी नहीं है। मुझे लगा कि मैं लंबाई प्रतियोगिता जीतने नहीं जा रहा हूँ, मैं (सैद्धांतिक) सटीकता प्रतियोगिता जीतने की कोशिश कर सकता हूँ! कोड संभवत: ब्रूटफोर्स घोल की तुलना में परिमाण या दो से अधिक तेज है, और थोड़ा गणितीय टोमफूलरी पर निर्भर करता है।

हम एक फ़ंक्शन को परिभाषित करते हैं g(N,S)जो घरों की संख्या N, और घरों की एक संख्या के इनपुट के रूप में लेता है S[][2]

यहाँ यह एक परीक्षण के मामले के साथ सुलझाया गया है:

t,i;
double o,w,h,x,y,k,a,b,c;
double g(N,S)double N,S[][2];{
    /* Initially, let k hold the geometric mean of given y-values */
    for(t=0;t<N;t++)
        k+=S[t][1];
    k/=N;

    /* We approximate 9 times to ensure accuracy */
    for(i=0;i<9;i++){
        o=w=h=0;
        for(t=0;t<N;t++)
            /* Here, we are making running totals of partial derivatives */
            /* o is the first, w the second, and h the third*/
            x=S[t][0],
            y=S[t][1],
            a=y-k,
            c=k*k-2*k*y+x*x+y*y,
            o+=-a/sqrt(x*x+a*a),
            w+=x*x/pow(c,1.5),
            h+=3*x*x*a/pow(c,2.5);
        /* We now use these derivatives to find a (hopefully) closer k */
        a=h/2;
        b=w-h*k;
        c=o-w*k+a*k*k;
        k=(-b+sqrt(b*b-4*a*c))/h;
    }
    return k;
}
/* Our testing code */
int main(int argc, char** argv) {
    double test[2][2] = {
        {5.7, 3.2},
        {8.9, 8.1}
    };    
    printf("%.20lf\n", g(2, test));
    return 0;
}

कौन से आउटपुट:

5.11301369863013732697

चेतावनी: पूर्ण समझ के लिए कुछ गणनाओं का ज्ञान आवश्यक हो सकता है!

तो, चलो गणित के बारे में बात करते हैं।

हम अपने इच्छित बिंदु (0, k)और एक घर से दूरी जानते हैं i:

D_i की परिभाषा

और इस प्रकार घरों Dसे कुल दूरी nको निम्नानुसार परिभाषित किया जा सकता है:

डी की परिभाषा

हम जो करना चाहते हैं वह इस फ़ंक्शन को सम्मान के साथ व्युत्पन्न करके kऔर इसके बराबर स्थापित करके कम से कम करना है 0। चलो यह कोशिश करते हैं। हम जानते हैं कि डेरिवेटिव का Dवर्णन इस प्रकार किया जा सकता है:

डी के व्युत्पन्न

लेकिन प्रत्येक के पहले आंशिक व्युत्पन्न Diबहुत बुरा है ...

डि के व्युत्पन्न 1

दुर्भाग्य से, n == 2इन डेरिवेटिव्स को सेट करने 0और हल करने के लिए, kबहुत जल्दी विनाशकारी हो जाता है। हमें और अधिक मजबूत विधि की आवश्यकता है, भले ही इसके लिए कुछ सन्निकटन की आवश्यकता हो।

टेलर पॉलिनॉमिअल्स दर्ज करें।

यदि हम D(k0)सभी के Dव्युत्पन्न मूल्य को जानते हैं k0, तो हम Dटेलर श्रृंखला के रूप में फिर से लिख सकते हैं :

टेलर सीरीज़ द्वारा परिभाषा

अब, इस सूत्र में सामान का एक गुच्छा मिला है, और इसके डेरिवेटिव बहुत सुंदर मिल सकते हैं, लेकिन हमारे पास अब एक बहुपद का सन्निकटन है D !

थोड़ा सा कैलकुलस करते हुए, हम पहले Dके डेरिवेटिव का मूल्यांकन करके अगले दो व्युत्पन्न पाते हैं Di, जैसे पहले:

डि के व्युत्पन्न 2

डि के व्युत्पन्न 3

ट्रंकेशन और डेरिवेटिव का मूल्यांकन करके, अब हम Dफॉर्म के 3 डिग्री बहुपद के रूप में अनुमानित कर सकते हैं :

डी का अनुमानित रूप

जहां A, B, C, Dकेवल वास्तविक संख्याएं हैं।

अब यह हम कम से कम कर सकते हैं। जब हम एक व्युत्पन्न लेते हैं और इसे 0 के बराबर सेट करते हैं, तो हम फॉर्म के एक समीकरण के साथ समाप्त होंगे:

D का अनुमान

पथरी और घटस्थापना करते हुए, हम इन सूत्रों के साथ आते हैं a, b, and c:

का मान

बी का मूल्य

C का मान

अब हमारी समस्या हमें द्विघात सूत्र द्वारा दिए गए 2 समाधान देती है:

का मूल्य

पूरा फॉर्मूला kलिखने के लिए एक बड़ा बोझ होगा, इसलिए हम इसे यहाँ और कोड में टुकड़ों में करते हैं।

चूंकि हम जानते हैं कि उच्च kहमेशा हमारे अनुमानित की न्यूनतम दूरी का परिणाम होगा D(मेरे पास इसका वास्तव में एक अद्भुत प्रमाण है, जो इस पेपर के मार्जिन को शामिल करने के लिए अपर्याप्त है ...) हमें छोटे से विचार करने की भी आवश्यकता नहीं है। समाधान।

एक अंतिम समस्या बनी हुई है। सटीकता के प्रयोजनों के लिए, यह आवश्यक है कि हम k0कम से कम उस बॉलपार्क में शुरू करें जहां हम उत्तर होने की उम्मीद करते हैं। इस उद्देश्य के लिए, मेरा कोड हर घर के y- मूल्यों का ज्यामितीय मतलब चुनता है।

एक असफल-सुरक्षित के रूप में, हम सटीकता को सुनिश्चित करने के लिए, प्रत्येक पुनरावृत्ति पर प्रतिस्थापित k0करते kहुए , पूरी समस्या को 9 बार फिर से दोहराते हैं ।

मैंने गणित नहीं किया है कि कितने पुनरावृत्तियों और कितने व्युत्पन्न वास्तव में आवश्यक हैं, लेकिन मैंने सावधानी के पक्ष में तब तक चुना है जब तक मैं सटीकता की पुष्टि नहीं कर सकता।

अगर आपने इसे मेरे साथ बनाया है, तो बहुत बहुत धन्यवाद! मुझे आशा है कि आप समझ गए होंगे, और यदि आप कोई गलती करते हैं (जिनमें से कई होने की संभावना है, तो मैं बहुत थक गया हूं), कृपया मुझे बताएं!


2
मैं, एक के लिए, आपके गणित की व्याख्या देखना पसंद करूंगा।
DLosc

2
@DLosc आपकी इच्छा मेरी आज्ञा है।
ब्रेनसटेल

4
यह वास्तव में अद्भुत है। मैंने न्यूटन के तरीके को आजमाने पर विचार किया, लेकिन टेलर श्रृंखला के बारे में नहीं सोचा।
DLosc

5
काश मैं इसे और बढ़ा पाता।
एलेक्स ए

@AlexA। मेरी इच्छा है कि आप मुझे और अधिक बढ़ा सकते हैं; एक या एक दिन के भीतर, मैं फ़र्मेट के अंतिम प्रमेय के संदर्भ को हटा दूंगा और इसे एक प्रमाण के साथ बदल दूंगा। जैसे ही मैं एक पाता हूं।
ब्रेनसटेल

13

TI-BASIC, 20

fMin(sum(abs(iX-Ans)),X,~E99,E99

इस रूप में अपने TI-83 या 84 श्रृंखला कैलकुलेटर के होमस्क्रीन पर इनपुट लेता है (आप 2:पहले टाइप कर सकते हैं , जो कि अच्छा होगा:

{5.7+3.2i,8.9+8.1i}:[program name]

यदि घर हमेशा मूल से एक बिलियन किमी से कम दूरी पर हों, तो E99 को 18 बाइट्स के आकार के लिए E9 से बदला जा सकता है।

मैथेमेटिका पर आधारित एक गोल्फ भाषा थी, यह चुनौती 10-14 बाइट्स में जीत सकती थी।


10

गणितज्ञ, 42 बाइट्स

k/.Last@Minimize[Tr[Norm[#-{0,k}]&/@#],k]&

यह एक अनाम फ़ंक्शन है जो घर के निर्देशांक के रूप में जोड़े की एक सूची ले रहा है और वांछित y समन्वय को वापस कर रहा है।

यह एक बिल्कुल सीधा कार्यान्वयन है। हम Norm[#-{0,k}]&प्रत्येक घर पर समन्वय करते हैं (जो {0,k}कि y अक्ष पर एक अनिर्धारित बिंदु की दूरी की गणना करता है) और उन सभी को जोड़ते हैं Tr[...](ट्रेस के लिए, जो Total1-डी सूचियों के बराबर है )। तब हम Minimizeइस राशि के न्यूनतम का पता लगाने के लिए सुविधाजनक का उपयोग करते हैं k। यह फ़ॉर्म का परिणाम देता है {distance, {k -> position}, इसलिए हमें k/.Last@वह positionखोज निकालने की आवश्यकता है जिसे हम खोज रहे हैं।


6

पायथ, 33 बाइट्स

hosm.a,d,0NQcR^T3rhKSms*^T3ekQheK

यह ब्रूट फोर्स सॉल्यूशन है: यह रेस्तरां के सभी संभावित स्थानों को .001 किमी के रिज़ॉल्यूशन के साथ घरों से उनकी कुल दूरी का आदेश देता है, फिर कम से कम कुल दूरी के साथ एक का चयन करता है। यह घर के स्थानों को STDIN पर फ़्लोट्स की 2 प्रविष्टि सूची की सूची के रूप में लेता है।

प्रदर्शन।

संकल्प 1e-2 किमी से 1e-10 किमी तक समान कोड लंबाई में कहीं भी सेट किया जा सकता है, लेकिन रनटाइम में घातीय मंदी के साथ।

मुझे लगता है कि यह कुछ और हो सकता है, मैं इसे बाद में फिर से देखूंगा।


2
जबरदस्त हंसी! क्या आपने मेरे समाधान की नकल की? ;-)
जकुबे

@Jakube मिलान ^T3विशेष रूप से प्रभावशाली है।
इसहाक

हमें वास्तव में एक फ्लोट रेंज की आवश्यकता है।
माल्टसेन

3

अजगर 2, 312

from math import*;A,L,p=[map(float,raw_input().split()) for i in range(input())],lambda a:a[1],0.001
def R(m,M,s):
 while m<=M:yield m;m+=s
m=min(A,key=L)[1];M=max(A,key=L)[1];r=(m+M)/2;s=r-m
while s>p:D={y:sum([sqrt(X*X+(Y-y)**2)for X,Y in A])for y in R(r-s,r+s,s*p)};r=min(D,key=D.get);s*=p;m=r-s;M=r+s
print r

3

आर, 145 143 126

इस पर मुझे संदेह है कि बहुत सारे गोल्फ कमरे बचे हैं। बहुत ज्यादा एक क्रूर बल विधि। मैं ऐसा करने के लिए एक अच्छा तरीका खोजना चाहता हूं। हालांकि मैं ज्यामितीय साधन मदद कर सकता हूं, लेकिन अफसोस नहीं।

r=sapply(seq(min((p=matrix(scan(),nr=2))),max(p),.001),function(X,p)c(X,sum((p[1,]^2+(p[2,]-X)^2)^.5)),p);r[1,order(r[2,])[1]]

परीक्षण चालन

> r=sapply(seq(min((p=matrix(scan(),nr=2))),max(p),.001),function(X,p)c(X,sum((p[1,]^2+(p[2,]-X)^2)^.5)),p);r[1,order(r[2,])[1]]
1: 5.7 3.2
3: 8.9 8.1
5: 
Read 4 items
[1] 5.113
> 

ब्याज के रूप में, अगर निम्नलिखित पर विचार करने के लिए सिर्फ दो घर हैं, तो एक स्वीकार्य परिणाम वापस आ जाएगा। हालाँकि यह तीन पर पड़ता है। मैं इसे फिलहाल आगे नहीं ले जा सकता, लेकिन मुझे लगा कि यहां कुछ दिमाग इसके साथ कुछ करने में सक्षम हो सकते हैं।

p=matrix(scan(),nr=2);weighted.mean(p[2,],sum(p[1,])-p[1,])

2

MATLAB, 42

यदि इनपुट के रूप में लेना ठीक है

I=[5.7 3.2
    8.9 8.1]

फिर यह बयान

fminunc(@(y)sum(hypot(I(:,1),I(:,2)-y)),0)

लौटता है 5.113014445748538

बेशर्मी से थॉमस क्वा का तरीका, आप इसे कम से कम 30 तक ले सकते हैं:

I=[5.7+3.2i 8.9+8.1i];
fminunc(@(y)sum(abs(I-i*y)),0)

1
क्या इसे nघर की संख्या के साथ काम करने के लिए बढ़ाया जा सकता है ? चूंकि यह वही है जो सवाल पूछ रहा है।
n --h'a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

हाँ, यह किसी भी संख्या में पंक्तियों के साथ काम करता है I
डेविड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.