স্থানাঙ্ক এবং তাদের জনগণের একটি তালিকা থেকে ভর কেন্দ্র Center


20

সোমবার সকালে একটি চ্যালেঞ্জ এখানে ...

সর্বনিম্ন সংখ্যা বাইটে একটি ফাংশন বা প্রোগ্রাম লিখুন যা:

  • [x,y]স্থানাঙ্কের একটি তালিকা ইনপুট হিসাবে নেয়
  • [x,y]সমন্বয়কারীদের সংশ্লিষ্ট জনগণের একটি তালিকা ইনপুট হিসাবে নেয় T
  • আকারে গণনার গণনা কেন্দ্রকে আউটপুট করে [xBar,yBar]

বিঃদ্রঃ:

  • ইনপুট যেকোন আকারে নেওয়া যেতে পারে, যতক্ষণ না কোনও অ্যারে ব্যবহার করা হয়।

ভর কেন্দ্রটি নিম্নলিখিত সূত্র দ্বারা গণনা করা যেতে পারে: ভর গণনা কেন্দ্র

সরল ইংরাজীতে ...

  • জন্য xBar, সংখ্যাবৃদ্ধি দ্বারা তার নিজ নিজ এক্স প্রতিটি ভর তুল্য, ফলে তালিকা যোগফল, এবং সমস্ত জনসাধারণ এর সমষ্টি এটি দ্বারা বিভক্ত।
  • জন্য yBar, গুন করা তার নিজ নিজ Y দ্বারা প্রতিটি ভর তুল্য, ফলে তালিকা যোগফল, এবং সমস্ত জনসাধারণ এর সমষ্টি এটি দ্বারা বিভক্ত।

তুচ্ছ পাইথন ২.7 উদাহরণ:

def center(coord, mass):
    sumMass = float(reduce(lambda a, b: a+b, mass))
    momentX = reduce(lambda m, x: m+x, (a*b for a, b in zip(mass, zip(*coord)[0])))
    momentY = reduce(lambda m, y: m+y, (a*b for a, b in zip(mass, zip(*coord)[1])))
    xBar = momentX / sumMass
    yBar = momentY / sumMass
    return [xBar, yBar]

পরীক্ষার কেস:

> center([[0, 2], [3, 4], [0, 1], [1, 1]], [2, 6, 2, 10])
[1.4, 2.0]

> center([[3, 1], [0, 0], [1, 4]], [2, 4, 1])
[1.0, 0.8571428571428571]

এটি কোড-গল্ফ, তাই বাইটসের ন্যূনতম সংখ্যাটি জয়!


যেহেতু এটি কেবল "ভেক্টরগুলির একটি ওজনযুক্ত গড় গণনা করা" তাই আমরা যদি আগে এটি না করে থাকি তবে আমি যথেষ্ট অবাক হব। (এই মুহুর্তে, যদিও আমি কিছুই খুঁজে পাচ্ছি না))
মার্টিন এন্ডার

@ মার্টিনবাটনার আমিও দেখতে পেলাম, আর কিছুও পেলাম না। এটি যদি কোনও দ্বৈত হয় তবে এটিকে বন্ধ করে দিতে দ্বিধা বোধ করবেন।
মিঃ পাবলিক

অন্য ক্রমে ইনপুট নেওয়া যেতে পারে? অথবা আকারে: [x,y,m],[x,y,m]...?
FryAmTheEggman

বৈধ ইনপুটগুলির জন্য @ ফ্রাইআমTheEggman প্রশ্ন সম্পাদিত।
মিঃ পাবলিক

@ এমপ্রিপাবলিক: কী [(x1,y1,m1), (x2,y2,m2)], যেমন : তালিকার তালিকা? বা তর্কগুলি টিপলস, তালিকা বা অ্যারে কিনা তা বিবেচনা করে না? তিনটি তালিকা / অ্যারে সম্পর্কে কি?
জিটা 14

উত্তর:


21

এমএটিএল , 6 5 বাইট

ys/Y*

