ছদ্মবেশে অনুমান


17

একটি প্রদত্ত n -dimensional ভেক্টর v বাস্তব এন্ট্রি সঙ্গে, একটি ঘনিষ্ঠ বিন্যাস খুঁজে p এর (1,2,...,n) থেকে সম্মান সঙ্গে l1 -distance।

বিস্তারিত

  • যদি আরও বেশি সুবিধাজনক হয়, তাহলে আপনি এর একাধিক বিন্যাসন ব্যবহার করতে পারেন (0,1,...,n1) পরিবর্তে। যদি একাধিক নিকটতম ক্রমশক্তি থাকে তবে আপনি যে কোনও একটি বা বিকল্পভাবে সেগুলি আউটপুট দিতে পারেন।
  • l1 দুই ভেক্টর মধ্যে দূরত্ব u,বনাম হিসাবে সংজ্ঞায়িত করা হয়
    d(u,v)=i|uivi|
  • আপনি যদি চান, আপনি ধরে নিতে পারেন যে ইনপুটটি সম্পূর্ণরূপে পূর্ণসংখ্যা নিয়ে গঠিত।

উদাহরণ

[0.5  1] -> [1 2], [2 1]
c*[1 1 ... 1] -> any permutation
[1 4 2 6 2] -> [1 4 3 5 2], [1 4 2 5 3]
[1 3 5 4 1] -> [2 3 5 4 1], [1 3 5 4 2]
[7 7 3 2 5 6 4 2] -> [8 7 3 2 5 6 4 1], [8 7 3 1 5 6 4 2], [7 8 3 2 5 6 4 1], [7 8 3 1 5 6 4 2]
[-2 4 5 7 -1 9 3] -> [1 4 5 6 2 7 3], [2 4 5 6 1 7 3], [1 4 5 7 2 6 3], [2 4 5 7 1 6 3]
[0 4 2 10 -1 10 5] -> [1 4 2 6 3 7 5], [1 4 3 6 2 7 5], [2 4 3 6 1 7 5], [3 4 2 6 1 7 5], [1 4 2 7 3 6 5], [1 4 3 7 2 6 5], [2 4 3 7 1 6 5], [3 4 2 7 1 6 5]

আরও উদাহরণ উত্পন্ন করার জন্য অক্টাভা স্ক্রিপ্ট


আমরা কি গ্যারান্টিযুক্ত যে এর সমস্ত উপাদান এর vচেয়ে বেশি হবে 0? বা, কমপক্ষে, না 0?
শেগি

1
না, এর এন্ট্রিগুলি vকোনও পূর্ণসংখ্যা হতে পারে। (আরও কয়েকটি উদাহরণ যুক্ত করা হয়েছে))
flawr

যদি তারা কোনও প্রকৃত সংখ্যা হতে পারে তবে [1.6 2]এটি একটি গুরুত্বপূর্ণ পরীক্ষার কেস (লোভী অ্যালগরিদম / লিক্সোগ্রাফিক ক্রমটি ভুল উত্তর দেয়)।
হিস্টোক্র্যাট

2
ছদ্মবেশে নকল? আমি নিশ্চিত না যে এটি এটি যেমন বন্ধ করা উচিত, যদিও এটি স্পষ্ট নয় যে এটি একই কাজ (এখন xnor দ্বারা প্রমাণিত)।
আর্নৌল্ড

1
(আসলে, এটি একই কাজ নয়, তবে লিঙ্কযুক্ত চ্যালেঞ্জের সমস্ত সমাধানই এর সমাধান))
আর্নল্ড

উত্তর:


13

পাইথন 2 , 60 বাইট

def f(l):z=zip(l,range(len(l)));print map(sorted(z).index,z)

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

শূন্য-সূচক ব্যবহার করে।

