সংখ্যাগুলির মধ্যে মহাকর্ষ বল


52

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

এই সংখ্যার সেটটি কল্পনা করুন

[1 6 9 4 6 9 7 6 4 4 9 8 7]

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

[1 → 6 → 9 ← 4 6 → 9 ← 7 ← 6 ← 4 4 → 9 ← 8 ← 7]

সংখ্যাটি 1সরানোর পক্ষে যথেষ্ট বড় নয় 6, তবে সংখ্যাটি 6হ'ল ইত্যাদি ... মূলত, সংখ্যাগুলি সর্বাধিক সংলগ্ন সংখ্যায় স্থানান্তরিত হয় (সংখ্যার চেয়েও বড়)। সংলগ্ন উভয় সংখ্যা সমান হলে এটি আকর্ষণ করা হয় না তখন is সংখ্যা এবং এটি সংলগ্ন সমান হলে এটিও ঘটে।

এটি কেবল আকর্ষণ দেখানোর জন্য, তবে এর পরে কী ঘটে? আকর্ষণগুলির কারণে সংঘর্ষের সংখ্যাগুলি সংক্ষেপে বলা হয়:

[20 32 28]

সুতরাং মূলত চ্যালেঞ্জটি হ'ল, সংখ্যার একটি সেট দেওয়া, সংখ্যাগুলির আকর্ষণীয় সংখ্যার ফলাফল আউটপুট।


উদাহরণ 1

Input  => [10 15 20 10 20 10 10]
          [10 → 15 → 20 10 20 ← 10 10]
Output => [45 10 30 10]

উদাহরণ 2

Input  => [9 9 9 9 8 1 8]
          [9 9 9 9 ← 8 1 8]
Output => [9 9 9 17 1 8]

উদাহরণ 3

Input  => [1 6 9 4 6 9 7 6 4 4 9 8 7]
          [1 → 6 → 9 ← 4 6 → 9 ← 7 ← 6 ← 4 4 → 9 ← 8 ← 7]
Output => [20 32 28]

উদাহরণ 4

Input  => [1 2 3 2 1]
          [1 → 2 → 3 ← 2 ← 1]
Output => [9]

উদাহরণ 5

Input  => [1]
Output => [1]

উদাহরণ 6

Input  => [1 1]
Output => [1 1]

উদাহরণ 7

Input  => [2 1 4]
Output => [2 5]

নোট

  • আকর্ষণ কেবল একবারই ঘটে
  • নম্বরগুলি সংলগ্ন সংখ্যাগুলিতে আকৃষ্ট হয় না
  • সংখ্যার সেটটিতে কেবল ইতিবাচক পূর্ণসংখ্যা থাকবে

1
একটি টেস্ট কেস যুক্ত করার পরামর্শ দিন যা একটি একক পূর্ণসংখ্যার সাথে ধসে পড়ে।
শেগি


@ ম্যাজিক অ্যাক্টোপাস ইউরান হ্যাঁ
লুইস

14
6 সংখ্যাটি আকৃষ্ট করতে 1 টি যথেষ্ট বড় নয় ing এই শব্দটি আমার মধ্যে পদার্থবিদকে বিরক্ত করে। (ভাল তাই অন্যান্য নিয়ম কিছু করুন, কিন্তু সমস্যা সংজ্ঞা পরিবর্তন না করে শব্দ পরিবর্তন করে এটি সম্ভবত সমাধানযোগ্য)। দুটি দেহের মধ্যে আকর্ষণ শক্তি G*M*m / r^2, উভয় দেহের জন্য সমান। হালকাটি ভারীটির চেয়ে বেশি গতিবেগের কারণে গতিবেগের কারণে চালিত হয়, আকর্ষণীয়তার অভাবে নয়। হতে পারে "1 টি 6 সরানোর পক্ষে যথেষ্ট বড় নয়" say
পিটার কর্ডেস

4
তবে সত্যই আপনি "আকর্ষণের" সংজ্ঞা দিচ্ছেন "টানতে" হিসাবে, বরং "একটি শক্তি তৈরি করে", যা পূর্ববর্তী বাক্যটির সাথে দ্বন্দ্ব করে " তাদের প্রত্যেকে তার সংলগ্ন সংখ্যার প্রতি আকর্ষণ শক্তি তৈরি করে "। সুতরাং সম্ভবত এই পুনরায় কাজটি করে "এই প্রত্যেকে নিজের মধ্যে একটি শক্তি তৈরি করে এবং এটি সংলগ্ন সংখ্যার। এটি কিছু শর্তে, অন্য সংখ্যার প্রতি সংখ্যার দিকে আকৃষ্ট (স্থানান্তরিত) হওয়ার কারণ হতে পারে" বলে এই রচনাটি আবার শুরু করুন। আমি জানি এটি কেবল একটি পরিভাষা নীটপিক এবং মহাকর্ষের এই মডেলটি কেবল অস্পষ্টভাবে বাস্তব পদার্থবিজ্ঞানের সাথে সমান, তবে এটি এই মন্তব্যটি লেখার জন্য আমাকে যথেষ্ট বিরক্ত করেছিল।
পিটার কর্ডেস

