Dalgaları hesaplamak


26

Bu siteyi bir süredir kaydırıyorum, ancak son zamanlarda bazı zorlukları denemekle gerçekten çok ilgilenmiştim. Elimde mevcut kod-golf konularının bazılarında denemek niyetindeydim, fakat dün bir süredir İnternet erişimim yoktu ve bu arada, kendi zorluğumu düşündüm.

Göreviniz, bir Kayan Nokta dizisi ave bir tamsayı alan bir program veya işlev oluşturmak ve nardından her bir değeri a, nzamanın yanındaki iki değerin ortalamasına ayarlar . Art arda artan değerlerle kullanıldığında n, dalga benzeri bir hareket oluşturur:

dalga hareketi

Özellikleri:

  • İçinde yalnızca bir öğe avarsa nveya 0 veya daha az ise, program orijinal diziyi döndürmelidir.
  • Girişler ve çıkışlar, görünür bir şekilde ayrıldıkları sürece, istediğiniz herhangi bir biçimde olabilir.

Her adım için:

  • İçindeki ilk madde a, kendisinin ve bir sonraki maddenin ortalaması olmalıdır.
  • İçindeki son madde a, kendisinin ve önceki öğenin ortalaması olmalıdır.
  • Başka bir öğe aönceki öğenin ve sonraki öğenin ortalaması olmalıdır.
  • Geçerli olanı değil önceki adımın dizisini hesapladığınızdan emin olun!

Test durumları: NOT: Giriş / çıkışlarınızın bu biçimde olması gerekmez!

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

Bu , bayt cinsinden en kısa cevap kazanır. Kazanan bir hafta içinde (1 Ağustos'ta) seçilecek. İyi şanslar!

Düzenleme: Kazanan, @issacg , 18 bayt ile tebrikler !


2
Bu zorluğun üstesinden gelmek için tavsiyem, ntemin edilmediğinden ve atedarik edilmeyen durumlar olmadığından - gerçekten fazla bir şey eklemiyorlar.
isaacg,

Son test davasının yanlış olduğuna inanıyorum. n5 olmalı, 5 değil.
isaacg

@isaacg: Evet, şimdi tekrar bakıyorum, bu davalar o kadar önemli görünmüyor. Bunu değiştirdim ve yanlış örneği de düzelttim. Bu şeyleri işaret ettiğiniz için teşekkür ederiz!
ETHproductions

1
Boş listeleri işlemesini gerçekten istiyorsanız, bunu test senaryoları listesine eklemek isteyebilirsiniz. Çözümümün bu dava için başarısız olduğunu fark ettim. Şahsen, çözümün büyük bir bölümünün özel durumlarla başa çıkabildiği büyük bir sorun hayranı değilim.
Reto Koradi

@RetoKoradi Üzgünüm, örneklerden çıkardığımda "boş liste" davasını kurallardan kaldırmayı unuttum. Uyarı için teşekkürler!
ETHproductions

Yanıtlar:


11

Pyth, 46 18 bayt

ucR2sV+hGGt+GeG.*Q

Bu kod iterations, [wave1, wave2, wave3 ...], aşağıdaki ilk linkte görüldüğü gibi formdaki girişi bekler .

Gösteri. Test Demeti.

Program u, yinelemelerin sayısı kadar, girişin listesine reduc ( ) işlevindeki kodu uygulayarak çalışır .

Listede [0, 1, 2, 3, 4, 5], dalga yayılım işlevini göstereceğim G:

+hGGGilk elemanını Gbiçimlendirmeye hazırlar [0, 0, 1, 2, 3, 4, 5].

t+GeGGson elemanını ekler Gve onu oluşturan ilk elemanını kaldırır [1, 2, 3, 4, 5, 5].

sVilk listelerden çiftler [[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]oluşturur, ilk listenin son elemanı ile kesilir. Daha sonra çiftler svererek , fonksiyon aracılığıyla toplanır [1, 2, 4, 6, 8, 9].

cR2Tüm sayıları 2'ye bölmek için kayan nokta bölmesini kullanır, istenen sonucu verir [0.5, 1.0, 2.0, 3.0, 4.0, 4.5].


8

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

"Okunabilirlik" için çizgi çubuklarıyla:

{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

Ungolfed / unminified versiyonu:

{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

Örnek I / O formatı:

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
Bu çok güzel.
kirbyfan64sos


5

Raket, 164 145 bayt

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

Not, bunu #lang racketçalıştırmak için çizgiye ihtiyacınız olabilir .


4

R, 109 bayt

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

Bu, bir vektörü ve bir tamsayıyı kabul eden ve bir vektörü döndüren adsız bir fonksiyon yaratır. Buradaki yaklaşım girdiyi tek değişkenli bir zaman serisi olarak ele almak ve doğrusal bir evrişim filtresi uygulamaktır.

Ungolfed + açıklama:

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

Örnekler:

> 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

İşin püf noktası, sınır koşullarıyla uğraşmak yerine ilk sayıyı listenin başına, sonunu da listenin sonuna eklemektir.

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)

Testler:

λ: [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 argüman işlevi ve korumaları için infix operatörlerini kullanarak if then else, yani colur a#n|n<1=a|1<2=iterate f a!!nve solur x!y=(x+y)/2(ve çağrılır ...zipWith(!)(x:a)...) birkaç bayttan tasarruf edebilirsiniz .
nimi

Teşekkürler! Gardiyanların tek satırlık ifadelerle nasıl çalıştığını bilmiyordum.
Keyran

Başka 2 byte: yapmak cbir infix operatörü derler #: a#n|n<1=a|1<2=iterate f a!!n. Öyle çağır [0, 0, 1, 0, 0] # 2.
nimi

2

CJam, 23 22 bayt

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

Çevrimiçi deneyin

Girdi CJam liste biçiminde, örneğin son örnek için:

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

Çıktı ayrıca bir CJam listesidir:

[33.0 27.0 40.0 22.0 44.0 22.0 40.0 27.0 33.0]

Temel yaklaşım, her adımda, vektörün bir pozisyon sola, bir pozisyon sağa kaydırılmasıdır. İki vektörün her biri ilk / son eleman ile doldurulur ve daha sonra iki vektörün ortalaması hesaplanır.

Açıklama:

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 değilim, ancak "
a'da

2

Java, 181 bayt

İşte golf versiyonu:

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 ile ödev ve şartlandırmaları mümkün olduğunca kısaltmaya çalıştım. Tabii ki iyileştirmeler de yapılabilir.


2

JavaScript (ES6), 153 132 67 karakter

6 ay sonra ilk cevabımı geri verdim ve ne yapmalıyım? % 50 golf oynamak, işte bu. ;)

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)

Bu sürüm n1'den az olana kadar sürekli tekrar eder , nher seferinde 1 azalır .

Özyinelemeli olmayan bir çözüm ( 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)")

Ungolfed: (eski)

özyineli:

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

Sigara özyinelemeli:

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

@Cyoce Teşekkürler, bunu hesaba
kattım

1

Java, 203 bayt

Java ile ilk konuşmamı deniyorum. İyileştirme ipuçları açıktır :)

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

Oldukça basılmış:

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'ye Hoşgeldiniz! Java'da çok fazla golf oynamıyorum, ancak dış fordöngü içindeki üç ödevi döngünün artış ifadesine taşıyabilir misiniz ? Gibi for(i=0;i<n;b[0]=...,b[s-1]=...,a=...,++i)for(...)b[j]=...;mi? O zaman diş tellerinden kurtulabilmelisin.
Martin Ender

Maalesef her yinelemede tekrarlanmaları gerekiyor, bu yüzden ayraçların içinde kalmaları gerekiyor.
Geir

Artış, her yinelemede de tekrarlanır, bu yüzden onları üçüncü yuvaya koydunuz (birbirinden ++inoktalı virgül yerine virgüllerle ayrılmış ). Denemek. :)
Martin Ender

