আমার শপিং ব্যাগগুলি বহন করতে আমাকে সহায়তা করুন


26

গরমের সন্ধ্যা ছিল ...

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

আমার শহরে শহরে চলেছে

তোমার লক্ষ্য

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

ওজন বাম হাত - ওজন ডান হাত ≈ 0

উদাহরণ

আমার কাছে যদি কেবল 2 টি আইটেম, রুটি এবং চিনাবাদাম মাখন থাকে এবং রুটির ওজন 250 গ্রাম এবং চিনাবাদাম মাখন 150 গ্রাম হয়, তবে এটিকে দুটি হাতে আলাদা করে রাখাই ভাল উপায়।

ওয়াট এলএইচ - Cybo আরএইচ = ওয়াট (রুটি) - Cybo (P.BUTTER)
250 - 150 = 100

অন্য সম্ভাবনাটি হ'ল:

ডাব্লু (ব্রিড, পি। বাটার) - ডাব্লু (খালি হাত) = (250 + 150) - 0 = 400

এটি আমাদের প্রথম মামলার চেয়ে ভাল নয়, সুতরাং আপনার প্রথমটির সাথে যাওয়া উচিত।

আপনার কোড করা উচিত

  1. শপিং ব্যাগে আইটেমের ওজন নির্দেশ করে এমন সংখ্যার ইনপুট নিন। ইউনিটগুলি গুরুত্বপূর্ণ নয়, তবে সেগুলি একই হওয়া উচিত (আদর্শ কিলোগ্রাম বা গ্রাম)। ইনপুট একবারে বা একসাথে করা যেতে পারে। আপনি যদি চান তবে মোট সংখ্যা 20 আইটেম সীমাবদ্ধ রাখতে পারেন।
  2. ইনপুট ফর্ম্যাট / প্রকারটি আপনি চয়ন করতে পারেন তবে ওজন ব্যতীত অন্য কোনও কিছুর উপস্থিতি থাকা উচিত নয়।
  3. যে কোনও ভাষা অনুমোদিত, তবে মানক গ্রন্থাগারগুলিতে আটকে দিন।
  4. আউটপুট প্রদর্শন করুন। আবার, আপনি বিন্যাসটি চয়ন করতে নিখুঁত, তবে আপনার পোস্টে ফর্ম্যাটটি ব্যাখ্যা করুন। অর্থাত্, কীভাবে আমরা বলতে পারি কোনটি বাম হাতের আইটেম এবং কোনটি ডান হাতের আইটেম।

পয়েন্ট

  1. সংক্ষিপ্ততম কোড জিতেছে।

ইঙ্গিত

দুটি সম্ভাব্য অ্যালগরিদম যা আমি ভাবতে পারি সেগুলি হ'ল ডিফারেন্টেশন (দ্রুত) এবং ক্রম / সংমিশ্রণ (ধীর)। আপনি এগুলি বা অন্য কোনও অ্যালগরিদম ব্যবহার করতে পারেন যা কাজটি করে।


5
আমি 2 রুল পছন্দ করি, এটি নমনীয় তবে প্রতারণার অনুমতি দেয় না
edc65

2
আপনি মূলত ন্যাপস্যাক সমস্যাটি পুনরায় উদ্ভাবন করেছেন। en.wikedia.org/wiki/Knapsack_problem
স্পার

আপনাকে ধন্যবাদ @ স্পার আমি দুষ্ট স্মাট (সত্যই নয়)
লিডার

2
এই সমস্যাটি এই সাইটের জন্য অনেক বেশি বাস্তব এবং বাস্তববাদী।
মনিকা iamnotmaynard

উত্তর:


15

পাইথ, 9 বাইট

ehc2osNyQ

ইনপুট, আউটপুট ফর্ম্যাটগুলি:

Input:
[1, 2, 3, 4, 5]
Output:
[1, 2, 4]

প্রদর্শন.

ehc2osNyQ
             Q = eval(input())
       yQ    Take all subsets of Q.
    osN      Order those element lists by their sums.
  c2         Cut the list in half.
eh           Take the last element of the first half.

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


