গল্ফ এ ফ্রি লাঞ্চ


26

এক্সচেঞ্জ রেট সারণীতে প্রদত্ত এক্সচেঞ্জগুলির সর্বাধিক লাভজনক ক্রম সন্ধান করুন।


উদাহরণ হিসাবে বিবেচনা করুন মুদ্রাগুলি একটি রিরি (আপনার হোম মুদ্রা), বি আহত, সি এডি এবং ডি এনার যেখানে একের পর এক হার (যে কোনও লেনদেনের হার আরোপ করার পরে) এ (সারি, কলাম) এন্ট্রি দিয়ে দেওয়া হয় নীচে এক্সচেঞ্জ রেট টেবিল:

                       TO
       A          B          C          D

   A   0.9999     1.719828   4.509549   0.709929

F  B   0.579942   0.9999     2.619738   0.409959
R
O  C   0.219978   0.379962   0.9999     0.149985
M
   D   1.39986    2.429757   6.409359   0.9999

স্পষ্টতই এ এর জন্য বিনিময় কোনও দুর্দান্ত ধারণা নয় কারণ এই ডেস্কটি আপনাকে কিছু না করার জন্য খুশিতে চার্জ করবে।

স্পষ্টতই কম, তবে এই টেবিলটির সাথে সত্য, অন্য যে কোনও মুদ্রার জন্য বিনিময় এবং তারপরে আবার বিনিময় হ'ল লোকসানের ক্ষতি:

via B: 1.719828 × 0.579942 = 0.997400489976
via C: 4.509549 × 0.219978 = 0.992001569922
via D: 0.709929 × 1.39986  = 0.99380120994

যাইহোক, বিনিময় একজন থেকে ডি তারপর ডি করার বি তারপর বি ফিরে একটি করে মুনাফা (যথেষ্ঠ রাজধানী না হার মানবো করার rounding করতে):

0.709929 × 2.429757 × 0.579942 = 1.0003738278192194

সুযোগ থাকা অবস্থায় কেউ এই "ফ্রি লাঞ্চ" বারবার নিতে পারে।

কিন্তু একটি এমনকি আরো enticing শৃঙ্খল এখানে বিদ্যমান, যথা একটি থেকে ডি তারপর ডি করার সি তারপর সি থেকে বি এবং পরিশেষে বি ফিরে একটি :

0.709929 × 6.409359 × 0.379962 × 0.579942 = 1.0026612752037345

চ্যালেঞ্জের বিশদ

যে কোনও যুক্তিসঙ্গত বিন্যাসে একটি বিনিময় হারের সারণী দেওয়া হয়েছে যা হোম-মুদ্রার অর্থ স্থির করে (যেমন 1 সারির এবং 1 কলাম সর্বদা হোম-মুদ্রা)
(বা এই জাতীয় সারণী এবং হোম-কারেন্সি সূচক দেওয়া থাকে)
একটি * খুঁজে পান কোনও মুদ্রার ব্যবহারের পুনরাবৃত্তি না করে মুদ্রা তালিকার সূচক হিসাবে হোম মুদ্রার সাথে শুরু এবং শেষ হওয়া এক্সচেঞ্জগুলির সর্বাধিক সালিসি ক্রম (যেমন একটি Y-> এক্স এক্সচেঞ্জ একটি এক্স-> ওয়াই অনুসরণ করতে পারে, তবে একটি এক্স-> ওয়াই নাও করতে পারে একটি এক্স-> ওয়াই) অনুসরণ করুন।

যদি এই জাতীয় লাভজনক সুযোগ না পাওয়া যায় তবে একটি শূন্য তালিকা পাওয়া যায় না, বা অন্য কোনও ফলাফল কোনও চিহ্নিত সুযোগের সাথে বিভ্রান্ত না হয়।
- যেমন উপরের উদাহরণের জন্য ( এ-> ডি, ডি-> সি, সি-> বি, বি-> এ ):

  • 0-ইনডেক্সিং ব্যবহার করে কেউ ফিরে আসতে পারে [[0,3],[3,2],[2,1],[1,0]]বা[0,3,2,1,0]
  • 1-ইনডেক্সিং ব্যবহার করে কেউ ফিরে আসতে পারে [[1,4],[4,3],[3,2],[2,1]]বা[1,4,3,2,1]