উত্তর:


15

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

@ শেগি কে 2 বাইট সংরক্ষণ করা হয়েছে

a=>a.filter(n=>n,[...a].map((v,i)=>a[a[p>v&(n=~~a[i+1])<p?k:i+(k=i,n>v&p<n)]+=x=a[i],p=v,i]-=x,p=0))

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

মন্তব্য

আমরা প্রথমে এর a[]অনুলিপি দ্বারা মূল ইনপুট অ্যারে আপডেট করি। এই পদক্ষেপের সময়, অন্যান্য মান দ্বারা 'আকৃষ্ট' সমস্ত মান সেট করা হয় ।0

অ্যারেটি বাম থেকে ডানে পার্স করা হয়েছে, তাই যখনই কোনও মান তার ডান প্রতিবেশী দ্বারা আকৃষ্ট হয় তখন আমরা a to এ যুক্ত করতে পারি ।একটিআমিএকটিআমি+ +1

উদাহরণ: এবং তারপরে রূপান্তরিত হবে ।456[0,9,6][0,0,15]

কিন্তু যখন সারিতে অনেকগুলো মান তাদের বাম প্রতিবেশী দ্বারা আকৃষ্ট হয়, আমরা যোগ করতে হবে প্রথম অ্যাট্রাক্টর করার এই ক্রম (সঙ্গে বদলে কেবল) ।একটিআমিএকটি<আমিএকটিআমি-1

উদাহরণ: এবং তারপরে রূপান্তরিত হয় ।654[11,0,4][15,0,0]

[...a]                 // create a copy of a[]
.map((v, i) =>         // for each value v in a[] at position i:
  a[                   //   this statement updates a[i]:
    a[                 //     this statement updates either a[i] or an adjacent value:
      p > v &          //       if the previous value p is greater than v
      (n = ~~a[i + 1]) //       and the next value n
      < p ?            //       is less than p (attraction to the left):
        k              //         use k (k is initially undefined, but this code cannot
                       //         be triggered during the first iteration)
      :                //       else:
        i + (          //         use either i or i + 1:
          k = i,       //           set k to i
          n > v &      //           use i + 1 if n is greater than v
          p < n        //           and p is less than n (attraction to the right)
        )              //
    ] += x = a[i],     //     add x = a[i] to the entry defined above
    p = v,             //     update the previous value to v
    i                  //     actual index to update a[i]
  ] -= x,              //   subtract x from a[i]
  p = 0                //   start with p = 0
)                      // end of map()

তারপরে আমরা সমান সমস্ত এন্ট্রি ফিল্টার করে থাকি ।0

a.filter(n => n)

আপনার ব্যাখ্যা থেকে, দেখে মনে হচ্ছে আপনার কোডটি ব্যর্থ হবে [1,3,5,3,1,2,1]এবং আউটপুট [14,2], তবে এটি আসলে সঠিকভাবে কাজ করে এবং আউটপুটগুলি [13,3]
এরিক আউটগল্ফার

@ এরিকথ আউটগলফার আমি সেই অংশটি পুনরায় প্রকাশ করেছি - যা আমি মনে করি - বিভ্রান্তিকর ছিল। এটা কি ভালো?
আর্নল্ড

2
এখন এটি "সর্বাধিক পূর্ববর্তী মান" এর পরিবর্তে "প্রথম আকর্ষণকারী" উল্লেখ করে, তাই আপনি কী বোঝাতে চেয়েছিলেন তা বুঝতে পারি।
এরিক আউটগল্ফার

9

স্ট্যাক্স , 27 25 23 18 বাইট

«╥╦.ê§┘h!@ÆEÿ☺╜╫♥B

এটি চালান এবং এটি ডিবাগ করুন

আউটপুট নিউলাইনগুলি দ্বারা পৃথক করা হয়।

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

কিছু ইচ্ছামত ইনপুট বিবেচনা করুন [... w x y z ...]। এখানে কীভাবে নির্ধারণ করতে হবে যে সেখানে xএবং এর মধ্যে বিভক্ত হওয়া উচিত y

  • যদি x == y, তবে হ্যাঁ।
  • যদি x > y, তাহলে iff z >= x
  • যদি y > x, তাহলে iff w >= y

যোগফলটি অনুশীলন হিসাবে রেখে গেছে।


8

রেটিনা 0.8.2 , 64 বাইট

