กำลังคำนวณคลื่น


26

ฉันได้เลื่อนดูไซต์นี้มาระยะหนึ่งแล้ว แต่เพิ่งได้รับความสนใจจริง ๆ ลองใช้ความท้าทายบางอย่าง ฉันตั้งใจจะลองทำตามหัวข้อที่มีอยู่ในสนามกอล์ฟ แต่ฉันไม่สามารถใช้อินเทอร์เน็ตได้สักพักหนึ่งเมื่อวานนี้และในระหว่างนี้ฉันก็นึกถึงความท้าทายของตัวเอง

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่รับอาร์เรย์ของ Floats aและจำนวนเต็มnจากนั้นตั้งค่าแต่ละค่าaเป็นค่าเฉลี่ยของทั้งสองข้างโดยคูณด้วยnเวลา เมื่อใช้ซ้ำ ๆ กับการเพิ่มค่าของnสิ่งนี้จะสร้างการเคลื่อนไหวคล้ายคลื่น:

การเคลื่อนที่ของคลื่น

ข้อมูลจำเพาะ:

  • หากเกิดขึ้นมีเพียงหนึ่งรายการในaหรือถ้าnเป็น 0 หรือน้อยกว่าโปรแกรมควรกลับอาร์เรย์เดิม
  • อินพุตและเอาต์พุตสามารถอยู่ในรูปแบบที่คุณต้องการตราบใดที่แยกออกจากกันอย่างชัดเจน

สำหรับแต่ละขั้นตอน:

  • รายการแรกในaควรกลายเป็นค่าเฉลี่ยของตัวเองและรายการถัดไป
  • รายการสุดท้ายในaควรกลายเป็นค่าเฉลี่ยของตัวเองและรายการก่อนหน้า
  • รายการอื่น ๆ ในaควรเป็นค่าเฉลี่ยของรายการก่อนหน้าและรายการถัดไป
  • ตรวจสอบให้แน่ใจว่าคุณกำลังคำนวณอาเรย์ของขั้นตอนก่อนหน้าและไม่ใช่อาเรย์ปัจจุบัน

กรณีทดสอบ: หมายเหตุ: อินพุต / เอาต์พุตของคุณไม่จำเป็นต้องอยู่ในรูปแบบนี้!

[0, 0, 1, 0, 0], 1          -> [0, 0.5, 0, 0.5, 0]
[0, 0, 1, 0, 0], 2          -> [0.25, 0, 0.5, 0, 0.25]
[0, 0, 1, 0, 0], 0          -> [0, 0, 1, 0, 0]
[0, 0, 1, 0, 0], -39        -> [0, 0, 1, 0, 0]
[0, 16, 32, 16, 0], 1       -> [8, 16, 16, 16, 8]
[0, 1, 2, 3, 4, 5], 1       -> [0.5, 1, 2, 3, 4, 4.5]
[0, 64], 1                  -> [32, 32]
[0], 482                    -> [0]
[32, 32, 32, 16, 64, 16, 32, 32, 32], 4 -> [33, 27, 40, 22, 44, 22, 40, 27, 33]

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ ผู้ชนะจะได้รับการคัดเลือกในหนึ่งสัปดาห์ (วันที่ 1 สิงหาคม) โชคดี!

แก้ไข:ขอแสดงความยินดีกับผู้ชนะ@issacg ที่มีขนาด18 ไบต์!


2
คำแนะนำของฉันในการปรับปรุงความท้าทายนี้คือการกำจัดสิ่งที่nไม่ได้จัดจำหน่ายและaไม่ได้ระบุกรณี - พวกเขาไม่ได้เพิ่มอะไรมาก
isaacg

ฉันเชื่อว่ากรณีทดสอบสุดท้ายไม่ถูกต้อง nควรเป็น 4 ไม่ใช่ 5
isaacg

@isaacg: ใช่ตอนนี้ที่ฉันดูอีกครั้งกรณีเหล่านั้นดูเหมือนจะไม่สำคัญ ฉันได้เปลี่ยนแปลงสิ่งนั้นแล้วและแก้ไขตัวอย่างที่ไม่ถูกต้องเช่นกัน ขอบคุณสำหรับการชี้สิ่งเหล่านั้นออก!
ETHproductions