ইনপুট ফর্ম্যাটটি জনসাধারণের সাথে একটি সারি ভেক্টর, তারপরে স্থানাঙ্কগুলি সহ একটি দুটি কলামের ম্যাট্রিক্স (যেখানে স্পেস বা কমাগুলি areচ্ছিক)।

  • প্রথম উদাহরণ:

    [2, 6, 2, 10]
    [0,2; 3,4; 0,1; 1,1]
    
  • দ্বিতীয় উদাহরণ:

    [2, 4, 1]
    [3,1; 0,0; 1,4]
    

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

ব্যাখ্যা

mজনগণের ভেক্টর (প্রথম ইনপুট) এবং cস্থানাঙ্কের ম্যাট্রিক্স (দ্বিতীয় ইনপুট) বোঝাতে দিন ।

y     % implicitly take two inputs. Duplicate the first.
      % (Stack contains, bottom to top: m, c, m)
s     % sum of m.
      % (Stack: m, c, sum-of-m)
/     % divide.
      % (Stack: m, c-divided-by-sum-of-m)
Y*    % matrix multiplication.
      % (Stack: final result)
      % implicitly display

yবেশ দরকারী !! +1
ডেভিড

@ ডেভিড হ্যা! অন্তর্নিহিত ইনপুটটির সাথে মিলিত, এটি এই ক্ষেত্রে অনেক কিছু করে :-)
লুইস মেন্ডো

7

ম্যাথমেটিকা, 10 বাইট

#.#2/Tr@#&

উদাহরণ:

In[1]:= #.#2/Tr@#&[{2,6,2,10},{{0,2},{3,4},{0,1},{1,1}}]

Out[1]= {7/5, 2}

1
আমি কখনই ব্যবহার করিনি Dot। তবে আমি উপরে আপনার ব্যবহার দেখার পরে করব!
ডেভিডসি

7

ম্যাথক্যাড, 19 "বাইট"

এখানে চিত্র বর্ণনা লিখুন

  • ডেটা ইনপুট জন্য ম্যাথক্যাডের টেবিলগুলি ব্যবহার করে
  • অক্ষকে অর্ডিনেট এবং ভর দেওয়ার জন্য ম্যাথক্যাডের অন্তর্নির্মিত ভেক্টর স্কেলার পণ্য ব্যবহার করে
  • মোট গণের জন্য ম্যাথক্যাডের অন্তর্নির্মিত সমষ্টি অপারেটর ব্যবহার করে

যেমন ম্যাথক্যাডে একটি 2 ডি "হোয়াইটবোর্ড" এবং বিশেষ অপারেটর (যেমন, সামিহান অপারেটর, ইন্টিগ্রাল অপারেটর) ব্যবহার করে এবং এক্সএমএল ফর্ম্যাটে সংরক্ষণ করে, প্রকৃত ওয়ার্কশিটে বেশ কয়েকটি শতাধিক (বা আরও) অক্ষর থাকতে পারে। কোড গল্ফের উদ্দেশ্যে, আমি ওয়ার্কশিটটি তৈরি করতে ব্যবহারকারীর প্রবেশাধিকারের সংখ্যা বা অপারেটরের সংখ্যা হতে একটি ম্যাথক্যাড "বাইট কাউন্ট" নিয়েছি।

চ্যালেঞ্জটির প্রথম (প্রোগ্রাম) সংস্করণটি এই সংজ্ঞাটি ব্যবহার করে 19 "বাইট" নেয় এবং ফাংশন সংস্করণটি 41 "বাইটস" নেয়।


3
আমি এখানে প্রথম কোনও ম্যাটকেড সমাধান দেখেছি। খুব সুন্দর. +1 টি।
রায়রং -

আপনাকে ধন্যবাদ, রেরিং। এটি সম্ভবত কারণ ম্যাথক্যাডের কেবলমাত্র মৌলিক স্ট্রিং ফাংশন রয়েছে এবং এতে মানব-পঠনযোগ্য, কেবলমাত্র পাঠ্য-সোর্স কোড নেই বলে প্রদত্ত যে "কোর্স" এর "গর্ত" কিছু করা কিছুটা চ্যালেঞ্জের কারণ।
স্টুয়ার্ট ব্রুফ

