Wellen berechnen

26

Ich habe eine Weile auf dieser Seite geblättert, bin aber erst kürzlich sehr daran interessiert, einige der Herausforderungen auszuprobieren. Ich hatte vor, mich in einigen der bestehenden Code-Golf-Themen zu versuchen, hatte aber gestern eine Weile keinen Internetzugang und habe mir in der Zwischenzeit meine eigene Herausforderung ausgedacht.

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu erstellen, die ein Array von Gleitkommazahlen aund eine Ganzzahl enthält n, und dann jeden Wert aauf den Durchschnitt der beiden daneben stehenden nZeiten zu setzen. Bei wiederholter Verwendung mit steigenden Werten von nwird eine wellenartige Bewegung erzeugt:

Wellenbewegung

Besonderheiten:

  • Befindet sich zufällig nur ein Element in aoder nist es 0 oder weniger, sollte das Programm das ursprüngliche Array zurückgeben.
  • Ein- und Ausgänge können in jedem gewünschten Format vorliegen, sofern sie sichtbar voneinander getrennt sind.

Für jeden Schritt:

  • Das erste Element in asollte der Durchschnitt von sich selbst und das nächste Element werden.
  • Das letzte Element in asollte der Durchschnitt von sich selbst und dem vorherigen Element werden.
  • Jedes andere Element in asollte der Durchschnitt des vorherigen Elements und des nächsten Elements werden.
  • Stellen Sie sicher, dass Sie das Array des vorherigen Schritts und nicht das aktuelle Array berechnen!

Testfälle: HINWEIS: Ihre Ein- / Ausgänge müssen nicht in diesem Format vorliegen!

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

Das ist , also gewinnt die kürzeste Antwort in Bytes. Der Gewinner wird in einer Woche (am 1. August) ermittelt. Viel Glück!

Edit: Herzlichen Glückwunsch an den Gewinner, @issacg , mit satten 18 Bytes!

ETHproductions
quelle
2
Mein Rat zur Verbesserung dieser Herausforderung ist, die nnicht gelieferten und anicht gelieferten Fälle loszuwerden - sie tragen nicht wirklich viel dazu bei.
Isaacg
Ich glaube, der letzte Testfall ist falsch. nsollte 4 sein, nicht 5.
isaacg
@isaacg: Ja, jetzt, wo ich es mir noch einmal ansehe, scheinen diese Fälle nicht so wichtig zu sein. Ich habe das geändert und auch das falsche Beispiel korrigiert. Vielen Dank für diesen Hinweis!
ETHproductions
1
Wenn Sie wirklich möchten, dass leere Listen verarbeitet werden, können Sie sie zur Liste der Testfälle hinzufügen. Mir ist gerade aufgefallen, dass meine Lösung für diesen Fall fehlschlägt. Persönlich bin ich kein großer Fan von Problemen, bei denen ein großer Teil der Lösung für die Behandlung von Sonderfällen ist.
Reto Koradi
@RetoKoradi Entschuldigung, ich hatte vergessen, den Fall "leere Liste" aus den Regeln zu entfernen, als ich ihn aus den Beispielen entfernt habe. Danke für die Bemerkung!
ETHproductions

Antworten:

11

Pyth, 46 18 Bytes

ucR2sV+hGGt+GeG.*Q

Dieser Code erwartet Eingaben im Formular iterations, [wave1, wave2, wave3 ...], wie unter dem ersten Link unten zu sehen.

Demonstration. Testgeschirr.

Das Programm wendet den Code in der uFunktion redu ( ) so oft auf die Eingabeliste an, wie es die Anzahl der Iterationen gibt.

Ich werde die Wellenausbreitungsfunktion auf der Liste demonstrieren [0, 1, 2, 3, 4, 5], die in G:

+hGGstellt Gdas erste Element vor G, das sich bildet [0, 0, 1, 2, 3, 4, 5].

t+GeGHängt Gdas letzte Element an Gdas erste Element an und entfernt es [1, 2, 3, 4, 5, 5].