1
หากคุณต้องการให้มันจัดการกับรายการเปล่าคุณอาจต้องการเพิ่มลงในรายการกรณีทดสอบ ฉันเพิ่งสังเกตเห็นว่าโซลูชันของฉันล้มเหลวในกรณีนั้น โดยส่วนตัวฉันไม่ใช่แฟนตัวยงของปัญหาที่ส่วนใหญ่ของการแก้ปัญหาคือการจัดการกรณีพิเศษ
Reto Koradi

@RetoKoradi ขออภัยฉันลืมลบกรณี "รายการที่ว่าง" ออกจากกฎเมื่อฉันลบออกจากตัวอย่าง ขอบคุณสำหรับการแจ้งให้ทราบ!
ETHproductions

คำตอบ:


11

Pyth, 46 18 ไบต์

ucR2sV+hGGt+GeG.*Q

รหัสนี้คาดว่าจะป้อนข้อมูลในแบบฟอร์มiterations, [wave1, wave2, wave3 ...]ตามที่เห็นในลิงค์แรกด้านล่าง

สาธิต. สายรัดทดสอบ

โปรแกรมทำงานโดยใช้รหัสภายในuฟังก์ชั่นลด ( ) กับรายการอินพุตหลาย ๆ ครั้งตามจำนวนการวนซ้ำ

ฉันจะแสดงให้เห็นถึงฟังก์ชั่นการเผยแพร่คลื่นในรายการ[0, 1, 2, 3, 4, 5]ซึ่งอยู่ในG:

+hGGprepends G's องค์ประกอบแรกที่จะสร้างG[0, 0, 1, 2, 3, 4, 5]

t+GeGผนวกG's องค์ประกอบสุดท้ายไปและลบองค์ประกอบแรกของการขึ้นรูปG[1, 2, 3, 4, 5, 5]