একটি সহজ ধারণা সহ একটি দ্রুত অ্যালগরিদম। পাসে যেমন করতে আমরা পরিবর্তে ইনপুট তালিকা পরস্পর বিনিময় করা দরকার হয় তাহলে (1,2,...,n) সম্ভব হিসেবে আমরা, নিচের প্রমাণিত শুধু এটা সাজানোর উচিত। যেহেতু আমরা পরিবর্তে permuting করছি (1,2,.,এন) , আমরা বিন্যাস চয়ন আমার চ্যালেঞ্জ মত, ইনপুট তালিকা হিসাবে একই ভাবে আদেশ একটি ক্রম অনুকরণ করুন (ইনপুট ছাড়া পুনরাবৃত্তি হতে পারে)। (সম্পাদনা করুন: মাইল মাইল এই আরও অভিন্ন চ্যালেঞ্জটি নির্দেশ করেছে , যেখানে ডেনিসের একই উত্তর রয়েছে ))

দাবি: তালিকা একটি বিন্যাস যে তার দূরত্ব ছোট (1,2,,এন) হয় সাজানো।

প্রমাণ: কিছু অন্যান্য বিন্যাস বিবেচনা ' এর । আমরা প্রমাণ করব এটি এল এর চেয়ে ভাল আর হতে পারে না সাজানো।

দুই সূচকের বাছুন আমি, যে ' আউট-অফ-অর্ডার আছে, যে যেখানে আমি< কিন্তু আমি'>' । আমরা দেখাই যে, তাদের সোয়াপিং দূরত্ব বৃদ্ধি করতে পারবে না (1,2,,এন) । আমরা নোট করি যে অদলবদল এই দুটি উপাদানকে অবদানের পরিবর্তে নিম্নরূপ:

|lii|+|ljj||lij|+|lji|.

এটি দেখানোর জন্য একটি পরিষ্কার উপায় এখানে বাড়ানো যাবে না। দুই জনের একটি সংখ্যা লাইনে হাঁটা, এক থেকে যাচ্ছে বিবেচনা li করতে i এবং থেকে অন্য lj থেকে j । তারা চলার মোট দূরত্বটি বাম দিকের প্রকাশ। যেহেতু i<j তবে li>lj , তারা নম্বর লাইনের উপরে কে বেশি, তার অর্থ তারা হাঁটার সময় কিছুটা সময় অতিক্রম করতে হবে, তাকে p । কিন্তু যখন তারা p, তারপরে তারা তাদের গন্তব্যগুলি অদলবদল করতে এবং একই মোট দূরত্বে চলতে পারে। এবং তারপরে, পি ব্যবহারের পরিবর্তে তাদের পক্ষে তাদের অদলবদল গন্তব্যগুলিতে যাওয়া খুব খারাপ হতে পারে নাপি একটি ওয়েপয়েন্ট, যা ডান দিকে মোট দূরত্ব দেয় না।

সুতরাং, দুই আউট-অফ-অর্ডার উপাদান বাছাই ' তার দূরত্ব করে তোলে (1,2,,এন) ছোট বা একই। এই প্রক্রিয়াটির পুনরাবৃত্তিটি শেষ পর্যন্ত সাজবে। সুতরাং, সাজানো হয় অন্তত হিসাবে ভাল হিসাবে ' কোন পছন্দ জন্য ' , যা অনুকূল হিসাবে অথবা অনুকূল জন্য বাঁধা মানে।

নোট করুন যে একমাত্র সম্পত্তি (1,2,,এন) যে আমরা ব্যবহৃত যে এটি অনুসারে বাছাই করা, যাতে কিনা একই এলগরিদম কোন নির্দিষ্ট তালিকা তার দূরত্ব কমানোর জন্য কোনো তালিকা স্থানপরিবর্তন করা কাজ করবে।

কোডে, এর একমাত্র উদ্দেশ্য z=zip(l,range(len(l)))হ'ল ইনপুট উপাদানগুলিকে আলাদা করা, এটি সম্পর্কগুলি এড়ানো, অসম উপাদানগুলির মধ্যে একই তুলনা রেখে keeping যদি আমরা যে ইনপুটটির গ্যারান্টি দিয়েছিলাম তার পুনরাবৃত্তি না ঘটে তবে আমরা এটি সরিয়ে ফেলতে পারি এবং ঠিক আছে lambda l:map(sorted(l).index,l)