ওপি-র উত্তর কেবল এক হাতে ব্যাগগুলি মুদ্রণ করে, তাই আপনার 9 বাইট সমাধানের জন্য সম্মতি জানায়।
ডেনিস

আপনার লেখার ইনপুট জন্য বাগ করা হয়েছে [7 7 7 10 11] ট্রেসব্যাক (সর্বশেষতম কলটি শেষ): <Module> ফাইল "<string>", লাইন 4-তে, "pyth.py", লাইন 772, ফাইল "/app/macros.py", লাইন 865, ক্রমে টাইপ করুন: অকেজোযোগ্য প্রকারগুলি: int () <তালিকা ()
রোজলুপি

@ রোসলুপি এটি তখন কাজ করেছিল, আমি এমন কিছু পরিবর্তন করেছি sযার ফলে এটি কাজ করা বন্ধ করে দিয়েছে। লোকেদের পরিবর্তনটি পছন্দ হয়নি, এবং আপনার মন্তব্যটি আমার এটিকে ফিরিয়ে দেওয়ার জন্য আমার চূড়ান্ত ধাক্কা ছিল।
isaacg

মন্তব্য করা কোডে এটি "কিউর উপসেট" হওয়া উচিত না তবে "কিউর সাবলিস্ট" হওয়া উচিত
রোজলুপি

@ রোসলুপ আমি দ্বিমত পোষণ করছি - একটি উপ-তালিকা সাধারণত সংক্ষিপ্ত। সাবসেট এবং সাবকোয়েন্স এই জাতীয় জিনিসের জন্য দুটি পদ।
isaacg

6

পাইথ, 16

ho.a-FsMNs./M.pQ

এটি ইনপুটগুলিকে STDIN এ পাইথোনিক তালিকা হিসাবে গ্রহণ করে। আউটপুটটি 2 টি তালিকার একটি তালিকা যা প্রথম ব্যাগের আইটেমগুলির সাথে প্রথম তালিকা এবং দ্বিতীয় ব্যাগের আইটেমগুলিকে প্রতিনিধিত্ব করে দ্বিতীয় তালিকা। এই ব্রুটটি সমস্ত সংমিশ্রণকে জোর করে, তাই এটি বড় ইনপুটগুলির জন্য খুব ধীরে ধীরে চলবে (বা স্মৃতির বাইরে চলে যাবে)।

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

কেবলমাত্র একটি ইনপুট হ্যান্ডলিং সমর্থন করতে, এটি 17 পর্যন্ত যায়:

hho.a-FsMNs./M.pQ

এটি এক হাতে থাকা মানগুলি মুদ্রণ করবে।


এটি একটি খুব চিত্তাকর্ষক সমাধান - এটি যেমন ত্রুটিযুক্ত উত্তর দেয় না তা মোটেও সুস্পষ্ট নয় [[2], [1], [1]], তবে আমি মনে করি এটি ঠিক কীভাবে ./কাজ করে তার কারণে এটি কাজ করে।
isaacg

প্রকৃতপক্ষে, আমি মনে করি এটি এমন ক্ষেত্রে ব্যর্থ হয় যেখানে সমস্ত কিছুই এক হাতে যায় যেমন কেবল যখন 1 টি বস্তু থাকে।
isaacg

@ আইস্যাচজি আমার ধরণের এক ধরণের ধারণা ছিল 1 টি জিনিস বৈধ নয়, কারণ আপনার স্পষ্টতই এটি কেবল একটি হাতে ধরে রাখা উচিত to আমি সত্যিই জানতাম না যে এর জন্য কী ফিরতে হবে [[x], []]?
FryAmTheEggman

আমার ধারণা তাই - যদি অপি অন্যথায় না বলে তবে সম্ভবত এটি ঠিক আছে।
isaacg

@ আইসএইচজি আমি নীচে একটি উত্তর পোস্ট করেছি। এটি 1 টি উপাদানটির সঠিক উত্তর দেয় (আমাকে কোডে আরও একটি বাইট যোগ করতে হয়েছিল)
রেনে লিডার

6

সিজেম, 19 18 বাইট

{S+m!{S/1fb:*}$W=}