অস্পষ্টতা না থাকায় অন্য ফর্ম্যাটগুলি ঠিক আছে।
- লক্ষ্য রাখার একটি বিষয় হ'ল বাড়ি-> বাড়ি (বোকা ডেস্ক) থেকে একক লেনদেন হওয়ার পক্ষে সেরা সুযোগটি পাওয়া সম্ভব। যদি আপনি উপরের ফ্ল্যাটের বিকল্পের উভয় প্রান্ত (যেমন [3,2,1]বা [4,3,2]) এবং হোম নোটের সূচককে "কোনও সুযোগের জন্য" খালি তালিকা থেকে বাদ দিয়ে যাওয়ার সিদ্ধান্ত নেন তবে নিশ্চিত করুন যে হোম-> বাড়িটিও খালি তালিকা নয়।

* যদি একাধিক সমানভাবে লাভজনক বৈধ সুযোগগুলি ঘটে থাকে তবে তাদের মধ্যে কোনওটি, তাদের মধ্যে কিছু বা তাদের সমস্ত ফিরিয়ে দিন।

বেলম্যান-ফোর্ড অ্যালগরিদম এটির কাছে যাওয়ার এক উপায়, তবে গল্ফের পক্ষে সম্ভবত সেরা উপযুক্ত নয়।

পরীক্ষার মামলা

প্রদর্শিত ইনপুটগুলি উদাহরণে ব্যবহৃত ব্যবস্থায় রয়েছে এবং প্রদর্শিত ফলাফলগুলি টু মুদ্রা-সূচকগুলি তালিকাতে 0-সূচি ব্যবহার করে (যখন কোনও সুযোগ থাকে তখন হোম মুদ্রাটি কেবল শেষের শেষে থাকে; কোনও সুযোগ খালি তালিকা নয়)।

[[0.999900, 1.719828, 4.509549, 0.709929],
 [0.579942, 0.999900, 2.619738, 0.409959],
 [0.219978, 0.379962, 0.999900, 0.149985],
 [1.399860, 2.429757, 6.409359, 0.999900]]  ->  [3, 2, 1, 0]

[[0.9999, 1.5645, 0.9048, 1.0929],
 [0.6382, 0.9999, 0.5790, 0.6998],
 [1.1051, 1.7269, 0.9999, 1.2087],
 [0.9131, 1.4288, 0.8262, 0.9999]]  ->  [1, 2, 0]

[[0.9999, 1.4288, 0.8262, 0.9131],
 [0.6998, 0.9999, 0.5790, 0.6382],
 [1.2087, 1.7269, 0.9999, 1.1051],
 [1.0929, 1.5645, 0.9048, 0.9999]]  ->  [1, 2, 3, 1, 0]

[[1.002662, 1.719828, 4.509549, 0.709929],
 [0.579942, 0.999900, 2.619738, 0.409959],
 [0.219978, 0.379962, 0.999900, 0.149985],
 [1.399860, 2.429757, 6.409359, 0.999900]]  ->  [3, 2, 1, 0, 0]

[[1.002662, 1.719828, 4.509549, 0.709929],
 [0.579942, 1.002604, 2.619738, 0.409959],
 [0.219978, 0.379962, 1.003000, 0.149985],
 [1.399860, 2.429757, 6.409359, 1.002244]]  ->  [3, 3, 2, 2, 1, 1, 0, 0]

[[0.9999, 1.4288, 0.8262, 0.9131],
 [0.6998, 0.9999, 0.5790, 0.6382],
 [1.2087, 1.7269, 1.0001, 1.1051],
 [1.0929, 1.4974, 0.9048, 0.9999]]  ->  [1, 2, 2, 0]

[[0.9999, 1.3262, 0.7262, 0.9131],
 [0.6998, 0.9999, 0.5490, 0.6382],
 [1.2087, 1.7269, 0.9999, 1.2051],
 [1.0929, 1.5645, 0.9048, 0.9999]]  ->  [3, 2, 3, 1, 0]

