Menghitung gelombang


26

Saya telah menelusuri situs ini untuk sementara waktu, tetapi baru-baru ini saya benar-benar tertarik untuk mencoba beberapa tantangan. Saya berniat untuk mencoba beberapa topik kode-golf yang ada, tetapi saya tidak memiliki akses Internet untuk sementara waktu kemarin, dan sementara itu, saya memikirkan tantangan saya sendiri.

Tugas Anda adalah membuat program atau fungsi yang mengambil array Mengapung adan integer n, kemudian menetapkan setiap nilai ake rata-rata dari dua di sampingnya, nkali. Ketika berulang kali digunakan dengan peningkatan nilai n, ini menghasilkan gerakan seperti gelombang:

gerakan gelombang

Spesifik:

  • Jika hanya ada satu item a, atau jika n0 atau kurang, program harus mengembalikan array asli.
  • Input dan output dapat dalam format apa pun yang Anda inginkan, selama mereka terlihat terpisah.

Untuk setiap langkah:

  • Item pertama di aharus menjadi rata-rata dari dirinya sendiri dan item berikutnya.
  • Item terakhir di aharus menjadi rata-rata dari dirinya sendiri dan item sebelumnya.
  • Item lain dalam aharus menjadi rata-rata item sebelumnya dan item berikutnya.
  • Pastikan Anda menghitung larik langkah sebelumnya dan bukan yang sekarang!

Kasing uji: CATATAN: Input / output Anda tidak harus dalam format ini!

[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]

Ini adalah , jadi jawaban tersingkat dalam byte menang. Pemenang akan dipilih dalam satu minggu (pada 1 Agustus). Semoga berhasil!

Sunting: Selamat kepada pemenang, @issacg , dengan total 18 byte!


2
Saran saya untuk meningkatkan tantangan ini adalah untuk menyingkirkan yang ntidak disediakan dan atidak disediakan kasus - mereka tidak terlalu banyak menambah
isaacg

Saya percaya kasus ujian akhir tidak benar. nharus 4, bukan 5.
isaacg

@isaacg: Ya, sekarang saya melihatnya lagi, kasing itu sepertinya tidak penting. Saya telah mengubah itu, dan memperbaiki contoh yang salah juga. Terima kasih telah menunjukkan hal-hal itu!
ETHproduk

1
Jika Anda benar-benar ingin menangani daftar kosong, Anda mungkin ingin menambahkannya ke daftar kotak uji. Saya hanya memperhatikan bahwa solusi saya gagal untuk kasus itu. Secara pribadi, saya bukan penggemar masalah di mana sebagian besar solusi untuk menangani kasus-kasus khusus.
Reto Koradi

@RetoKoradi Maaf, saya lupa menghapus case "daftar kosong" dari aturan ketika saya menghapusnya dari contoh. Terima kasih atas pemberitahuannya!
ETHproductions

Jawaban:


11

Pyth, 46 18 byte

ucR2sV+hGGt+GeG.*Q

Kode ini mengharapkan input dalam bentuk iterations, [wave1, wave2, wave3 ...], seperti yang terlihat pada tautan pertama di bawah ini.

Demonstrasi. Uji Harness.

Program ini bekerja dengan menerapkan kode dalam fungsi reduce ( u) ke daftar input, sebanyak jumlah iterasi.

Saya akan mendemonstrasikan fungsi perambatan gelombang pada daftar [0, 1, 2, 3, 4, 5], yaitu di G:

+hGGprepends G's elemen pertama yang G, membentuk [0, 0, 1, 2, 3, 4, 5].

t+GeGmenambahkan Gelemen terakhir ke Gdan menghapus elemen pertama, membentuk [1, 2, 3, 4, 5, 5].

sVbentuk pertama pasangan dari daftar, memberi [[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]dengan elemen terakhir dari daftar pertama terpotong. Kemudian, pasangan diringkas melalui sfungsi, memberi [1, 2, 4, 6, 8, 9].

cR2menggunakan divisi floating point untuk membagi semua angka dengan 2, memberikan hasil yang diinginkan [0.5, 1.0, 2.0, 3.0, 4.0, 4.5],.


8

Snowman 1.0.0 , 219 karakter

{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

Dengan linebreak untuk "keterbacaan":

{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

Versi tidak disatukan / tidak dijinakkan:

{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

Contoh format 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
Ini sangat indah.
kirbyfan64sos


5

Raket, 164 145 byte

(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))))

Tidak disatukan

(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))))

Catatan, Anda mungkin perlu #lang racketsaluran untuk menjalankan ini.


4

R, 109 byte

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)}

Ini menciptakan fungsi tanpa nama yang menerima vektor dan integer dan mengembalikan vektor. Pendekatan di sini adalah memperlakukan input sebagai rangkaian waktu univariat dan menerapkan filter konvolusi linier.

Penjelasan + tidak dikumpulkan:

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)
}

Contoh:

> 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 karakter

Caranya adalah dengan menambahkan angka pertama ke awal daftar dan yang terakhir ke akhir daftar alih-alih berurusan dengan kondisi batas.

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)

Tes:

λ: [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
Anda dapat menyimpan beberapa byte dengan menggunakan operator infiks untuk fungsi dan pelindung 2-argumen alih-alih if then else, yakni cmenjadi a#n|n<1=a|1<2=iterate f a!!ndan smenjadi x!y=(x+y)/2(dan disebut ...zipWith(!)(x:a)...).
nimi

Terima kasih! Tidak tahu bagaimana penjaga bekerja dalam ekspresi satu baris.
Keyran

Lain 2 bytes: membuat coperator infiks, mengatakan #: a#n|n<1=a|1<2=iterate f a!!n. Sebut saja seperti [0, 0, 1, 0, 0] # 2.
nimi

2

CJam, 23 22 byte

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

Cobalah online

Masukan dalam format daftar CJam, misalnya untuk contoh terakhir:

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

Outputnya juga daftar CJam:

[33.0 27.0 40.0 22.0 44.0 22.0 40.0 27.0 33.0]

Pendekatan dasarnya adalah bahwa dalam setiap langkah, vektor digeser satu posisi ke kiri dan satu posisi ke kanan. Masing-masing dari dua vektor diisi dengan elemen pertama / terakhir, dan kemudian rata-rata dari kedua vektor dihitung.

Penjelasan:

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.

Saya bukan OP, tetapi "Jika kebetulan ada nol atau satu item dalam a, atau jika n adalah 0 atau kurang, program harus mengembalikan array asli."
Maltysen

2

Java, 181 byte

Ini versi golfnya:

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;}

Tidak Disatukan:

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;
}

Saya mencoba mempersingkat tugas dan persyaratan sebanyak mungkin dengan Java. Perbaikan disambut, tentu saja.


2

JavaScript (ES6), 153 132 67 karakter

Saya kembali ke jawaban pertama saya 6 bulan kemudian dan apa yang harus saya lakukan? Golf diskon 50%, itu saja. ;)

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)

Versi ini menyebut dirinya berulang kali hingga nkurang dari 1, menurunn 1 setiap kali.

Solusi non-rekursif ( 151 130 78 karakter):

(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)")

Tidak dikelompokkan: (kedaluwarsa)

Rekursif:

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-rekursif:

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)dapat direduksi menjadireturn n<2?b:s(b,n-1)
Cyoce

@Cyoce Terima kasih, saya sudah memperhitungkannya, dan kemudian beberapa ...
ETHproduksi

1

Java, 203 byte

Mencoba put pertama saya dengan Java. Tips perbaikan dipersilahkan :)

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;}

Cukup dicetak:

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;
}

Selamat datang di PPCG! Saya tidak banyak bermain golf di Jawa, tetapi bisakah Anda memindahkan tiga tugas di dalam forloop luar ke dalam pernyataan kenaikan loop? Suka for(i=0;i<n;b[0]=...,b[s-1]=...,a=...,++i)for(...)b[j]=...;? Maka Anda harus bisa menyingkirkan kawat gigi.
Martin Ender

Sayangnya mereka harus diulang pada setiap iterasi, sehingga mereka harus tetap di dalam kurung kurawal.
Geir

Selisih juga diulang setiap iterasi, itulah sebabnya Anda akan menempatkannya di slot ketiga (dipisahkan dari ++idan satu sama lain dengan koma, bukan titik koma). Cobalah. :)
Martin Ender

Saya melihat ke mana Anda akan pergi, tetapi saya kehilangan pembaruan dalam iterasi akhir (kecuali ada trik saya tidak tahu). Namun, masih dapat mencukur beberapa byte di sana-sini dengan melakukan "hal-hal buruk" :)
Geir

Saya tidak berpikir Anda kehilangan pembaruan pada iterasi akhir. f(a;b;c){d;e;}harus sepenuhnya identik dengan f{a;b;}{d;e;c;}, dan karenanya juga f(a;b;e,c)d;. Namun, dengan kode ulang Anda yang tidak lagi berfungsi, karena Anda tidak dapat memindahkan bagian fordalamnya for, jadi saya kira semua ini tidak lagi penting. ;)
Martin Ender

1

Python 2, 98 Bytes

Mengambil pendekatan langsung, digunakan execuntuk keluar dari menggunakan loop sementara. Saya pikir ada cara yang lebih baik untuk melakukan logika untuk mengetahui posisi kasus khusus, tetapi ini berfungsi untuk saat ini. Input harus berformat seperti [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

Tidak Disatukan:

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 byte

Saya punya perasaan itu bisa bermain golf lebih banyak jika saya bisa mencari cara yang lebih baik untuk menangani kondisi positif.

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

Patut dicatat: Mathematica juga menawarkan banyak solusi bawaan dalam berbagai fungsi pemrosesan daftar dan filter, juga CellularAutomaton. Saya memilih Nest[... ListConvolve ...]karena itu adalah cara termudah untuk menyelesaikan kekusutan di akhir daftar, tetapi sudut lain mungkin terbukti lebih pendek.


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

Contoh:

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

Scala, 195 karakter (186 dengan output malas, yaitu Stream) 187 karakter

(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)}}

mungkin tidak optimal, pemetaan sliding(3)sangat berguna dalam hal ini.

tes:

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 karakter)

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

Contohnya

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 Bytes

Sebagai fungsi yang tidak disebutkan namanya

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}

Diperluas

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
}

Tes

> 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 37 byte (tidak bersaing)

Jawaban ini tidak bersaing karena bahasa lebih baru daripada tantangan. Saya hanya ingin melihat seberapa baik bahasa golf saya dapat bertahan terhadap tantangan pertama saya.

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

Cobalah online!

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 byte

#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;}

Membutuhkan input untuk menjadi wadah value_type==double, seperti vector<double>.

Tidak Disatukan:

#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

Racket 223 byte

(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]))

Tidak Disatukan:

(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]
      )))

Pengujian:

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

Keluaran:

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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.