এটি একটি বেনামে ফাংশন যা স্ট্যাক থেকে পূর্ণসংখ্যার অ্যারে পপ করে এবং একটি স্পেস দ্বারা পৃথক পূর্ণসংখ্যার অ্যারে প্রদান করে।

@ জিমি 23013 তার কৌতূহল কৌশলের জন্য ধন্যবাদ :*, যা 1 বাইট সংরক্ষণ করেছে saved

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

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

S+    e# Append a space to the array of integers.
m!    e# Push the array of all possible permutations.
{     e# Sort the array by the following:
  S/  e#   Split the array at the space.
  1fb e#   Add the integers in each chunk (using base 1 conversion).
  :*  e#   Push the product of both sums.
}$    e# Permutations with a higher product will come last.
W=    e# Select the last permutation.

ডাব্লু দিয়ে শপিং ব্যাগের মোট ওজন বোঝান । তারপরে, যদি কোনও এক হাতে থাকা ব্যাগগুলির ওজন ডাব্লু / 2 - ডি / 2 হয় , তবে অন্য হাতে তাদের অবশ্যই ওজন করতে হবে এবং ডাব্লু - (ডাব্লু / 2 - ডি / 2) = ডাব্লু / 2 + ডি / 2

আমরা ডি পার্থক্য হ্রাস করার চেষ্টা করছি । তবে (ডাব্লু / 2 - ডি / 2) (ডাব্লু / 2 + ডি / 2) = ডাব্লু ^ 2/4 - ডি ^ 2/4 , যা ডি আরও ছোট হওয়ার সাথে সাথে বড় হয় ।

সুতরাং, সর্বাধিক পণ্য ন্যূনতম পার্থক্যের সাথে মিলে যায়।


আমার মনে হয় :*... W=কাজ করা উচিত।
জিমি 23013

@ জিমি 23013: ধন্যবাদ! এটি আমার উত্তরটিকে আরও অনেক আকর্ষণীয় করে তুলেছে।
ডেনিস

5

পাইথন 2.7, 161 , 160

কোড

from itertools import*
m=input();h=sum(m)/2.;d=h
for r in(c for o in range(len(m)+1) for c in combinations(m,o)):
 t=abs(h-sum(r))
 if t<=d:d=t;a=r
print a

অ্যালগরিদম

2 এক্স ওয়াট একদিকে = মোট ওজন
ডব্লিউ একদিকে ~ মোট ওজন / 2

প্রতিটি সমন্বয় মোট ওজনের অর্ধেকের কাছাকাছি চলেছে কিনা তা পরীক্ষা করুন। ইটারেট করুন এবং সেরাটি সন্ধান করুন।

ইনপুট

>>>[1,2,3,4]

আউটপুট

(2, 3)

প্রদর্শিত টিপল এক হাতে যায়, যেগুলি প্রদর্শিত হয় না সেগুলি অন্য হাতে যায় (এটি নিয়মের বিরুদ্ধে নয়)।


আপনি এক বাইট বাঁচাতে পেরেছিলেনfrom itertools import*
ডিজেএমসিএমহেম

4

জাভাস্ক্রিপ্ট ( ES6 ) 117

প্রতিটি সম্ভাব্য বিভাজন চেষ্টা করার জন্য একটি বিট মাস্ক ব্যবহার করে, সুতরাং এটি 31 আইটেমের মধ্যে সীমাবদ্ধ (নিয়মের সাথে ঠিক আছে)। রেফের মত উত্তর এটি কেবল একটি হাত আউটপুট। দ্রষ্টব্য: আমি ম্যাথ.এবস এড়ানোর জন্য ন্যূনতম পার্থক্য> = 0 খুঁজছি, প্রতি মিনিট হিসাবে <0 অন্য আরেকটি> 0 আছে, কেবল হাত অদলবদল করে।

পরীক্ষার জন্য: ফায়ারফক্সে স্নিপেট চালান, কমা বা স্থান পৃথক পৃথক সংখ্যার একটি তালিকা ইনপুট করুন।

f=(l,n)=>{ // the unused parameter n is inited to 'undefined'
  for(i=0;++i<1<<l.length;t<0|t>=n||(r=a,n=t))
    l.map(v=>(t+=i&m?(a.push(v),v):-v,m+=m),m=1,t=0,a=[]);
  alert(r)
}