উজ্জ্বল অন্তর্দৃষ্টি
জোনা

ক্রমটি সন্ধানের ক্ষেত্রে আপনি এটিকে সহজ করেছেন ।
মাইল 6

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

সেই "ভিজ্যুয়াল প্রুফ" ঝরঝরে। আমি একই ধারণা পেয়েছি কিন্তু এটি প্রমাণ করার জন্য সেই সূত্রের প্রতিটি কেস বের করে দিতে হয়েছিল। পার্শ্ববর্তী মন্তব্য হিসাবে, তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে পাইথনে র‌্যাঙ্ক পাওয়ার কয়েকটি বিকল্প এই পোস্টে দেখানো হয়েছে
জোয়েল

5

05 এ বি 1 ই , 7 বাইট

āœΣαO}н

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


ব্যাখ্যা

ā              # get the numbers 1 to len(input) + 1
 œ             # Permutations of this
  Σ  }         # Sort by ...
   α           # Absolute difference
    O          # Sum these
      н        # And get the first one 
               # implicitly print

1
যতবার আমি এই দেখে অবাক হয়েছি, 05AB1E কি করতে পারে না ?
এলোমেলো লোক

5
@ থেরানডমগুয়ে এমন অনেক কিছুই নেই যা 05AB1E এ করা যায় না, তবে এটি বেশ খারাপ: রেজেক্স-ভিত্তিক চ্যালেঞ্জগুলি; ম্যাট্রিক্স-ভিত্তিক চ্যালেঞ্জগুলি (যদিও এটি কিছু নতুন বিল্টিন পরে উন্নত হয়েছে); কাল্পনিক সংখ্যার অভাব; তারিখ / সময় সম্পর্কিত চ্যালেঞ্জ; ইত্যাদি, যদিও হার্ড, এটি এখনও সাধারণত করা যায়। দুটি উদাহরণ দিতে: কার্য দিবস গণনা (পরের দিন যান, এবং সপ্তাহের দিন পান ম্যানুয়ালি করা হয়); কুইন নিজেকে বাইনারি আউটপুট করে (ইউটিএফ -8 রূপান্তরটি ম্যানুয়ালি করা হয়)।
কেভিন ক্রুইজসেন

@ গ্রিমি এখনই ঠিক করা উচিত :)
মেয়াদোত্তীর্ণ ডেটা

3

পার্ল 6 , 44 বাইট

{permutations(+$_).min((*[]Z-$_)>>.abs.sum)}

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

অজ্ঞাতনামা কোডব্লক যা 0 সূচকের সাথে প্রথম সর্বনিম্ন ক্রমান্বয়ে ফিরে আসে।

ব্যাখ্যা:

{                                          }   # Anonymous code block
 permutations(+$_)                             # From the permutations with the same length
                  .min(                   )    # Find the minimum by
                                      .sum       # The sum of
                                >>.abs           # The absolute values of
                       (*[]Z-$_)                 # The zip subtraction with the input

আমি মনে করি আমি .sumকেবল পরম মানগুলির তালিকা অনুসারে এটিকে বাছাই করতে এবং সক্ষম করতে সক্ষম হতে পারি তবে আমি নিশ্চিত নই যে এটি আসলে ক্রেট, যদিও এটি আমার বর্তমান পরীক্ষার কেসগুলি পাস করে।


1
এটি আমার মস্তিষ্ককেও ভেঙে দিচ্ছিল (বা "লোভী অ্যালগরিদম কি এর জন্য কাজ করে?") এর বেশিরভাগ সমতুল্য প্রশ্ন। সবচেয়ে সহজ কাউন্টারিক্স উদাহরণটি হ'ল [0.6 1](আমরা 0-সূচকযুক্ত ধরে নিচ্ছি), যেখানে আপনি প্রথম মানটির [1,0]জন্য 1.4 এর স্কোরের জন্য অপ্টিমাইজ করেন তবে আপনি যদি পুরো ভেক্টরটির জন্য অনুকূল হন তবে 1 স্কোরের জন্য দ্বিতীয় অবস্থানে আরও মূল্যবান হয় 0.6 এর।
হিস্টোক্র্যাট