6

ম্যাটল্যাব / অষ্টাভ, 18 16 বাইট

2 বাইট অপসারণ করার জন্য ব্যবহারকারী বেকার এবং ডন মুয়েসিলিকে ধন্যবাদ!

স্থিতিগুলি এমন একটি N x 2ম্যাট্রিক্সে রয়েছে xযেখানে প্রথম কলামটি এক্স স্থানাঙ্কী এবং দ্বিতীয় কলামটি ওয়াই স্থানাংক এবং জনসাধারণ একটি 1 x Nম্যাট্রিক্সে y(বা একটি সারি ভেক্টর) রয়েছেন :

@(x,y)y*x/sum(y)

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

উদাহরণ রান

>> A=@(x,y)y*x/sum(y)

A = 

    @(x,y)y*x/sum(y)

>> x = [0 2; 3 4; 0 1; 1 1];
>> y = [2 6 2 10];
>> A(x,y)

ans =

    1.4000    2.0000

>> x = [3 1; 0 0; 1 4];
>> y = [2 4 1];
>> A(x,y)

ans =

    1.0000    0.8571

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

https://ideone.com/BzbQ3e


1
আপনি মুছে ফেলতে পারেন ;, এবং 'সঠিকভাবে ইনপুট ফর্ম্যাটটি ( xসারি ভেক্টর হিসাবে) চয়ন করে
লুইস মেন্ডো

@ ডোনমুসলি ধন্যবাদ :) বাইট সংখ্যা 2 দ্বারা হ্রাস
পেয়েছে -

6

জেলি, 6 বাইট

S÷@×"S

অথবা

÷S$×"S

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

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

ব্যাখ্যা

S       Sum the masses.
   x"   Multiply each vector by the corresponding mass.
 ÷@     Divide the results by the sum of masses.
     S  Sum the vectors.

অথবা

÷S$     Divide the masses by their sum.
   ×"   Multiply each vector by the corresponding normalised mass.
     S  Sum the vectors.

6

জুলিয়া, 25 17 বাইট

f(c,m)=m*c/sum(m)

স্পষ্ট পদ্ধতির হাতছাড়া: / কল করুন f([3 1;0 0;1 4], [2 4 1])


5

সিজেম, 14 বাইট

{_:+df/.f*:.+}

সমন্বিত জোড়গুলির তালিকা এবং স্ট্যাকের জনগণের তালিকাটি (সেই ক্রমে) প্রত্যাশা করে এবং তার স্থানে ভর কেন্দ্রকে ছেড়ে যায় with

এটি এখানে পরীক্ষা করুন।

ব্যাখ্যা

_    e# Duplicate list of masses.
:+d  e# Get sum, convert to double.
f/   e# Divide each mass by the sum, normalising the list of masses.
.f*  e# Multiply each component of each vector by the corresponding weight.
:.+  e# Element-wise sum of all weighted vectors.


4

গুরুতরভাবে, 16 বাইট

╩2└Σ;╛2└*/@╜2└*/

হিসাবে ইনপুট নেয় [x-coords]\n[y-coords]\n[masses]এবং হিসাবে আউটপুটxbar\nybar

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

ব্যাখ্যা:

╩2└Σ;╛2└*/@╜2└*/
╩                 push each line of input into its own numbered register
 2└Σ;             push 2 copies of the sum of the masses
     ╛2└*/        push masses and y-coords, dot product, divide by sum of masses
          @       swap
           ╜2└*/  push masses and x-coords, dot product, divide by sum of masses

3

হাস্কেল, 55 50 বাইট

z=zipWith
f a=map(/sum a).foldr1(z(+)).z(map.(*))a

এটি fনিম্নলিখিত হিসাবে ব্যবহৃত একটি বাইনারি ফাংশন সংজ্ঞায়িত করে:

> f [1,2] [[1,2],[3,4]]
[2.3333333333333335,3.333333333333333]

এটি উভয় পরীক্ষার কেস পাস দেখুন।

ব্যাখ্যা

হাস্কেল বহুমাত্রিক তালিকাগুলি প্রক্রিয়াকরণের জন্য খুব উপযুক্ত নয়, তাই আমি এখানে কিছু হুপ দিয়ে ঝাঁপিয়ে পড়ছি। প্রথম লাইনটি একটি সংক্ষিপ্ত নাম ব্যবহার করে zipWith, যা আমাদের দুবার প্রয়োজন twice মূলত, fএমন একটি ফাংশন যা ওজনের তালিকা গ্রহণ করে aএবং উত্পাদন করে f a, এমন একটি ফাংশন যা অবস্থানের তালিকা গ্রহণ করে এবং ভর কেন্দ্রকে উত্পাদন করে। f aতিনটি ফাংশনের সমন্বয়:

z(map.(*))a      -- First sub-function:
z         a      --   Zip the list of positions with the mass list a
  map.(*)        --   using the function map.(*), which takes a mass m
                 --   and maps (*m) over the corresponding position vector
foldr1(z(+))     -- Second sub-function:
foldr1           --   Fold (reduce) the list of mass-times-position vectors
       z(+)      --   using element-wise addition
map(/sum a)      -- Third sub-function:
map              --   Map over both coordinates:
   (/sum a)      --     Divide by the sum of all masses

3

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

a=>a.map(([x,y,m])=>{s+=m;t+=x*m;u+=y*m},s=t=u=0)&&[t/s,u/s]

(X, y, ভর) "ট্রিপলস" এর একটি অ্যারে গ্রহণ করে এবং একটি "টিপল" দেয়।


চারপাশে [x,y,m]প্রয়োজনীয় বন্ধনীগুলি কি প্রয়োজনীয়? প্রথমত, তীর ফাংশনটিতে কেবল একটি ইনপুট যুক্তি থাকলে তাদের প্রয়োজন হয় না।
প্যাট্রিক রবার্টস

@ পেট্রিকরোবার্টস হ্যাঁ, ঠিক এক মানক যুক্তির মধ্যে একটি তুচ্ছ একটি বাদে সব ক্ষেত্রে এগুলি প্রয়োজনীয়।
নীল

3

আর, 32 25 বাইট

function(a,m)m%*%a/sum(m)

ম্যাট্রিক্স বীজগণিত পরিবর্তন করে -7 বাইট সম্পাদনা করুন (ধন্যবাদ @ Sp3000 জুলিয়া উত্তর)

স্থানাঙ্ক এবং mওজনের ভেক্টর হিসাবে একটি অ্যারে (2 কলাম, x, y) সহ মেট্রিক্স পাস করুন , প্রয়োজনীয় স্থানাঙ্কের সাথে একটি অ্যারে প্রদান করে


2

পিএইচপি, 142 বাইট

function p($q,$d){return$q*$d;}function c($f){$s=array_sum;$m=array_map;$e=$f[0];return[$s($m(p,$e,$f[1]))/$s($e),$s($m(p,$e,$f[2]))/$s($e)];}
বিস্তারিত দেখুন
function p($q, $d) {
  return $q * $d;
}

function c($f) {
  $s = array_sum;
  $m = array_map;
  $e = $f[0];
  return [ $s($m(p,$e,$f[1])) / $s($e),
           $s($m(p,$e,$f[2])) / $s($e) ];
}
প্রয়োজনীয় ইনপুট
Array[Array]: [ [ mass1, mass2, ... ],
                [ xpos1, xpos2, ... ],
                [ ypos1, ypos2, ... ] ]
প্রত্যাবর্তন

Array: [ xbar, ybar ]


