কোনও নমুনাকে সূচকে রূপান্তর করুন


12

আমরা একটি নির্দিষ্ট সংখ্যায় একটি বিনকে বলগুলি রাখছি । এই বাক্সগুলি খালি শুরু হয়।

Empty bin (a=4): 0 0 0 0 

এবং একে একে আমরা বিনগুলিতে বল যোগ করি।

0 0 0 1  or
0 0 1 0  or
0 1 0 0  or
1 0 0 0

বিনগুলি যে সমস্ত সম্ভাব্য রাজ্যগুলি ডুপ্লিকেট ছাড়াই এবং কোনও অনুপস্থিত ছাড়াই গ্রহণ করা যায় সেগুলি লুপ করার জন্য আমাদের দ্রুত উপায় প্রয়োজন এবং আমরা সম্ভাব্য সমস্ত বিনগুলি গণনা করতে চাই না। সুতরাং পরিবর্তে আমরা প্রতিটি বিন-কনফিগারেশনকে একটি সূচি নির্ধারণ করি।

সম্ভাব্য কনফিগারেশনগুলিকে নির্দিষ্ট উপায়ে বাছাই করে আমরা সূচিটি নির্ধারণ করি:

  1. যোগফল অনুসারে বাছাই করুন: সুতরাং প্রথমে 0 0 0 0, তারপরে 1 বল যুক্ত সম্ভাব্য কনফিগারেশনগুলি, তারপরে 2 ইত্যাদি etc.
  2. তারপরে প্রথম বিন থেকে শেষ অবধি প্রতিটি যোগফলের মধ্যে বাছাই করুন:

    0 0 0 2
    0 0 1 1
    0 0 2 0 
    0 1 0 1
    0 1 1 0 
    0 2 0 0 
    etc
    
  3. এরপরে সূচকটি এই তালিকার মাধ্যমে আরোহণের জন্য নির্ধারিত হয়:

    0 0 0 0  -> 1
    0 0 0 1  -> 2
    0 0 1 0  -> 3
    0 1 0 0  -> 4
    1 0 0 0  -> 5
    0 0 0 2  -> 6
    0 0 1 1  -> 7
    0 0 2 0  -> 8
    0 1 0 1  -> 9
    0 1 1 0  -> 10
    0 2 0 0  -> 11 
    

বিধি

একটি ফাংশন বা প্রোগ্রাম তৈরি করুন যা অ-নেতিবাচক পূর্ণসংখ্যার সাথে কোনও আকারের একটি তালিকা নেয় এবং তার সূচকটি মুদ্রণ বা আউটপুট করে। আপনি অনুমান করতে পারেন একটি অন্তত 2. সংক্ষিপ্ততম কোড জয়ী হতে হবে। আপনি 0-ইনডেক্সড আউটপুট বা 1-ইনডেক্সেড ব্যবহার করতে পারেন তবে আপনি কোনটি ব্যবহার করবেন তা নির্দিষ্ট করুন। নোট: সমস্ত উদাহরণ এখানে 1-ইনডেক্সড।

উদাহরণ কোড

গল্ফড নয়, আর তে:

nodetoindex <- function(node){
  a <- length(node)
  t <- sum(node)
  if(t == 0) return(1)

  index <- choose(t-1 + a, a)

  while(sum(node) != 0){
    x <- node[1]
    sumrest <- sum(node)
    if(x == 0){
      node <- node[-1]
      next
    }
    a <- length(node[-1])
    index <- index + choose(sumrest + a, a) - choose(sumrest - x + a, a)
    node <- node[-1]
  }
  return(index + 1)
} 

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

10 10 10 10 -> 130571
3 1 4 1 5 9 -> 424407
2 9 -> 69
0 0 0 -> 1
0 0 1 -> 2
0 0 0 0 0 0 -> 1
1 0 0 0 0 1 -> 23

গণনাগুলিতে বিভিন্ন সংখ্যার সংখ্যা থাকলে কীভাবে সংক্ষিপ্তকরণের সংখ্যাগত মানের মাধ্যমে বাছাই করা যায়?
দ্য বাইকিংভিকিং

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

উত্তর:


3

জেলি , 8 বাইট

S0rṗLSÞi

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

নিষ্ঠুর শক্তি সমাধান। টিআইওর জন্য প্রথম পরীক্ষার কেসটি অনেক বেশি তবে আমি আমার ল্যাপটপে এটি স্থানীয়ভাবে যাচাই করেছি। দ্বিতীয় পরীক্ষার ক্ষেত্রে এমনকি আমার ডেস্কটপ কম্পিউটারের জন্য খুব বেশি র্যাম প্রয়োজন।

কিভাবে এটা কাজ করে