sVรูปแบบแรกคู่จากรายการให้[[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]กับองค์ประกอบสุดท้ายของรายการแรกที่ถูกตัดออกไป จากนั้นคู่จะสรุปผ่านฟังก์ชั่นให้s[1, 2, 4, 6, 8, 9]

cR2ใช้การหารจำนวนจุดลอยตัวเพื่อหารจำนวนทั้งหมดด้วย 2 ทำให้ได้ผลลัพธ์ตามที่ต้องการ, [0.5, 1.0, 2.0, 3.0, 4.0, 4.5].


8

Snowman 1.0.0 , 219 ตัวอักษร

{vg" "aS:10sB;aM0aa,AAg**-:|al|'NdE'0nRal@(%}{->:1*?{0AaG;:?{;bI:dUNiNwR'NdEwRaC;aM(~:?{(()1wR]0wRaC*))#'wRaC|*#|(()#aLNdEdUNdEwR]wR]aCwR*))#aC;:0wRdUaCwR*?{#aC;#bI:*#0aA'|aa|'!*+'(()#1aA*))#|,aa|'*`nA2nD;aM|*0*;bR|tSsP

ด้วย linebreaks สำหรับ "การอ่าน":

{vg" "aS:10sB;aM0aa,AAg**-:|al|'NdE'0nRal@(%}{->:1*?{0AaG;:?{;bI:dUNiNwR'NdEwRaC;
aM(~:?{(()1wR]0wRaC*))#'wRaC|*#|(()#aLNdEdUNdEwR]wR]aCwR*))#aC;:0wRdUaCwR*?{#aC;#
bI:*#0aA'|aa|'!*+'(()#1aA*))#|,aa|'*`nA2nD;aM|*0*;bR|tSsP

เวอร์ชันที่ไม่ได้รับการแก้ไข / ไม่ระบุ:

{vg" "aS:10sB;aM  // input space-separated list of numbers
0aa,AAg           // get first element and array of all-but-first elements
**                // discard original input and the 0

// execute the following (input[0]) times
-:
    |al|'NdE'0nR               // get range from (0..input.length-1]
    al@(%}{->:1*?{0AaG;:?{;bI  // chop off first element if any
    :dUNiNwR'NdEwRaC;aM        // map n -> [n-1 n+1]
    // if the input consisted of a single element, append [0 0]
    // otherwise prepend [0 1] and append [len-2 len-1]
    (~:?{(()1wR]0wRaC*))#'wRaC|*#|(()#aLNdEdUNdEwR]wR]aCwR*))#aC;
        :0wRdUaCwR*?{#aC;#bI
    // map indeces to avg(input[i1], input[i2])
    :*#0aA'|aa|'!*+'(()#1aA*))#|,aa|'*`nA2nD;aM
    // replace old input, reset permavar
    |*0*
;bR

|tSsP  // output result

รูปแบบ I / O ตัวอย่าง:

llama@llama:...Code/snowman/ppcg53799waves$ snowman waves.snowman 
4 32 32 32 16 64 16 32 32 32
[33 27 40 22 44 22 40 27 33]

2
นี่เป็นสิ่งที่สวยงามอย่างน่ากลัว
kirbyfan64sos

5

Pyth - 25 24 ไบต์

ใช้แจงนับเพื่อทำซ้ำ

u.ecs@L++hGGeG,khhk2GvzQ

ลองมันออนไลน์ได้ที่นี่


5

แร็กเก็ต, 164 145 ไบต์

(define(f a n)(if(< n 1)a(f(let([l(length a)][r list-ref])(for/list([i(in-range l)])(/(+(r a(max(- i 1)0))(r a(min(+ i 1)(- l 1))))2)))(- n 1))))

Ungolfed

(define (f a n)
  (if (< n 1)
      a
      (f (let ([l (length a)] [r list-ref])
           (for/list ([i (in-range l)])
             (/ (+ (r a (max (- i 1) 0))
                   (r a (min (+ i 1) (- l 1))))
                2))) (- n 1))))

หมายเหตุคุณอาจต้องใช้#lang racketสายเพื่อเรียกใช้


4

R, 109 ไบต์

function(x,n){l=length(x);t=if(l>2)c(.5,0,.5)else if(l==2)c(.5,.5)else 1;for(i in 1:n)x=filter(x,t,c=T);c(x)}

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่ยอมรับเวกเตอร์และจำนวนเต็มและส่งคืนเวกเตอร์ วิธีการที่นี่คือการใช้อินพุตเป็นอนุกรมเวลาแบบไม่แปรและใช้ตัวกรองเชิงเส้นแบบเชิงเส้น

คำอธิบาย Ungolfed +:

f <- function(x, n) {
    # Define filter coefficients
    t <- if (length(x) > 2)
        c(0.5, 0, 0.5)
    else if (length(x) == 2)
        c(0.5, 0.5)
    else
        1

    # Apply the filter n times
    for (i in 1:n) {
        # The circular option wraps the filter around the edges
        # of the series, otherwise the ends would be set to NA.
        x <- filter(x, t, circular = TRUE)
    }

    # Returned the modified input, stripped of the extraneous
    # properties that the filter function adds.
    c(x)
}

ตัวอย่าง:

> f(c(32, 32, 32, 16, 64, 16, 32, 32, 32), 4)
[1] 33 27 40 22 44 22 40 27 33

> f(0, 482)
[1] 0

> f(c(0, 64), 1)
[1] 32 32

4

Haskell, 76 ตัวอักษร

เคล็ดลับคือการเพิ่มหมายเลขแรกไปยังจุดเริ่มต้นของรายการและหมายเลขสุดท้ายไปยังจุดสิ้นสุดของรายการแทนที่จะจัดการกับเงื่อนไขขอบเขต

f a@(x:s)=(/2)<$>zipWith(+)(x:a)(s++[last s])
f x=x
a#n|n<1=a|n>0=f a#(n-1)

แบบทดสอบ:

λ: [0, 0, 1, 0, 0]#1  
[0.0,0.5,0.0,0.5,0.0]
λ: [0, 0, 1, 0, 0]#2
[0.25,0.0,0.5,0.0,0.25]
λ: [0, 0, 1, 0, 0]#0  
[0.0,0.0,1.0,0.0,0.0]
λ: [0, 0, 1, 0, 0]#(-39) 
[0.0,0.0,1.0,0.0,0.0]
λ: [0, 16, 32, 16, 0]#1
[8.0,16.0,16.0,16.0,8.0]
λ: [0, 1, 2, 3, 4, 5]#1
[0.5,1.0,2.0,3.0,4.0,4.5]
λ: [0, 64]#1
[32.0,32.0]
λ: [0]#482
[0.0]
λ: [32, 32, 32, 16, 64, 16, 32, 32, 32]#4
[33.0,27.0,40.0,22.0,44.0,22.0,40.0,27.0,33.0]

1
คุณสามารถบันทึกสองสามไบต์ได้โดยใช้ตัวดำเนินการมัดสำหรับฟังก์ชัน 2 อาร์กิวเมนต์และตัวป้องกันแทนif then elseเช่นcจะกลายเป็นa#n|n<1=a|1<2=iterate f a!!nและsกลายเป็นx!y=(x+y)/2(และถูกเรียก...zipWith(!)(x:a)...)
nimi

ขอบคุณ! ไม่ทราบว่าพนักงานรักษาความปลอดภัยทำงานอย่างไรในนิพจน์บรรทัดเดียว
Keyran

อีก 2 ไบต์: ทำให้cผู้ประกอบการมัดกล่าวว่า:# เรียกว่าเหมือนa#n|n<1=a|1<2=iterate f a!!n [0, 0, 1, 0, 0] # 2
nimi

2

CJam, 23 22 ไบต์

q~{_(@)@@+@@+.+.5f*}*`

ลองออนไลน์

อินพุตอยู่ในรูปแบบรายการ CJam เช่นสำหรับตัวอย่างล่าสุด:

[32 32 32 16 64 16 32 32 32] 4

ผลลัพธ์ยังเป็นรายการ CJam:

[33.0 27.0 40.0 22.0 44.0 22.0 40.0 27.0 33.0]

วิธีพื้นฐานคือในแต่ละขั้นตอนเวกเตอร์จะเลื่อนตำแหน่งหนึ่งไปทางซ้ายและอีกหนึ่งตำแหน่งไปทางขวา แต่ละเวกเตอร์สองตัวจะถูกเสริมด้วยองค์ประกอบแรก / สุดท้ายจากนั้นคำนวณค่าเฉลี่ยของเวกเตอร์สองตัว

คำอธิบาย:

q~    Get and interpret input.
{     Loop over repeat count.
  _     Copy list.
  (     Pop off left element.
  @     Get original list to top.
  )     Pop off right element.
  @@    Get first element and list with last element removed to top.
  +     Concatenate. This gives right-shifted list with first element repeated.
  @@    Get list with first element removed and last element to top.
  +     Concatenate. This gives left-shifted list with last element repeated.
  .+    Perform vector addition of two shifted lists.
  .5f*  Multiply sum by 0.5 to give average.
}*    End loop over repeat count.
`     Convert result array to string.

ฉันไม่ใช่ OP แต่เป็น "ถ้ามีค่าเป็นศูนย์หรือหนึ่งรายการใน a หรือถ้า n เป็น 0 หรือน้อยกว่าโปรแกรมควรส่งคืนอาร์เรย์เดิม"
Maltysen

2

Java, 181 ไบต์

นี่คือเวอร์ชั่น golfed:

float[]g(float[]i,int n){float[]c=i.clone();int l=c.length,s=1;if(n>0&&l>1){c[0]=(i[0]+i[1])/2f;c[--l]=(i[l]+i[l-1])/2f;while(s<l)c[s]=(i[s-1]+i[++s])/2f;return g(c,n-1);}return i;}

Ungolfed:

float[] g(float[] i, int n) {
    float[] c = i.clone();
    int l = c.length,s=1;
    if(n>0&&l>1) {
        c[0] = (i[0]+i[1])/2f;
        c[--l] = (i[l]+i[l-1])/2f;
        while(s<l)
            c[s] = (i[s-1] + i[++s]) / 2f;
        return g(c, n-1);
    }
    return i;
}

ฉันพยายามย่อการกำหนดและเงื่อนไขให้สั้นที่สุดเท่าที่เป็นไปได้ด้วย Java การปรับปรุงยินดีต้อนรับแน่นอน


2

JavaScript (ES6), 153 132 67 ตัวอักษร

ฉันกลับมาที่คำตอบแรกของฉัน 6 เดือนต่อมาและฉันจะทำอย่างไร เล่นกอล์ฟ 50% นั่นคือสิ่งที่ ;)

s=(a,n)=>n<1?a:s(a.map((j,i)=>(a[i&&i-1]+a[a[i+1]+1?i+1:i])/2),n-1)

รุ่นนี้เรียกตัวเองซ้ำ ๆ จนกระทั่งnน้อยกว่า 1 ลดลงทีnละ 1 ทุกครั้ง

โซลูชันที่ไม่ต้องเรียกซ้ำ ( 151 130 78 ตัวอักษร):

(a,n)=>n<1?a:eval("while(n--)a=a.map((j,i)=>(a[i&&i-1]+a[a[i+1]+1?i+1:i])/2)")

Ungolfed: (ล้าสมัย)

recursive:

s = function (a, n) {
  if (n < 1)
    return a;
  b = [];
  l = a.length;
  x = y = 0;
  for(var i = 0; i < l; i++) {
    x = a[(i < 1) ? 0 : i-1];
    y = a[(i > l-2) ? i : i+1];
    b[i] = (x + y)/2;
  }
  if (n > 2)
    return b;
  return s(b,n-1);
}

Non-recursive:

s = function (a, n) {
  if (n < 1)
    return a;
  b = [];
  l = a.length;
  x = y = 0;
  while(n-- > 0) {
    for(var i = 0; i < l; i++) {
      x = a[(i < 1) ? 0 : i-1];
      y = a[(i > l-2) ? i : i+1];
      b[i] = (x + y)/2;
      a = b.slice(0);   // setting a to a copy of b, for copyright reasons
    }
  return b;
}

if(n<2)return b;return s(b,n-1)สามารถลดเป็นreturn n<2?b:s(b,n-1)
Cyoce

@Cyoce ขอบคุณฉันได้นำมาพิจารณาแล้วบางส่วน ...
ETHproductions

1

Java, 203 ไบต์

ลองใส่ครั้งแรกของฉันกับ Java ยินดีต้อนรับเคล็ดลับการปรับปรุง :)

double[]f(double[]a,int n){int j,s,i=0;s=a.length-1;if(n<1||s<1)return a;double b[]=a;for(;i++<n;a=b.clone()){b[0]=.5*(a[0]+a[1]);b[s]=.5*(a[s]+a[s-1]);for(j=1;j<s;++j)b[j]=.5*(a[j-1]+a[j+1]);}return b;}

พิมพ์สวย:

double[] g(double[] a, int n) {
  int j, s, i = 0;
  s = a.length - 1;
  if (n < 1 || s < 1)
     return a;
  double b[] = a;
  for (; i++ < n; a = b.clone()) {
     b[0] = .5 * (a[0] + a[1]);
     b[s] = .5 * (a[s] + a[s - 1]);
     for (j = 1; j < s; ++j)
        b[j] = .5 * (a[j - 1] + a[j + 1]);
  }
  return b;
}

ยินดีต้อนรับสู่ PPCG! ฉันเล่นกอล์ฟใน Java ไม่มาก แต่คุณสามารถย้ายการบ้านทั้งสามในวงนอกforไปยังคำสั่งการเพิ่มของลูปได้หรือไม่? ชอบfor(i=0;i<n;b[0]=...,b[s-1]=...,a=...,++i)for(...)b[j]=...;ไหม จากนั้นคุณควรกำจัดวงเล็บปีกกาได้
Martin Ender

น่าเสียดายที่พวกเขาต้องทำซ้ำในแต่ละรอบซ้ำดังนั้นพวกเขาจึงต้องอยู่ในวงเล็บปีกกา
Geir

การเพิ่มขึ้นจะถูกทำซ้ำในแต่ละครั้งซึ่งเป็นสาเหตุที่คุณใส่ไว้ในช่องที่สาม (แยกจากกันและคั่น++iด้วยเครื่องหมายจุลภาคแทนเครื่องหมายอัฒภาค) ลองดู :)
Martin Ender

ฉันเห็นว่าคุณกำลังจะไปที่ใด แต่ฉันสูญเสียการอัปเดตในการทำซ้ำขั้นสุดท้าย (เว้นแต่จะมีเคล็ดลับที่ฉันไม่ทราบ) ยังคงสามารถที่จะโกนไม่กี่ไบต์ที่นี่และมีโดยการทำ "สิ่งที่น่าเกลียด" :)
Geir

ฉันไม่คิดว่าคุณจะสูญเสียการอัปเดตในการทำซ้ำครั้งสุดท้าย f(a;b;c){d;e;}ควรเหมือนกันf{a;b;}{d;e;c;}ทั้งหมดและด้วยเช่นf(a;b;e,c)d;กัน อย่างไรก็ตามด้วยโค้ดที่จัดเรียงใหม่ของคุณซึ่งไม่สามารถใช้งานได้อีกต่อไปเพราะคุณไม่สามารถย้ายโค้ดforอื่น ๆforได้ดังนั้นฉันเดาว่าทั้งหมดนี้ไม่สำคัญอีกต่อไป ;)
Martin Ender

1

Python 2, 98 ไบต์

เอาวิธีการตรงไปตรงมาใช้execในการออกจากการใช้ในขณะที่วง ฉันคิดว่ามีวิธีที่ดีกว่าในการทำตรรกะเพื่อหาตำแหน่งกรณีพิเศษ แต่ตอนนี้ใช้งานได้แล้ว [list], timesการป้อนข้อมูลควรมีรูปแบบเช่น

b,c=input()
k=~-len(b)
exec'b=[(b[x-(0<x<k)]+b[x+(x<k)-(x==k)])/2.for x in range(-~k)];'*c
print b

Ungolfed:

BASE,TIME = input()
TEMP = [0]*len(BASE)                               # Temporary array as to not modify base.
while TIME:
    for x in xrange(len(BASE)):
        if x == 0:                                
            TEMP[x] = (BASE[x]   + BASE[x+1])/2.0  # First element special case.
        elif x == len(BASE)-1:                    
            TEMP[x] = (BASE[x]   + BASE[x-1])/2.0  # Last element special case.
        else:                                     
            TEMP[x] = (BASE[x-1] + BASE[x+1])/2.0  # Every other element.
    BASE = TEMP                                    # Set base to temporary array.
    TEMP = [0]*len(BASE)                           # Reset temporary array to 0s.
    TIME = TIME - 1
print BASE

1

Mathematica, 81 ไบต์

ฉันมีความรู้สึกว่าสามารถตีกอล์ฟได้มากกว่านี้หากฉันสามารถหาวิธีที่ดีกว่าในการจัดการกับสภาพที่เป็นบวก

f[l_,_]:=l;f[l_,n_/;n>0]:=Nest[.5{1,0,1}~ListConvolve~ArrayPad[#,1,"Fixed"]&,l,n]

มูลค่า noting: Mathematica CellularAutomatonข้อเสนอจำนวนมากที่มีศักยภาพในตัวการแก้ปัญหาในช่วงของรายการประมวลผลและการกรองฟังก์ชั่นเช่นเดียวกับ ฉันเลือกNest[... ListConvolve ...]เพราะมันเป็นวิธีที่ง่ายที่สุดในการหาจุดที่ปลายสุดของรายการ แต่มุมอื่น ๆ อาจพิสูจน์ให้สั้นลง


0

Matlab, 109

function a=f(a,n)
if numel(a)>1&n>0
for k=1:n
a=[a(1)+a(2) conv(a,[1 0 1],'valid') a(end-1)+a(end)]/2;end
end

ตัวอย่าง:

>> f([0, 0, 1, 0, 0], 1)
ans =
         0    0.5000         0    0.5000         0

>> f([0, 0, 1, 0, 0], 2)
ans =
    0.2500         0    0.5000         0    0.2500

>> f([0, 0, 1, 0, 0], 0)
ans =
     0     0     1     0     0

>> f([0, 0, 1, 0, 0], -39)
ans =
     0     0     1     0     0

>> f([0], 482)
ans =
     0

>> f([], 10)
ans =
     []

0

สกาลา, 195 ตัวอักษร (186 ที่มีเอาต์พุตแบบขี้เกียจ, Stream) 187 ตัวอักษร

(t:Seq[Float],n:Int)⇒t.size match{case 0|1⇒t;case 2⇒{val a=t.sum/2;Seq(a,a)};case i⇒(t/:(1 to n)){(s,_)⇒(s.take(2).sum/2)+:s.sliding(3).map(l=>(l(0)+l(2))/2).toList:+(s.drop(i-2).sum/2)}}

อาจไม่เหมาะสมการทำแผนที่sliding(3)มีประโยชน์มากในกรณีนี้

การทดสอบ:

scala> (t:Seq[Float],n:Int)⇒t.size match{case 0|1⇒t;case 2⇒{val a=t.sum/2;Seq(a,a)};case i⇒(t/:(1 to n)){(s,_)⇒(s.take(2).sum/2)+:s.sliding(3).map(l=>(l(0)+l(2))/2).toList:+(s.drop(i-2).sum/2)}}
res0: (Seq[Float], Int) => List[Float] = <function2>

scala> res0(Seq(0, 0, 1, 0, 0), 1)
res1: Seq[Float] = List(0.0, 0.5, 0.0, 0.5, 0.0)

scala> res0(Seq(0, 0, 1, 0, 0), 2)
res2: Seq[Float] = List(0.25, 0.0, 0.5, 0.0, 0.25)

scala> res0(Seq(0, 0, 1, 0, 0), 0)
res3: Seq[Float] = List(0.0, 0.0, 1.0, 0.0, 0.0)

scala> res0(Seq(0, 0, 1, 0, 0), -39)
res4: Seq[Float] = List(0.0, 0.0, 1.0, 0.0, 0.0)

scala> res0(Seq(0, 16, 32, 16, 0), 1)
res5: Seq[Float] = List(8.0, 16.0, 16.0, 16.0, 8.0)

scala> res0(Seq(1, 2, 3, 4, 5), 1)
res6: Seq[Float] = List(1.5, 2.0, 3.0, 4.0, 4.5)

scala> res0(Seq(0,64), 1)
res7: Seq[Float] = List(32.0, 32.0)

scala> res0(Seq(0), 482)
res8: Seq[Float] = List(0.0)

scala> res0(Seq(32, 32, 32, 16, 64, 16, 32, 32, 32), 4)
res9: Seq[Float] = List(33.0, 27.0, 40.0, 22.0, 44.0, 22.0, 40.0, 27.0, 33.0)

0

q (27 ตัวอักษร)

{avg x^/:1 -1 xprev\:x}/[;]

ตัวอย่าง

q)f:{avg x^/:1 -1 xprev\:x}/[;]
q)f[4;32 32 32 16 64 16 32 32 32]
33 27 40 22 44 22 40 27 33f
//1-length input
q)f[10;enlist 1] 
,1f
//0-length input
q)f[10;`float$()]
`float$()

0

R, 93 ไบต์

เป็นฟังก์ชั่นที่ไม่มีชื่อ

function(a,n){l=length(a);while((n=n-1)>=0)a<-colMeans(rbind(c(a[-1],a[l]),c(a[1],a[-l])));a}

ขยาย

function(a,n){
    l=length(a);             # get the length of the vector
    while((n=n-1)>=0)        # repeat n times
        a<-colMeans(         # do the column means and assign to a
          rbind(             # create an array
            c(a[-1],a[l]),   # shift the vector left and duplicate last
            c(a[1],a[-l])    # shift the vector right and duplicate first
          )
        );
    a                        # return the vector
}

การทดสอบ

> f=function(a,n){l=length(a);while((n=n-1)>=0)a<-colMeans(rbind(c(a[-1],a[l]),c(a[1],a[-l])));a}
> f(c(0, 0, 1, 0, 0), 1)
[1] 0.0 0.5 0.0 0.5 0.0
> f(c(0, 0, 1, 0, 0), 2)         
[1] 0.25 0.00 0.50 0.00 0.25
> f(c(0, 0, 1, 0, 0), 0)         
[1] 0 0 1 0 0
> f(c(0, 0, 1, 0, 0), -39)        
[1] 0 0 1 0 0
> f(c(0, 16, 32, 16, 0), 1)       
[1]  8 16 16 16  8
> f(c(0, 1, 2, 3, 4, 5), 1)      
[1] 0.5 1.0 2.0 3.0 4.0 4.5
> f(c(0, 64), 1)                  
[1] 32 32
> f(c(0), 482)                    
[1] 0
> f(c(32, 32, 32, 16, 64, 16, 32, 32, 32),4)
[1] 33 27 40 22 44 22 40 27 33
> 

0

Japt 39 39ไบต์ (ไม่ใช่การแข่งขัน)

คำตอบนี้ไม่ใช่การแข่งขันเนื่องจากภาษาใหม่กว่าความท้าทาย ฉันแค่อยากจะเห็นว่าภาษากอล์ฟของฉันสามารถรับมือกับความท้าทายครั้งแรกได้ดีเพียงใด

Vm0 o r_£ZgY©Y-1 +ZgY>Zl -2?Y:°Y)/2}U

ลองออนไลน์!

Vm0 o r_£ZgY©Y-1 +ZgY>Zl -2?Y:°Y)/2}U
Vm0 o      // Generate the range of integers [0, max(V,0)).
r_     }U  // Reduce it with this function, with a starting value of U:
£          //  Return the argument, with each item X, index Y, and the full array Z mapped by this function:
ZgY©Y-1 +  //   Return (Z[max(Y-1,0)] plus
ZgY>Zl -2? //    Z[Y > Z.length-2?
Y:°Y)      //      Y:--Y],)
/2         //   divided by two.
           // Implicit: output last expression

0

C ++ 14, 158 ไบต์

#define D(a,b)d[i]=(c[a]+c[b])/2;
auto f(auto c,int n){while(n-->0&&c.size()>1){auto d{c};int i{};D(0,1)while(++i<c.size()-1)D(i-1,i+1)D(i,i-1)c=d;}return c;}

ต้องมีการป้อนข้อมูลที่จะเป็นภาชนะเช่นvalue_type==doublevector<double>

Ungolfed:

#define D(a,b) d[i] = (c[a]+c[b])/2;   //average
auto f(auto c, int n) {
  while(n-- > 0 && c.size() > 1) {     //breaks
    auto d{c};                         //copy container
    int i{};
    D(0,1)                             //left
    while(++i < c.size()-1)            //count up to right
      D(i-1,i+1)                       //interior
    D(i,i-1)                           //right
    c=d;                               //overwrite container
  }
  return c;
}

0

แร็กเก็ต 223 ไบต์

(let p((l l)(m 0)(g list-ref))(cond[(> n m)(let*((j(length l))(k(for/list((i j))(cond[(= i 0)(/(+(g l 0)(g l 1))2)]
[(= i(- j 1))(/(+(g l(- j 2))(g l(- j 1)))2)][else(/(+(g l(+ i 1))(g l(- i 1)))2)]))))(p k(+ 1 m) g))][l]))

Ungolfed:

(define(f l n)
  (let loop ((l l)
             (m 0)
             (lr list-ref))
    (cond
      [(> n m)
       (let* ((j (length l))
              (k (for/list ((i j))
                   (cond
                     [(= i 0)       (/ (+ (lr l 0)
                                          (lr l 1))
                                       2)]
                     [(= i (- j 1)) (/ (+ (lr l (- j 2))
                                          (lr l (- j 1)))
                                        2)]
                     [else          (/ (+ (lr l (+ i 1))
                                          (lr l (- i 1)))
                                       2)])
                   )))
         (loop k
               (+ 1 m)
               lr))]
      [else l]
      )))

การทดสอบ:

(f '[32 32 32 16 64 16 32 32 32] 4)

เอาท์พุท:

'(33 27 40 22 44 22 40 27 33)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.