আমার রেস্তোঁরা কোথায় রাখা উচিত?


15

আপনি একটি রেস্তোঁরা মালিক। আপনি কার্টেসিয়ার নতুন একটি অঞ্চলে খোলার পথে যেখানে কেবলমাত্র একটি প্রধান রাস্তা রয়েছে, এটি ওয়াই-অক্ষ হিসাবে পরিচিত। আপনি আপনার রেস্তোঁরা এমন রাখতে চান যাতে আপনি আপনার রেস্তোঁরা এবং সেই এলাকার প্রতিটি বাড়ি থেকে মোট দূরত্ব কমিয়ে আনেন।

ইনপুট :

ইনপুট হবে

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

যেখানে প্রতিটি বাড়ি ফর্মের একটি সমন্বয়কারী x y। প্রতিটি ইউনিট এক কিলোমিটার প্রতিনিধিত্ব করে।

আপনি স্ট্রিং হিসাবে ইনপুট নিতে পারেন বা কোনও ফাংশন সরবরাহ করতে পারেন যা আপনি যে কোনও বিন্যাসে বেছে নিন তার আর্গুমেন্ট হিসাবে ইনপুট নেয়।

আউটপুট : আপনার রেস্তোঁরাটির y- স্থানাঙ্ক (মনে রাখবেন, এটি y- অক্ষের উপরে অবস্থিত হবে)। প্রকৃতপক্ষে, এটি রাস্তার পাশে অবস্থিত হবে তবে পার্থক্যটি নগন্য।

মূলত, যদি n তম ঘর 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 বিন্দুটি এ (5.7, 3.2) এবং বি তে অবস্থিত থাকুন (8.9, 8.1)। (0, কে) এর সমাধান পয়েন্টটি সি হতে দিন y-axis এর A কে A-এ তৈরি করতে (-5.7, 3.2)। 'এ' থেকে সি এর দূরত্ব এ থেকে সি এর দূরত্বের সমান, সুতরাং সমস্যাটি বিন্দু সি তে হ্রাস করা যেতে পারে যেমন A'C + CB হ্রাস করা যায়। স্পষ্টতই, এটি পয়েন্ট সি হবে যা A'B লাইনে থাকবে।

আমি জানি না এটি 3 বা ততোধিক পয়েন্টগুলিতে ভাল জেনারালাইজ হবে কিনা।


দূরত্ব ফাংশনের জন্য কোন মেট্রিক ব্যবহার করা হয় D? ইউক্লিডিয়?
রেটো কোরাডি