S0rṗLSÞi  Main link. Argument: A (array)

S         Compute the sum s of A.
 0r       Create the range [0, ..., s].
    L     Yield the length l of A.
   ṗ      Cartesian power; yield the array of all l-tuples over [0, ..., s], in
          lexicographical order.
     SÞ   Sort the l-tuples by their sums. The sorting mechanism is stable, so
          l-tuples with the same sum are still ordered lexicographically.
       i  Find the index of A in the generated array of tuples.

খুশী হলাম। র‌্যাম সম্পর্কে আপনার মন্তব্য আমাকে এই চ্যালেঞ্জের উত্সের কথা মনে করিয়ে দিয়েছে। আমার থিসিসের জন্য আমার কিছু a = 8 এবং যতটা সম্ভব বলের উচ্চতর জন্য সমস্ত সম্ভাব্য অ্যারেগুলি লুপ করা দরকার । অ্যারেগুলিকে সূচকগুলিতে রূপান্তর করতে এবং সেগুলির উপরে মাত্র লুপটি র্যামের সীমাবদ্ধতা থেকে এসেছে: পি
জেডি

উদাহরণস্বরূপ কোডটি এতটাই স্পষ্ট যে কারণেও: পি
জেডি

1

ক্লোজার, 152 বাইট

#(loop[v[(vec(repeat(count %)0))]i 1](if-let[r((zipmap v(range))%)](+ r i)(recur(sort(set(for[v v i(range(count v))](update v i inc))))(+ i(count v)))))

আমি যতটা ভেবেছি তত সহজ নয়। কম গল্ফ সংস্করণ:

(def f (fn[t](loop[v[(vec(repeat(count t)0))]i 1]
               (if-let[r((zipmap v(range))t)](+ r i)
                 (recur (sort-by (fn[v][(apply + v)v]) (set(for[v v i(range(count v))](update v i inc))))
                        (+ i(count v)))))))

বর্তমান রাজ্যগুলির উপরে লুপস v, vতাদের পদমর্যাদার উপাদান থেকে একটি হ্যাশ-মানচিত্র তৈরি করে , যদি অনুসন্ধানের রাজ্যটি পাওয়া যায় তবে তার র‌্যাঙ্কটি ফিরে আসবে (+ পূর্বে দেখা রাজ্যের সংখ্যা)। যদি পাওয়া না যায় তবে সম্ভাব্য রাজ্যের একটি নতুন সেট দিয়ে পুনরাবৃত্তি করে।

ওহ আসলে আমাদের সেই কাস্টম বাছাইয়ের ফাংশনটি প্রয়োজন নেই কারণ প্রতিটি লুপের মধ্যে সমস্ত রাজ্যের অভিন্ন পরিমাণ রয়েছে। এটি [3 1 4 1 5 9]কেবল 2.6 সেকেন্ডের মতো আমি প্রত্যাশা করেছিলাম তেমন ধীর নয় ।


1

গণিত, 50 বাইট

ডেনিসের জেলি উত্তর একটি বন্দর ।

0~Range~Tr@#~Tuples~Length@#~SortBy~Tr~Position~#&

নামহীন ফাংশন ইনপুট হিসাবে পূর্ণসংখ্যার একটি তালিকা গ্রহণ করে এবং আউটপুট হিসাবে একক পূর্ণসংখ্যার সাথে গভীরতা -2 তালিকার প্রত্যাবর্তন করে; উদাহরণস্বরূপ, শেষ পরীক্ষার ক্ষেত্রে ইনপুটটি হয় {1,0,0,0,0,1}এবং আউটপুট হয় {{23}}

কিছুটা অবারিত সংস্করণ হ'ল:

Position[SortBy[Tuples[Range[0,Tr[#]],Length[#]],Tr],#]&

প্রায়শই আমরা গণিতের পৃথক বাইটগুলি উপসর্গ স্বরলিপি ( function@nপরিবর্তে function[n]) এবং ইনফিক্স নোটেশন ( a~function~bপরিবর্তে ) ব্যবহার করে সংরক্ষণ করতে পারি function[a,b]। এটি কেবল তখনই কাজ করে, যখন ফলস্বরূপ কোডটি ম্যাথমেটিকার কার্যকারিতা প্রয়োগের জন্য অন্তর্নিহিত অগ্রাধিকার আদেশের সাথে ভালভাবে জাল হয়ে যায়। আমি এখানে বিস্মিত যে, বর্গাকার বন্ধনী ছয় সেট সঙ্গে, এটা আসলে মুছে ফেলার জন্য কাজ ধরনের ছিল সব তাদের এবং (pleasantly, bracketless) সঙ্গে ছয় বাইট পেশ কোড সংরক্ষণ।

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