2

জেলি , 5 বাইট

Œ¿œ?J

সংখ্যার একটি তালিকা গ্রহণ করে একটি মোনাডিক লিঙ্ক, যা পূর্ণসংখ্যার একটি তালিকা দেয়।

এটি অনলাইন চেষ্টা করুন! অথবা পরীক্ষা-স্যুটটি দেখুন

কিভাবে?

Œ¿œ?J - Link: list of numbers, X
Œ¿    - Index of X in a lexicographically sorted list of
         all permutations of X's items
    J - range of length of X
  œ?  - Permutation at the index given on the left of the
         items given on the right

এনবি L(দৈর্ঘ্য) Jযেহেতু œ?একটি পূর্ণসংখ্যা দেওয়া হয়েছে তার জায়গায় কাজ করবে n, ডানদিকে স্পষ্টতই [1..n]কাজ করার জন্য পরিসীমা তৈরি করবে , তবে Jতা স্পষ্ট।


2

রুবি , 63 60 বাইট

->v{[*1..v.size].permutation.max_by{|p|eval [p,0]*'*%p+'%v}}

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

এখানে একটি গণিতের কৌশল আছে যা অন্যান্য উত্তরগুলিতেও সহায়ক হতে পারে - পার্থক্যের নিখুঁত মানগুলির যোগফলকে হ্রাস করার পরিবর্তে, আমরা সর্বাধিকীকরণ করি পণ্যের যোগফলকে আরও । কেন যে কাজ করে?

যোগফলের পরিমাণ (x-y) squaredহ্রাস করা সমষ্টিকে হ্রাস করার সমতুল্য নয়|x-y| , তবে এটি সর্বদা একটি বৈধ উত্তর দেবে, এটি কেবলমাত্র ছোটদের তুলনায় বড় পার্থক্য হ্রাসকে অগ্রাধিকার দেয় যেখানে প্রকৃত চ্যালেঞ্জ দু'জনের মধ্যে উদাসীন।

তবে (x-y)*(x-y)= x*x+y*y-2*x*y। যেহেতু বর্গাকার শর্তাবলী যে কোনও ক্রম ছাড়ার জন্য সর্বদা কোথাও প্রদর্শিত হবে, সেগুলি ফলাফলকে প্রভাবিত করে না, তাই আমরা সহজ করতে পারি -2*x*y2কারণের বাইরে, তাই আমরা করতে প্রক্রিয়া সহজ করতে -x*y। তারপরে যদি আমরা মিনিমাইজিং সর্বাধিককরণে পরিবর্তন করি তবে আমরা সহজ করতে পারি x*y

স্বজ্ঞাতভাবে, এটি পর্যবেক্ষণের অনুরূপ যে আপনি যদি আনুভূমিক দেয়ালগুলির একটি সেট এবং উল্লম্ব একটি সেট ব্যবহার করে বর্গ ফুটেজ সর্বাধিক করার চেষ্টা করছেন, আপনি ঘর তৈরির জন্য একে অপরের সাথে আকারের প্রাচীর জোড়া বাঁধার সেরা are যতটা সম্ভব বর্গাকার কাছাকাছি 3*3 + 4*4 = 25যখন,3*4 + 4*3 = 24

সম্পাদনা করুন: জিপ এবং যোগফল ব্যবহার না করে ফর্ম্যাট স্ট্রিং তৈরি এবং মূল্যায়ন করে তিনটি বাইট সংরক্ষণ করা।


2
(Xy) স্কোয়ারের যোগফলকে হ্রাস করা | | xy | এর যোগফলকে হ্রাস করার সমতুল্য নয়, তবে এটি সর্বদা একটি বৈধ উত্তর দেবে। কেন এটা মামলা? নেই কোনY যে হ্রাস Σ|এক্স-Y| কিন্তু না Σ(এক্স-Y)2?
জোয়েল