[[0.9999, 1.5645, 0.9048, 0.5790],
 [0.6382, 0.9999, 0.5790, 0.3585],
 [1.1051, 1.7269, 0.9999, 0.6391],
 [1.7271, 2.6992, 1.5645, 0.9999]]  ->  [1, 2, 0]  and/or  [3, 2, 0]

[[0.9999, 1.2645, 0.7048, 0.3790],
 [0.4382, 0.9999, 0.3790, 0.1585],
 [1.0001, 1.5269, 1.0001, 0.4391],
 [1.5271, 2.4992, 1.3645, 0.9999]]  ->  []

[[0.9999, 1.2645, 0.7048, 0.3790],
 [0.4382, 0.9999, 0.3790, 0.1585],
 [0.9999, 1.5269, 1.4190, 0.4391],
 [1.5271, 2.4992, 1.3645, 0.9999]]  ->  [2, 2, 0]

এটি তাই বাইটের মধ্যে সংক্ষিপ্ত সমাধানটি জিততে পারে, তবে প্রতিযোগিতাটি অন্তর্-ভাষাও তৈরি করা উচিত, সুতরাং কোড-গল্ফিংয়ের ভাষাগুলি আপনাকে আপনার প্রিয়তে জমা দেওয়া বন্ধ রাখবেন না!

উত্তর:


8

জাভাস্ক্রিপ্ট (ES6), 122 113 103 বাইট

চ্যালেঞ্জে বর্ণিত বিন্যাসের সম্মানের সাথে ট্রান্সপোজড ম্যাট্রিক্স হিসাবে ইনপুট নেয়। (from,to)ফর্ম্যাটে এক্সচেঞ্জগুলি বর্ণনা করে একটি স্ট্রিং প্রদান করে।

a=>(g=(s,x=b=0,h='')=>a.map((r,y)=>~h.search(k=`(${x},${y})`)||g(s*r[x],y,h+k),x|s<b||(b=s,p=h)))(1)&&p

প্রথম পরীক্ষার কেস: অনলাইনে চেষ্টা করে দেখুন!

আরও পরীক্ষার কেস: এটি অনলাইনে চেষ্টা করুন!

মন্তব্য

a => (                  // given the exchange rate matrix a[][]
  g = (                 // g = recursive function taking:
    s,                  //   s = current amount of money
    x = b = 0,          //   x = ID of current currency, b = best result so far
    h = ''              //   h = exchange history, as a string
  ) =>                  //  
  a.map((r, y) =>       // for each row at position y in a[]:
    ~h.search(          //   if we can't find in h ...
      k = `(${x},${y})` //     ... the exchange key k from currency x to currency y
    ) ||                //   then:
    g(                  //   do a recursive call to g() with:
      s * r[x],         //     s = new amount obtained by applying the exchange rate
      y,                //     x = y
      h + k             //     h = h + k
    ),                  //   end of recursive call
    x | s < b ||        //   if x is our home currency and s is greater than or equal to b
    (b = s, p = h)      //   then set b to s and set p to h
  )                     // end of map()
)(1)                    // initial call to g() with s = 1
&& p                    // return p

4

পাইথন 2 , 143 125 124 বাইট

lambda M:g(M)[1]
g=lambda M,s=[],p=1,x=0:max([(p,s)]*-~-x+[g(M,s+[(x,y)],p*M[x][y],y)for y in range(len(M))if(x,y)not in s])

এটি অনলাইন চেষ্টা করুন!

0-ভিত্তিক সূচক ব্যবহার (0 হোম মুদ্রা); সর্বাধিক পরিশোধ প্রদানের বিনিময়ের টিপলগুলির একটি তালিকা প্রদান করে।

পদ্ধতির পাশব বল হল: পুনরাবৃত্তির মাধ্যমে আমরা প্রতিটি অ প্রান্ত পুনরায় পথ থেকে শুরু পরিদর্শন শেষ 0(জন্য nমুদ্রায় সংখ্যা হচ্ছে, এই সর্বোচ্চ দেয় গভীরতা এর n^2)। এই পাথগুলির সাবসেটের জন্য '0' দিয়ে শেষ হওয়ার জন্য, আমরা পেওফটি সর্বাধিক করি।


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