แรงดึงดูดระหว่างตัวเลข


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นั้นคือ ฯลฯ โดยทั่วไปแล้วตัวเลขจะถูกย้ายไปยังหมายเลขที่อยู่ติดกันมากที่สุด หากตัวเลขที่อยู่ติดกันทั้งสองเท่ากันจะไม่ถูกดึงดูด นอกจากนี้ยังเกิดขึ้นเมื่อตัวเลขและจำนวนที่อยู่ติดกันเท่ากัน

นี่เป็นเพียงเพื่อแสดงความดึงดูดใจ แต่จะเกิดอะไรขึ้นหลังจากนั้น ตัวเลขที่ชนกันเนื่องจากแรงดึงดูดนั้นถูกสรุป:

[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
แนะนำให้เพิ่มกรณีทดสอบที่ยุบลงในจำนวนเต็มเดียว
Shaggy

2
[1 3 5 4 2]= 15
Magic Octopus Urn

@MagicOctopusUrn ใช่
Luis felipe De jesus Munoz

14
1 มีขนาดไม่ใหญ่พอที่จะดึงดูดหมายเลข 6 ถ้อยคำนี้รบกวนจิตใจฉัน (เช่นกันทำกฎอื่น ๆ บ้าง แต่กฎนี้อาจแก้ไขได้โดยการเปลี่ยนข้อความโดยไม่เปลี่ยนคำจำกัดความปัญหา) แรงดึงดูดระหว่างสองร่างG*M*m / r^2นั้นเท่ากันสำหรับทั้งสองร่าง คนที่เบากว่าเคลื่อนไหวมากกว่าคนที่หนักกว่าเพราะแรงผลักดันไม่ใช่เพราะขาดแรงดึงดูด อาจพูดว่า "1 ไม่ใหญ่พอที่จะย้าย 6"
Peter Cordes

4
แต่จริงๆแล้วคุณกำลังกำหนด "ดึงดูด" เป็น "ดึงไปสู่" มากกว่า "สร้างแรง" ซึ่งขัดแย้งกับประโยคก่อนหน้า " แต่ละคนสร้างแรงดึงดูดให้มันเป็นตัวเลขที่อยู่ติดกัน " ดังนั้นบางทีการทำใหม่ที่เปิดออกมาเพื่อพูดว่า "แต่ละคนสร้างแรงระหว่างตัวเองกับตัวเลขที่อยู่ติดกันภายใต้เงื่อนไขบางอย่างสิ่งนี้จะทำให้มีการดึงดูดอีกหมายเลขหนึ่ง (ย้าย) ไปทางตัวเลข" ฉันรู้ว่านี่เป็นเพียงคำศัพท์ nitpick และความโน้มถ่วงรุ่นนี้มีความคล้ายคลึงกับฟิสิกส์จริง แต่ก็รบกวนฉันพอที่จะเขียนความคิดเห็นนี้
Peter Cordes

คำตอบ:


15

JavaScript (ES6),  106 104  100 ไบต์

บันทึก 2 ไบต์ขอบคุณ @Shaggy

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

aiai+1

456[0,9,6][0,0,15]

aiakk<iai1

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]
Erik the Outgolfer

@EriktheOutgolfer ฉันได้ทำการปรับปรุงส่วนที่ฉันคิดว่ามันทำให้เข้าใจผิด มันดีกว่าไหม
Arnauld

2
ตอนนี้มันพูดถึง "ตัวดึงดูดแรก" แทน "ค่าก่อนหน้าสูงสุด" ดังนั้นฉันสามารถเข้าใจสิ่งที่คุณหมายถึง
Erik the Outgolfer

9

Stax , 27 25 23 18 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง

เอาต์พุตถูกคั่นด้วยบรรทัดใหม่

โปรแกรมนี้ทำงานกับคู่ที่อยู่ติดกันในอาร์เรย์และพิจารณาว่าควรมีการแยกระหว่างพวกเขาโดยใช้ขั้นตอนนี้

[... w x y z ...]พิจารณาบางป้อนข้อมูลโดยพลการ นี่คือวิธีการตรวจสอบว่าควรจะมีการแยกระหว่างและxy

  • ถ้าx == yใช่
  • หากx > yแล้ว z >= xIFF
  • หากy > xแล้ว w >= yIFF

ข้อสรุปที่เหลือเป็นแบบฝึกหัด


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⁸§

ลองออนไลน์!

ลิงก์ monadic ที่รับรายการจำนวนเต็มเป็นอาร์กิวเมนต์และส่งคืนรายการจำนวนเต็ม

คำอธิบาย

Ø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

แรงบันดาลใจบางอย่างที่นำมาจากของ @ recursive คำตอบที่แตกซ์


4

C (gcc) , 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

R , 222 196 173 ไบต์

นี่เป็นวิธีแก้ปัญหาด้วยความช่วยเหลือจากRobin Ryder

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
-4 ไบต์ด้วยsign(e)แทน(e>0)-(e<0)
Robin Ryder

1
นอกจากนี้ยังมี{}in สำหรับ for ไม่จำเป็นเนื่องจากมีเพียงคำสั่งเดียวใน loop
Robin Ryder

1
189 ไบต์กับข้างต้น 2 ความเห็น + yย้ายนิยามของ
Robin Ryder

1
179 ไบต์ใช้ความจริงที่mเป็นบูลีน
Robin Ryder

3

Python, 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] และ [i + 1] สามารถกำหนดได้โดยดูที่ช่วงขององค์ประกอบสี่องค์ประกอบ [i-] 1: i + 3]

แก้ไข: ขอบคุณ Jo King สำหรับการชี้แจงกฎ



2

K (ngn / k) , 46 ไบต์

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

ลองออนไลน์!

0,x,0 ล้อมรอบอาร์กิวเมนต์ด้วย 0s

3' รายการติดต่อกันสามรายการ

{ }' สำหรับแต่ละคนทำ

x 2 0รับที่ผ่านมาและครั้งแรกของแฝดปัจจุบัน - และx[2] x[0]พวกเขาเป็นเพื่อนบ้านของx[1]ซึ่ง triplet เป็นศูนย์กลาง

x<\: เปรียบเทียบโดยใช้น้อยกว่ากับแต่ละ triplet ปัจจุบัน

+/รวม ผลลัพธ์ที่ได้คือคู่ที่สอดคล้องกับx[2]และx[0]

2=ตรวจสอบว่าเพื่อนบ้านอย่างใดอย่างหนึ่งมากกว่า 2 องค์ประกอบอื่น ๆxหรือไม่ส่งคืน booleans 0 หรือ 1

-/ลบออก ผลลัพธ์ของ -1 หมายถึงx[1]ถูกดึงดูดไปทางซ้าย 1 ไปทางขวาและ 0 หมายถึงมันอยู่ในสถานที่

(!#x)+ เพิ่ม 0 เข้ากับรายการแรก 1 ถึงวินาทีและอื่น ๆ ซึ่งจะคำนวณดัชนีไปยังรายการที่ดึงดูด

{x x}/ดัชนีกับตัวเองจนกระทั่งการบรรจบกัน ผลลัพธ์คือดัชนีที่มีประสิทธิภาพซึ่งแต่ละรายการจะถูกดึงดูดในที่สุด

x@.=กลุ่มx(อาร์กิวเมนต์ดั้งเดิม) โดยสิ่งเหล่านั้น ผลลัพธ์คือรายการของรายการ

+/' รวมกัน


2

Clojure , 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.