// Test

// Redefine alert to avoid that annoying popup when testing
alert=x=>O.innerHTML+=x+'\n';

go=_=>{
  var list=I.value.match(/\d+/g).map(x=>+x); // get input and convert to numbers
  O.innerHTML += list+' -> ';
  f(list);
}
#I { width: 300px }
<input id=I value='7 7 7 10 11'><button onclick='go()'>-></button>

<pre id=O></pre>


2

হাস্কেল, 73 বাইট

import Data.List
f l=snd$minimum[(abs$sum l-2*sum s,s)|s<-subsequences l]

এক হাতে আইটেমের তালিকা আউটপুট করে। নিখোঁজ উপাদানগুলি অন্যদিকে যায়।

ব্যবহার: f [7,7,7,10,11]->[7,7,7]

sইনপুট তালিকার সমস্ত উপকেন্দ্রের জন্য এবং এর অনুপস্থিত উপাদানগুলির lমধ্যে ওজনের পার্থক্যের নিখুঁত মান গণনা করুন । সর্বনিম্ন সন্ধান করুন।sl


1

হাস্কেল, 51 বাইট

f l=snd$minimum$((,)=<<abs.sum)<$>mapM(\x->[x,-x])l

আউটপুট ফর্ম্যাটটি হ'ল বাম হাতের ওজনগুলি ধনাত্মক এবং ডান হাতের ওজন negativeণাত্মক।

>> f [2,1,5,4,7]
[-2,-1,5,4,-7]

প্রতিটি সম্ভাব্য বিভাজন তৈরি করতে, আমরা mapM(\x->[x,-x])lউপাদানগুলির প্রতিটি সম্ভাব্য উপসেটটি উপেক্ষা করতে ব্যবহার করি । তারপরে, ((,)=<<abs.sum)প্রতিটিকে এর নিখুঁত যোগফল সহ লেবেল করুন এবং snd$minimum$((,)=<<abs.sum)ক্ষুদ্রতম-লেবেলযুক্ত উপাদানটি গ্রহণ করুন।

টাইপ-চেক করার কারণে আমি এটি বিন্দু মুক্ত করতে পারিনি।


@ উইলনেস তারা সমস্তই বর্তমান সংস্করণে উপস্থাপিত।
xnor

BTW নিম্নলিখিত বিন্দু-মুক্ত কোড GHCi প্রম্পটে কাজ করে: snd.minimum.map((,)=<<abs.sum).mapM(\x->[x,-x])। এটি 47 বাইট (যদিও আমার আরও পুরানো সংস্করণ ইনস্টল করা আছে ...)
নেস উইল

0

আর (234)

আর এর সাথে একটি দীর্ঘ এবং ধীর সমাধান

ফাংশন:

function(p){m=sum(p)/2;n=100;L=length(p);a=matrix(0,n,L+2);for(i in 1:n){idx=sample(1:L,L);a[i,1:L]=idx;j=1;while(sum(p[idx[1:j]])<=m){a[i,L+1]=abs(sum(p[idx[1:j]])-m);a[i,L+2]=j;j=j+1}};b=which.min(a[,L+1]);print(p[a[b,1:a[b,L+2]]])}


প্রত্যাশিত ইনপুট - ওজন সহ ভেক্টর।
প্রত্যাশিত আউটপুট - এক হাতের ওজন সহ ভেক্টর।


উদাহরণ

> Weight(c(1,2,3,4))
[1] 3 2
> Weight(c(10,1,2,3,4))
[1] 10
> Weight(c(40,20,80,50,100,33,2))
[1] 100  40  20  2
> Weight(c(7,7,7,10,11))
[1] 7 7 7

মানব পাঠযোগ্য কোড সংস্করণ:

weight <- function(input) {
  mid <- sum(input)/2
  n <- 100
  input_Length <- length(input)
  answers <- matrix(0, n, input_Length+2)
  for(i in 1:n){
    idx <- sample(1:input_Length, input_Length)
    answers[i, 1:input_Length ] <- idx
    j <- 1
    while(sum(input[idx[1:j]]) <= mid){
        answers[i, input_Length+1] <- abs(sum(input[idx[1:j]]) - mid)
        answers[i, input_Length+2] <- j
        j <- j + 1
    }
  }
  best_line <- which.min(answers[, input_Length+1])
  print(paste("weight diference: ", answers[best_line, input_Length+1]))
  print(input[answers[best_line, 1:answers[best_line, input_Length+2]]])
}

0

অ্যাক্সিয়োম, 292 বাইট

R==>reduce;F(b,c)==>for i in 1..#b repeat c;p(a)==(#a=0=>[a];w:=a.1;s:=p delete(a,1);v:=copy s;F(s,s.i:=concat([w],s.i));concat(v,s));m(a)==(#a=0=>[[0],a];#a=1=>[a,a];b:=p(a);r:=[a.1];v:=R(+,a)quo 2;m:=abs(v-a.1);F(b,(b.i=[]=>1;d:=abs(v-R(+,b.i));d<m=>(m:=d;r:=copy b.i);m=0=>break));[[m],r])

একটি নিষ্ঠুর শক্তি প্রয়োগ। এটি সেটটি ন্যূনতম করবে

A={abs(reduce(+,a)quo 2-reduce(+,x))|x in powerSet(a)}

কারণ যদি ন্যূনতম হয়

y=min(A)=abs(reduce(+,a)quo 2-reduce(+,r))

এটিও ন্যূনতম হবে

2*y=abs(reduce(+,a)-2*reduce(+,r))=abs((reduce(+,a)-reduce(+,r))-reduce(+,r)) 

যেখানে (কমিয়ে (+, ক) -ড্রেস (+, আর)) এবং হ্রাস (+, আর) হ'ল দুটি ব্যাগের 2 ওজন that Ungolf এবং ফলাফল

-- Return the PowerSet or the Powerlist of a
powerSet(a)==
    #a=0=>[a]
    p:=a.1;s:=powerSet delete(a,1);v:=copy s
    for i in 1..#s repeat s.i:=concat([p],s.i)
    concat(v,s)

-- Return one [[m], r] where
-- r is one set or list with reduce(+,r)=min{abs(reduce(+,a)quo 2-reudece(+,x))|x in powerSet(a)}
-- and m=abs(reduce(+,a) quo 2-reduce(+,r))
-- because each of two part, has to have the same weight
MinDiff(a)==
    #a=0=>[[0],a]
    #a=1=>[ a ,a]
    b:=powerSet(a)
    r:=[a.1];v:=reduce(+,a) quo 2;m:=abs(v-a.1)
    for i in 1..#b repeat
        b.i=[]=>1
        k:=reduce(+,b.i)
        d:=abs(v-k)
        d<m=>(m:=d;r:=copy b.i)
        m=0=>break
    [[m],r]

--Lista random di n elmenti, casuali compresi tra "a" e "b"
randList(n:PI,a:INT,b:INT):List INT==
    r:List INT:=[]
    a>b =>r
    d:=1+b-a
    for i in 1..n repeat
          r:=concat(r,a+random(d)$INT)
    r

(5) -> a:=randList(12,1,10000)
   (5)  [8723,1014,2085,5498,2855,1121,9834,326,7416,6025,4852,7905]
                                                       Type: List Integer
(6) -> m(a)
   (6)  [[1],[1014,2085,5498,1121,326,6025,4852,7905]]
                                                  Type: List List Integer
(7) -> x:=reduce(+,m(a).2);[x,reduce(+,a)-x]
   (7)  [28826,28828]
                                               Type: List PositiveInteger
(8) -> m([1,2,3,4])
   (8)  [[0],[2,3]]
                                                  Type: List List Integer
(9) -> m([10,1,2,3,4])
   (9)  [[0],[10]]
                                                  Type: List List Integer
(10) -> m([40,20,80,50,100,33,2])
   (10)  [[0],[40,20,100,2]]
                                                  Type: List List Integer
(11) -> m([7,7,7,10,11])
   (11)  [[0],[10,11]]
                                                  Type: List List Integer
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.