\d+
$*
(?<=(1+)) ((?=(1+\1))(?<!\3 \1 )|(?!\1)(?!1+ \1))

1+
$.&

এটি অনলাইন চেষ্টা করুন! লিঙ্কে পরীক্ষার স্যুট অন্তর্ভুক্ত। ব্যাখ্যা:

\d+
$*

অ্যানারিতে রূপান্তর করুন।

(?<=(1+)) ((?=(1+\1))(?<!\3 \1 )|(?!\1)(?!1+ \1))

আকর্ষণীয় সংখ্যার মধ্যে বিভাজকগুলি সরান। বিভাজকের আগে সংখ্যায় (?<=(1+))সেট \1করে। বিভাজনের পরে, তারপরে দুটি মামলা রয়েছে:

  • বিভাজকের পরে সংখ্যার চেয়ে উভয়ই বিভাজকের পরে সংখ্যা বেশি
  • বিভাজকের আগের সংখ্যার বিভাজকের পরে উভয় সংখ্যার চেয়ে বেশি

এই ক্ষেত্রে দুটি সংখ্যার মধ্যে একটি আকর্ষণ রয়েছে এবং বিভাজকটি মোছার ফলে সংখ্যার সংঘর্ষ ঘটে এবং তাদের সংযুক্ত করে।

1+
$.&

দশমিক রূপান্তর।


6

জেলি , 23 বাইট

Ø0jMÆmær0Ʋ3Ƥ×=4$o<ʋƝk⁸§

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

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

ব্যাখ্যা