p()ফাংশন একটি মৌলিক মানচিত্র প্রতিটি গুন করা হয়, [m]সংশ্লিষ্ট সঙ্গে মান [x]বা [y]মান। c()ফাংশন লাগে Array[Array], উপস্থাপন array_sumএবং array_mapস্পেসের জন্য ফাংশন, তারপর হিসাব করে Σmx/ΣmএবংΣmy/Σm

গণনাটি নিজেই স্থানের জন্য একটি ক্রিয়ায় রূপান্তর করা সম্ভব হতে পারে, তা দেখতে পাবে।


2

ম্যাথক্যাড, 8 "বাইট"

আমি জানি না আমার আগের উত্তরে আমি কী ভাবছিলাম না। ম্যাট্রিক্স গুণনের যথাযথ ব্যবহার করার জন্য এখানে একটি ছোট উপায়। ভেরিয়েবল পিতে ডেটা থাকে - যদি ভেরিয়েবলটিকে মোটের দিকে গণনা করা হয়, তবে আরও 2 "বাইটস" যুক্ত করুন (ইনপুট টেবিল = 1 বাইট, ভেরিয়েবলের নাম = 1 বাইট)।

এখানে চিত্র বর্ণনা লিখুন


1

পাইথন 3, 63 বাইট

lambda a,b:[sum(x*y/sum(b)for x,y in zip(L,b))for L in zip(*a)]

তালিকায় ভেক্টর ক্রিয়াকলাপ দীর্ঘ: /

এটি একটি বেনামে ল্যাম্বদা ফাংশন - এটির নাম দিন এবং কল করুন f([[0,2],[3,4],[0,1],[1,1]],[2,6,2,10])


1

পাইথন 3, 95 90 88 বাইট

সমাধান

lambda c,m:list(map(sum,zip(*[[i[0]*j/sum(m),i[1]*j/sum(m)]for i,j in zip(*([c,m]))])))

ফলাফল

>>> f([[0,2],[3,4],[0,1],[1,1]],[2,6,2,10])
[1.3999999999999999, 2.0]
>>> f([[3,1],[0,0],[1,4]],[2,4,1])
[1.0, 0.8571428571428571]

@ জগারব 2 বাইট সংরক্ষণ করার জন্য ধন্যবাদ


মজাদার জন্য একটি পুনরাবৃত্ত সমাধান (95 বাইট)

f=lambda c,m,x=0,y=0,s=0:f(c[1:],m[1:],x+c[0][0]*m[0],y+c[0][1]*m[0],s+m[0])if c else[x/s,y/s]

ফলাফল

>>> f([[0,2],[3,4],[0,1],[1,1]],[2,6,2,10])
[1.4, 2.0]
>>> f([[3,1],[0,0],[1,4]],[2,4,1])
[1.0, 0.8571428571428571]

2
আমি মনে করি *([c]+[m])এটি সংক্ষিপ্ত করা যেতে পারে *[c,m]
জাগারব

0

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

c(a:List List Float):List Float==(x:=y:=m:=0.;for i in 1..#a repeat(~index?(3,a.i)=>return[];x:=x+a.i.3*a.i.1;y:=y+a.i.3*a.i.2;m:=m+a.i.3);m=0.=>[];[x/m,y/m])

উচ্ছৃঙ্খল

-- Input List of Coordinate and masses as [[xi,yi,mi]]
-- Return center of mass for the list a as [x,y] Float coordinates
-- or [] if some error occur [for example masses are all 0]
cc(a:List List Float):List Float==
    x:=y:=m:=0.
    for i in 1..#a repeat
         ~index?(3,a.i)=>return []
         x:=x+a.i.3*a.i.1
         y:=y+a.i.3*a.i.2
         m:=m+a.i.3
    m=0.=>return []
    return[x/m,y/m]

ফলাফল

(21) -> c([[0,2,2],[3,4,6],[0,1,2],[1,1,10]])
   (21)  [1.4,2.0]
                                                         Type: List Float
(22) -> c([[3,1,2],[0,0,4],[1,4,1]])
   (22)  [1.0,0.8571428571 4285714286]
                                                         Type: List Float

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