1

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

এক্সনোর অন্তর্দৃষ্টি ভিত্তিক ।

a=>[...a].map(g=n=>g[n]=a.sort((a,b)=>a-b).indexOf(n,g[n])+1)

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

মন্তব্য

a =>                    // a[] = input array
  [...a]                // create a copy of a[] (unsorted)
  .map(g = n =>         // let g be in a object; for each value n in the copy of a[]:
    g[n] =              //   update g[n]:
      a.sort(           //     sort a[] ...
        (a, b) => a - b //       ... in ascending order
      ).indexOf(        //     and find the position
        n,              //       of n in this sorted array,
        g[n]            //       starting at g[n] (interpreted as 0 if undefined)
      ) + 1             //     add 1
  )                     // end of map()

জাভাস্ক্রিপ্ট (ES6),  130  128 বাইট

সেখানে  থাকতে হবে  স্পষ্টভাবে হয় একটি অধিক প্রত্যক্ষ ভাবে ...

0-ইন্ডেক্স।

a=>(m=g=(k,p=[])=>1/a[k]?(h=i=>i>k||g(k+1,b=[...p],b.splice(i,0,k),h(-~i)))``:p.map((v,i)=>k+=(v-=a[i])*v)|k>m||(R=p,m=k))(0)&&R

এটি অনলাইন চেষ্টা করুন! (1-ইনডেক্সড আউটপুট সহ)

কিভাবে?

সহায়ক ফাংশন সমস্ত অনুমতি গণনা (0,,এন-1), কোথায় এন ইনপুট অ্যারের অন্তর্নিহিত দৈর্ঘ্য একটি[]

প্রতিটি আদেশের জন্য পি, আমরা গণনা:

=এন-1+ +Σআমি=0এন-1(পিআমি-একটিআমি)2
নেতৃত্বের একমাত্র কারণ এন-1 আমরা এর অভ্যন্তরীণ কাউন্টারটিকে পুনরায় ব্যবহার করি কয়েকটি বাইট সংরক্ষণ করতে, তবে চূড়ান্ত ফলাফলের উপর এর কোনও প্রভাব নেই।

আমরা অবশেষে সেই আদেশটি ফিরিয়ে দিই যা ক্ষুদ্রতম দিকে নিয়ে যায়



1

পাইথন 2 , 149 126 112 বাইট

-23 বাইটস মিঃ এক্সকোডারকে ধন্যবাদ

-14 বাইট Xnor ধন্যবাদ

from itertools import*
f=lambda a:min(permutations(range(len(a))),key=lambda x:sum(abs(a-b)for a,b in zip(x,a)))

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

(0 ... এন -1) এর ক্রম ব্যবহার করে।


আপনি পাইথন 2 এ স্যুইচ করতে পারেন, যাতে আপনার functoolsআর প্রয়োজন হয় না।
মিঃ এক্সকোডার

reduceসাধারণত ওভারকিল হয়, বিশেষত এখানে যেখানে আপনি স্টাফ যুক্ত করছেন। আমি মনে করি আপনি ঠিক করতে পারেন sum(abs(p-q)for p,q in zip(x,a))
xnor



0

জাপট -g , 12 বাইট

Êõ á ñÈíaU x

চেষ্টা করে দেখুন

0-ইনডেক্সডের m,জন্য অ্যারের মানচিত্রের পরিবর্তে প্রথম 2 বাইটগুলি পরিবর্তিত করুন এর পরিবর্তে সূচকগুলিতে।

Êõ á ñÈíaU x     :Implicit input of array U
Ê                :Length
 õ               :Range [0,Ê]
   á             :Permutations
     ñÈ          :Sort by
       í U       :  Interleave with U
        a        :  Reduce each pair by absolute difference
           x     :  Reduce resulting array by addition
                 :Implicit output of first sub-array

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