Nereye gittiğinizi anlıyorum ama son yinelemedeki güncellemeyi kaybediyorum (bilmediğim bir numara yoksa). Yine de, burada ve orada "çirkin şeyler" yaparak birkaç byte tıraş edebiliyor :) :)
Geir

Son yinelemedeki güncellemeyi kaybettiğini sanmıyorum. f(a;b;c){d;e;}tamamen f{a;b;}{d;e;c;}ve bu nedenle de aynı olmalıdır f(a;b;e,c)d;. Ancak, yeniden düzenlenmiş kodunuzla artık çalışmaz, çünkü foriçini diğer tarafa taşıyamazsınız for, bu yüzden artık bunların hiçbiri önemli değil. ;)
Martin Ender

1

Python 2, 98 Bayt

execBir süre döngü kullanmaktan çıkmak için kullanılan basit bir yaklaşım aldı . Özel durum konumlarını bulmak için mantığı yapmanın daha iyi bir yolu olduğunu düşünüyorum, ancak bu şimdilik işe yarıyor. Giriş gibi biçimlendirilmiş olmalıdır [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 bayt

Pozitiflik durumunu ele almanın daha iyi bir yolunu bulabilirsem daha çok golf oynayabileceğimi hissediyorum.

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

Kayda değer: Mathematica, liste işleme ve filtre fonksiyonlarının yanı sıra birçok potansiyel yerleşik çözüm de sunar CellularAutomaton. Seçtim Nest[... ListConvolve ...]çünkü listenin sonundaki sıkıntıları çözmenin en kolay yoluydu, ancak diğer açılar daha kısa olabilirdi.


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

Örnekler:

>> 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 (tembel çıkışlaStream 186 karakter , yani ) 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)}}

muhtemelen optimal değildir, haritalama sliding(3)bu durumda çok yararlıdır.

testler:

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}/[;]

Örnekler

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 Bayt

Adsız bir işlev olarak

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}

Expanded

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
}

Testler

> 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 bayt (yarışmayan)

Bu cevap rakip değildir çünkü dil zorluktan daha yenidir. Golf dilimin ilk zorluklarımı ne kadar iyi tutabildiğini görmek istedim.

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

Çevrimiçi deneyin!

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 bayt

#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==doubleGibi bir konteyner olmak için giriş gerektirir vector<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

Raket 223 bayt

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

Test yapmak:

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

Çıktı:

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.