1
যদিও একটিমাত্র প্রধান রাস্তা রয়েছে, আমরা কি ধরে নিই যে কোনও গ্রাহক তাদের বাড়ি থেকে রেস্তোঁরাটিতে একটি সরল লাইনে ভ্রমণ করেন? না তারা প্রথমে y অক্ষের সাথে সরাসরি ভ্রমণ করে? (বা অন্য কথায়, আমরা কি ইউক্লিডিয়ান বা ম্যানহাটনের দূরত্ব ডি'র জন্য ব্যবহার করি?)
ট্রাইকপ্লেক্স

1
(এটি উদাহরণ থেকে কাজ করা যেতে পারে তবে এটি স্পষ্টভাবে বলা ভাল
লাগবে

@ ট্রাইকোপ্লেক্স ইউক্লিডিয়ান? ইউক্লিডিয়ান মানে কি sqrt(diffX^2 + diffY^2)? তারপরে ইউক্লিডিয়ান। আমি জানি এটি দৃশ্যের পুরোপুরি ফিট করে না তবে ধরে নিই যে গ্রাহক তার বাড়ি থেকে কোনওভাবে সোজা লাইনে ভ্রমণ করেন।
soktinpk

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:

ডি_আই এর সংজ্ঞা

এবং এইভাবে মোট দূরত্ব Dn বাড়িগুলি থেকে হিসাবে সংজ্ঞায়িত করা যেতে পারে:

ডি এর সংজ্ঞা

আমরা যা করতে চাই তা হল শ্রদ্ধার সাথে ডেরিভেটিভ নিয়ে এই ফাংশনটি হ্রাস করা k এবং এটির সমান সেট করে 0। চল এটা চেষ্টা করি. আমরা জানি যে এর ডেরিভেটিভগুলি Dনিম্নরূপ বর্ণিত হতে পারে:

ডি এর উদ্দীপনা

তবে প্রত্যেকের প্রথম আংশিক ডেরাইভেটিভ Di বেশ খারাপ ...

ডি এর উদ্দীপনা 1

দুর্ভাগ্যক্রমে, এমনকি সঙ্গে n == 2 , এই ডেরাইভেটিভগুলিতে সেট করা 0এবং এর সমাধান করা kখুব দ্রুত বিপর্যয়কর হয়ে ওঠে। আমাদের আরও শক্তিশালী পদ্ধতি প্রয়োজন, এমনকি যদি এটির জন্য কিছুটা আনুমানিক প্রয়োজন হয়।

টেলর বহুবচন প্রবেশ করুন।

আমরা যদি এর D(k0)পাশাপাশি এর সমস্ত Dডেরাইভেটিভসের মান জানি তবে k0আমরা আবার লিখতে পারিD টেলর সিরিজ হিসাবে আবার :

টেলর সিরিজ দ্বারা সংজ্ঞা

এখন, এই সূত্রটি এতে একগুচ্ছ জিনিস পেয়েছে এবং এর ডেরাইভেটিভগুলি বেশ অনর্থক পেতে পারে, তবে আমাদের কাছে এখন একটি বহুতলিক রয়েছে D !

কিছুটা ক্যালকুলাস করে আমরা আগের দুটি ডেরিভেটিভসকে Dমূল্যায়ন করে পরবর্তী দুটি ডেরাইভেটিভ খুঁজে পাই Di:

ডি এর ডেরিভেটিভ 2

ডি এর ডেরিভেটিভ 3

সংক্ষিপ্তকরণ এবং ডেরাইভেটিভগুলি মূল্যায়নের মাধ্যমে, আমরা এখন Dফর্মের তৃতীয় ডিগ্রি বহুবর্ষ হিসাবে আনুমানিক :

ডি এর আনুমানিক ফর্ম

কোথায় A, B, C, D কেবল আসল সংখ্যা রয়েছে।

এখন এটি আমরা কমাতে পারি। যখন আমরা একটি ডেরাইভেটিভ গ্রহণ করি এবং এটি 0 এর সমান স্থির করি, আমরা ফর্মটির সমীকরণ নিয়ে শেষ করব:

ডি'র অনুমান

ক্যালকুলাস এবং বিকল্পগুলি করা, আমরা এই সূত্রগুলি নিয়ে এলাম a, b, and c:

এর মান a

মান খ

গ এর মান

এখন আমাদের সমস্যাটি চতুর্ভুজ সূত্র দ্বারা প্রদত্ত 2 সমাধান দেয়:

কে এর মান

সম্পূর্ণ সূত্রটি kলিখতে হবে একটি বিশাল বোঝা, তাই আমরা এটি এখানে এবং কোডে টুকরো টুকরো করে করি।

যেহেতু আমরা জানি যে উচ্চতর kসর্বদা আমাদের আনুমানিকের সর্বনিম্ন দূরত্বের ফলাফল করেD (আমার কাছে এর সত্যিকারের এক দুর্দান্ত প্রমাণ রয়েছে, যা এই কাগজের মার্জিনটি অপরিহার্য ...) আমাদের এমনকি এর ছোটটি বিবেচনা করতে হবে না সমাধান।

একটি চূড়ান্ত সমস্যা রয়ে গেছে। নির্ভুলতার উদ্দেশ্যে, আমরা একটি দিয়ে শুরু করা দরকারk0 কমপক্ষে যেখানে উত্তরটি প্রত্যাশা করব তার বলপार्कের করা দরকার। এই উদ্দেশ্যে, আমার কোড প্রতিটি বাড়ির y- মানগুলির জ্যামিতিক গড়কে পছন্দ করে।

ব্যর্থ-নিরাপদ হিসাবে, আমরা পুরো সমস্যাটি আবারও পুনরায় 9 বার করে দিয়েছি k0withk সঠিকতা নিশ্চিত করতে আমরা প্রতিটি পুনরাবৃত্তির করে পুনর্বার করি।

কতগুলি পুনরাবৃত্তি এবং কতগুলি ডেরাইভেটিভস সত্যই প্রয়োজনীয় তা নিয়ে আমি গণিতটি করি নি, তবে যতক্ষণ না আমি নির্ভুলতা নিশ্চিত করতে পারি ততক্ষণ আমি সাবধানতার দিক থেকে ভুল করতে চেয়েছি।

আপনি যদি আমার সাথে এটি তৈরি করে থাকেন তবে আপনাকে অনেক ধন্যবাদ! আমি আশা করি আপনি বুঝতে পেরেছেন, এবং যদি আপনি কোনও ভুল চিহ্নিত করেন (যার মধ্যে অনেকগুলিই রয়েছে সম্ভবত আমি খুব ক্লান্ত), দয়া করে আমাকে জানান!


2
আমি একের জন্য আপনার গণিতের ব্যাখ্যা দেখতে পছন্দ করব।
ডিএলসাস

2
@DLosc আপনার ইচ্ছা আমার আদেশ।
BrainSteel

4
এটা সত্যিই দুর্দান্ত। আমি নিউটনের পদ্ধতি চেষ্টা করে বিবেচনা করেছি, কিন্তু টেলর সিরিজের কথা ভাবি নি।
ডিএলসাস

5
আমি আশা করি আমি এই আরও upvote করতে পারে।
অ্যালেক্স এ।

@AlexA। আমি আশা করি আপনি আমাকে আরও উজ্জীবিত করতে পারেন; ডি এক বা এক দিনের মধ্যে, আমি ফার্মের শেষ উপপাদ্য রেফারেন্সটি সরিয়ে দেব এবং একটি প্রমাণ সহ এটিকে প্রতিস্থাপন করব। যত তাড়াতাড়ি আমি একটি খুঁজে পেতে।
ব্রেইনস্টিল

13

টিআই-বেসিক, ২০

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

এই ফর্মটিতে আপনার টিআই -83 বা 84 সিরিজের ক্যালকুলেটরের হোমস্ক্রিনে ইনপুট নেয় (আপনি একটি 2:প্রথম টাইপ করতে পারেন , যা উপেক্ষা করা হবে):

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

যদি ঘরগুলি উত্স থেকে সর্বদা এক বিলিয়ন কিলোমিটার দূরে থাকে তবে E9 এর আকার 18 বাইট আকারের জন্য E9 দ্বারা প্রতিস্থাপন করা যেতে পারে।

ম্যাথামেটিকার উপর ভিত্তি করে কোনও গল্ফিংয়ের ভাষা থাকলে 10-10 বাইটে এটি এই চ্যালেঞ্জটি জিততে পারে।


10

গণিত, 42 বাইট

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

এটি ঘরানা সমন্বয় করে এবং পছন্দসই y স্থানাঙ্ক ফিরিয়ে দেওয়ার কারণে জোড়া তালিকা তৈরি করে একটি অনামী কাজ function

এটি মোটামুটি সরল বাস্তবায়ন। আমরা 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
হাঃ হাঃ হাঃ! আপনি কি আমার সমাধানটি অনুলিপি করেছেন? ;-)
জাকুব

@ জাকুব মিলটি ^T3বিশেষত চিত্তাকর্ষক।
isaacg

আমাদের সত্যিই একটি ভাসমান পরিসর দরকার।
মাল্টেসেন

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

ম্যাটল্যাব, ৪২

যদি ঠিক হয় তবে ইনপুট হিসাবে নেওয়া

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
ডেভিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.