sVfirst bildet Paare aus den Listen, wobei [[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]das letzte Element der ersten Liste abgeschnitten wird. Dann werden die Paare über die sFunktion summiert und ergeben [1, 2, 4, 6, 8, 9].

cR2verwendet die Gleitkommadivision, um alle Zahlen durch 2 zu teilen und das gewünschte Ergebnis zu erhalten [0.5, 1.0, 2.0, 3.0, 4.0, 4.5].

isaacg
quelle
8

Schneemann 1.0.0 , 219 Zeichen

{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

Mit Zeilenumbrüchen für "Lesbarkeit":

{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 Version:

{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

Beispiel-E / A-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]
Türknauf
quelle
2
Das ist schrecklich schön.
kirbyfan64sos
5

Schläger, 164 145 Bytes

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

Beachten Sie, dass Sie möglicherweise die #lang racketZeile benötigen , um dies auszuführen.

Winny
quelle
4

R 109 Bytes

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

Dadurch wird eine unbenannte Funktion erstellt, die einen Vektor und eine Ganzzahl akzeptiert und einen Vektor zurückgibt. Der Ansatz besteht hier darin, die Eingabe als univariate Zeitreihe zu behandeln und ein lineares Faltungsfilter anzuwenden.

Ungolfed + Erklärung:

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

Beispiele:

> 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
Alex A.
quelle
4

Haskell, 76 Zeichen

Der Trick besteht darin, die erste Zahl am Anfang der Liste und die letzte Zahl am Ende der Liste hinzuzufügen, anstatt sich mit den Randbedingungen zu befassen.

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)

Tests:

λ: [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]
Keyran
quelle
1
Sie können mithilfe Infixoperatoren für 2-Argument Funktionen und Wachen statt ein paar Bytes speichern if then else, dh cwird a#n|n<1=a|1<2=iterate f a!!nund swird x!y=(x+y)/2(und heißt ...zipWith(!)(x:a)...).
Nimi
Vielen Dank! Ich wusste nicht, wie Wachen in einzeiligen Ausdrücken funktionieren.
Keyran
Weitere 2 Bytes: macht ceinen Infixoperator, sagen #: a#n|n<1=a|1<2=iterate f a!!n. Nenne es so [0, 0, 1, 0, 0] # 2.
nimi
2

CJam, 23 22 Bytes

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

Probieren Sie es online aus

Die Eingabe erfolgt im CJam-Listenformat, z. B. für das letzte Beispiel:

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

Die Ausgabe ist auch eine CJam-Liste:

[33.0 27.0 40.0 22.0 44.0 22.0 40.0 27.0 33.0]

Der grundlegende Ansatz ist, dass in jedem Schritt der Vektor um eine Position nach links und eine Position nach rechts verschoben wird. Jeder der beiden Vektoren wird mit dem ersten / letzten Element aufgefüllt, und dann wird der Durchschnitt der beiden Vektoren berechnet.

Erläuterung:

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.
Reto Koradi
quelle
Ich bin nicht der OP, aber "Wenn es passiert, dass keine oder eine Elemente in einem sind, oder wenn n 0 oder weniger ist, sollte das Programm das ursprüngliche Array zurückgeben."
Maltysen
2

Java, 181 Bytes

Hier ist die Golfversion:

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

Ich habe versucht, Aufgaben und Bedingungen mit Java so weit wie möglich zu verkürzen. Verbesserungen sind natürlich willkommen.

JackWhiteIII
quelle
2

JavaScript (ES6), 153 132 67 Zeichen

Ich komme 6 Monate später auf meine erste Antwort zurück und was mache ich? Golf zu 50%, das ist was. ;)

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)

Diese Version ruft sich wiederholt auf, bis sie nkleiner als 1 ist, und nwird jedes Mal um 1 verringert .

Eine nicht rekursive Lösung ( 151 130 78 Zeichen):

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

Rekursiv:

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

Nicht rekursiv:

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;
}
ETHproductions
quelle
if(n<2)return b;return s(b,n-1)konnte aufreturn n<2?b:s(b,n-1)
Cyoce
@Cyoce Danke, das habe ich berücksichtigt und dann einige ...
ETHproductions
1