Ø0j                     | Join [0, 0] with input list
         Ʋ3Ƥ            | For each length 3 infix, do the following as a monad:
   M                    | - Indices of maximum
    Æm                  | - Mean
      ær0               | - Round to even (so the means of [1, 2, 3], [1, 2], [2, 3] and [1, 3] will all round to 2
                  ʋƝ    | For each neighbouring pair, do the following as a dyad:
            ×           | - Multiply
             =4$        | - Check if equal to 4
                o       | - Or
                 <      | - First number less than second
                    k⁸  | Split input after truthy values of the above
                      § | Sum, vectorised

@ পুনরাবৃত্তির স্ট্যাক্স উত্তর থেকে নেওয়া কিছু অনুপ্রেরণা ।


4

সি (জিসিসি) , 111 বাইট

a,b,c,s;P(){s=!printf("%d ",s);}f(int*v){for(b=s=0,c=*v;a=b,b=c;a<b|b<a&c<a||P(),s+=b,b<c&c<=a|!c&&P())c=*++v;}

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

পূর্ণসংখ্যার শূন্য-সমাপ্ত অ্যারে নেয়।

ব্যাখ্যা

a,b,c,  // Three consecutive elements of input array
s;      // Accumulator for sum
P(){s=!printf("%d ",s);}  // Print and clear s
f(int*v){
    for(
        // Init
        b=s=0,
        c=*v;
        // Loop test
        a=b,  // Shift b into a
        b=c;  // Shift c into b, exit if zero
        // Post loop
        a<b|b<a&c<a||P(),  // Print if a==b || (b<a && a<=c)
        s+=b,  // Accumulate
        b<c&c<=a|!c&&P()   // Print if c==0 || (b<c && c<=a)
    )
        // Loop body
        c=*++v;  // Read next number into c
}



3

আর , 222 196 173 বাইট

রবিন রাইডারের কিছু সহায়তার সাথে একটি সমাধান এখানে দেওয়া হল

n=length(d<-diff(y<-x<-scan()));l=c(1,sign(d[-n]+d[-1]),-1);m=!!l*n&c(d[1]>0,d[-1]>0|d[-n]<0,d[n]<0);for(t in 1:n){for(i in which(m))y[a]=y[a<-i+l[i]]+x[i];y=x=y-x*m};x[!m]

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

একটি সংক্ষিপ্ত মন্তব্য

n=length(d<-diff(y<-x<-scan()));  #read input and compute pairwise differences
                    #d[-n]+d[-1]: compare left and right differences
l=c(1,sign(d[-n]+d[-1]),-1)                 #direction of attraction
m=!!l*n&                          #indices of attracted numbers
  c(d[1]>0,d[-1]>0|d[-n]<0,d[n]<0)  
                                   #!!l*n eliminates zeroes in l & the case n==0
for(t in 1:n){                   #excessive loop on transfers
 for(i in which(m))
   y[a]=y[a<-i+l[i]]+x[i]         #transfer right vs. left
 y=x=y-m*x}                        #complete transfer
x[!m]                             #output

1
এর sign(e)পরিবর্তে -4 বাইট(e>0)-(e<0)
রবিন রাইডার

1
এছাড়াও {}লুপ জন্য অপ্রয়োজনীয় যেহেতু সেখানে লুপ শুধুমাত্র একটি নির্দেশ হয়।
রবিন রাইডার

1
189 বাইট উপরের 2 মন্তব্য + সংজ্ঞা সরিয়ে নিয়েছে y
রবিন রাইডার

1
179 বাইট যে ব্যবহার mএকটি বুলিয়ান
রবিন রাইডার

3

পাইথন, 114 112 বাইট

lambda a:eval('['+'+'.join(str(c)+',0'*((e<c>d)==(c<d>b))for b,c,d,e in zip([0]+a,a,a[1:]+[0],a[2:]+[0,0]))+']')

এটি এই সত্যটি ব্যবহার করে যে তীরের দিকটি আসলে তাত্পর্যপূর্ণ নয় এবং একটি [i] এবং a [i + 1] এর মধ্যে একটি তীরের উপস্থিতি চারটি উপাদানগুলির একটি [i-- 1: আমি 3 +]।

সম্পাদনা করুন: বিধি স্পষ্টতার জন্য জো কিংকে ধন্যবাদ



2

কে (এনএনজি / কে) , 46 বাইট

{+/'x@.={x x}/(!#x)+{-/2=+/x<\:x 2 0}'3'0,x,0}

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

0,x,0 0 এর সাথে যুক্তিকে ঘিরে ফেলুন

3' একটানা আইটেমের ট্রিপল্ট

{ }' প্রতিটি কাজের জন্য

x 2 0বর্তমান ট্রিপলিটের সর্বশেষ এবং প্রথমটি পান - x[2]এবং x[0]। তারা x[1]হ'ল প্রতিবেশী , যার উপরে ট্রিপলটি কেন্দ্রিক

x<\: বর্তমান ট্রিপলটির প্রত্যেকের তুলনায় কম ব্যবহার করে তুলনা করুন

+/সমষ্টি। ফলাফলের একজোড়া সংশ্লিষ্ট হয় x[2]এবংx[0]

2=প্রতিবেশী অন্য 2 টি উপাদানের চেয়ে বড় কিনা তা পরীক্ষা করে দেখুন x, 0-বা -1 বুলিয়ানগুলির একটি জোড়া ফেরত দিন

-/তাদের বিয়োগ। -1 এর ফলাফল x[1]বাম দিকে আকৃষ্ট হয়, 1 টি ডান দিকে এবং 0 এর অর্থ এটি স্থানে থাকে

(!#x)+ প্রথম আইটেমের সাথে 0 যুক্ত করুন, 1-এ দ্বিতীয় যোগ করুন this

{x x}/অভিমুখে না হওয়া পর্যন্ত নিজের সাথে সূচক। ফলাফল হ'ল কার্যকর সূচকগুলি যা প্রতিটি আইটেমটি শেষ পর্যন্ত আকৃষ্ট হয়

x@.=xতাদের দ্বারা গোষ্ঠী (মূল যুক্তি)। ফলাফল তালিকার একটি তালিকা

+/' প্রতিটি যোগফল


2

ক্লোজার , 299 252 বাইট

(fn[l](loop[o[0]m(vec(map-indexed(fn[i v](def f #(max(nth l(+ % i)0)v))(-(f -1)(f 1)))l))i 0](defn f[x](update o(-(count o)x)#(+(l i)%)))(cond(<=(count m)i)(pop o)(>(m i)0)(recur(f 2)m(inc i))(<(m i)0)(recur(f 1)m(inc i))1(recur(conj(f 1)0)m(inc i)))))

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


ব্যাখ্যা:

(fn [l]
  (loop [o [0]
         m (vec(map-indexed (fn [i v] ; This maps each element l[i] of l to max(l[i-1], l[i]) - max(l[i+1], l[i])
                              (def f #(max (nth l (+ % i) 0) v))
                              (- (f -1) (f 1)))
                            l))       ; l[x] is zero when l[x] is out of bounds of the input vector l
         i 0]
    (defn f [x] (update o (- (count o) x) #(+ (l i) %)))
    ; Defines a function f(x) that returns the result of mapping the (x-1)th to last element of o over the function g(y) = l[i] + y

    (cond
      (<= (count m) i) (pop o) ; If the length of m is less than or equal to i, there are no more elements in m, so return all but the last element of o
      (> (m i) 0) (recur (f 2) m (inc i)) ; If m[i] is positive, l[i] is pulled toward to the previous element, so add l[i] to the 2nd to last element of o
      (< (m i) 0) (recur (f 1) m (inc i)) ; If m[i] is negative, l[i] is pulled toward the next element, so add l[i] to the last element of o
      1 (recur (conj (f 1) 0) m (inc i))))) ; 1 is truthy
      ; If the length of l is less than or equal to i, and m[i] is not positive or negative, we have m[i] = 0, so l[i] is not pulled toward any other element


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