Java, 203 Bytes

Ich versuche meinen ersten Versuch mit Java. Verbesserungsvorschläge sind willkommen :)

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

Schön gedruckt:

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;
}
Geir
quelle
Willkommen bei PPCG! Ich spiele in Java nicht viel Golf, aber können Sie die drei Zuweisungen innerhalb der äußeren forSchleife in die Inkrement-Anweisung der Schleife verschieben? Wie for(i=0;i<n;b[0]=...,b[s-1]=...,a=...,++i)for(...)b[j]=...;? Dann sollten Sie in der Lage sein, die Zahnspangen loszuwerden.
Martin Ender
Leider müssen sie bei jeder Iteration wiederholt werden, so dass sie in den geschweiften Klammern bleiben müssen.
Geir
Das Inkrement wird auch bei jeder Iteration wiederholt, weshalb Sie sie in den dritten Steckplatz einfügen ( ++idurch Kommas anstelle von Semikolons voneinander getrennt ). Versuch es. :)
Martin Ender
Ich verstehe, wohin Sie gehen, aber ich verliere das Update in der letzten Iteration (es sei denn, es gibt einen Trick, den ich nicht kenne). Immer noch in der Lage, ein paar Bytes hier und da durch "hässliche Dinge" zu rasieren :)
Geir
Ich glaube nicht, dass Sie das Update bei der letzten Iteration verlieren. f(a;b;c){d;e;}sollte völlig identisch sein mit f{a;b;}{d;e;c;}und daher auch mit f(a;b;e,c)d;. Mit Ihrem neu arrangierten Code funktioniert dies jedoch nicht mehr, da Sie den Code nicht mehr forin den anderen verschieben forkönnen. Ich denke, all dies spielt keine Rolle mehr. ;)
Martin Ender
1

Python 2, 98 Bytes

Nahm den direkten Ansatz, der verwendet wurde exec, um eine while-Schleife zu verlassen. Ich denke, es gibt eine bessere Möglichkeit, die Logik zur Ermittlung von Sonderfallpositionen anzuwenden, aber dies funktioniert vorerst. Die Eingabe sollte wie folgt formatiert sein [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
Kade
quelle
1

Mathematica, 81 Bytes

Ich habe das Gefühl, es könnte mehr Golf gespielt werden, wenn ich einen besseren Weg finden könnte, mit dem positiven Zustand umzugehen.

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

Erwähnenswert: Mathematica bietet in seinem Spektrum an Listenverarbeitungs- und Filterfunktionen viele potenzielle integrierte Lösungen CellularAutomaton. Ich entschied mich dafür, Nest[... ListConvolve ...]weil dies der einfachste Weg war, die Knicke am Ende der Liste herauszufinden, aber andere Winkel könnten sich als kürzer herausstellen.

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

Beispiele:

>> 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 =
     []
Luis Mendo
quelle
0

Scala, 195 Zeichen (186 bei verzögerter Ausgabe Stream), 187 Zeichen

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

wahrscheinlich nicht optimal, ist die Zuordnung sliding(3)in diesem Fall sehr nützlich.

Tests:

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)
Gilad hoch
quelle
0

q (27 Zeichen)

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

Beispiele

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$()
Skeevey
quelle
0

R 93 Bytes

Als unbenannte Funktion

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}

Erweitert

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
}

Tests

> 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
> 
MickyT
quelle
0

Japt, 39 37 Bytes (nicht konkurrierend)

Diese Antwort ist nicht konkurrierend, da die Sprache neuer ist als die Herausforderung. Ich wollte nur sehen, wie gut meine Golfsprache meiner ersten Herausforderung standhalten kann.

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

Probieren Sie es 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
ETHproductions
quelle
0

C ++ 14, 158 Bytes

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

Erfordert die Eingabe eines Containers value_type==doublewie 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;
}
Karl Napf
quelle
0

Schläger 223 Bytes

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

Testen:

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

Ausgabe:

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