Обчислення хвиль


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
Якщо ви дійсно хочете, щоб він обробляв порожні списки, ви можете додати його до списку тестових випадків. Я щойно помітив, що моє рішення не вдається для цього випадку. Особисто я не є великим прихильником проблем, коли значна частина рішення стосується вирішення особливих справ.
Рето Коради

@RetoKoradi Вибачте, я забув видалити випадок "порожній список" із правил, коли видаляв його з прикладів. Дякуємо за повідомлення!
ETHproductions

Відповіді:


11

Pyth, 46 18 байт

ucR2sV+hGGt+GeG.*Q

Цей код очікує введення форми iterations, [wave1, wave2, wave3 ...], як це видно на першому посиланні нижче.

Демонстрація. Тестовий джгут.

Програма працює, застосувавши код у межах функції зменшення ( u) до списку введення стільки ж разів, скільки кількість ітерацій.

Я продемонструю функцію поширення хвилі у списку [0, 1, 2, 3, 4, 5], який знаходиться у G:

+hGGGпершим елементом претендує на Gформування [0, 0, 1, 2, 3, 4, 5].

t+GeGдодає Gостанній елемент до 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

Сніговик 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

За допомогою рядків для "читабельності":

{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

Формат зразка вводу / виводу:

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

Ракетка, 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))))

Безумовно

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

Це створює неназвану функцію, яка приймає вектор і ціле число і повертає вектор. Підхід тут полягає в тому, щоб розглядати вхід як одномірний часовий ряд і застосовувати фільтр лінійної згортки.

Недоліки + пояснення:

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

Хаскелл, 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)...).
німі

Спасибі! Не знав, як працюють охоронці в однорядних виразах.
Кейран

Ще 2 байта: зробити cінфіксне оператор, скажімо #: a#n|n<1=a|1<2=iterate f a!!n. Називай це так [0, 0, 1, 0, 0] # 2.
німі

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.

Я не є оператором, але "Якщо у a стане один нуль або один елемент, або якщо n дорівнює 0 або менше, програма повинна повернути початковий масив."
Maltysen,

2

Java, 181 байт

Ось версія для гольфу:

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

Безголівки:

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

Недоладжений: (застарілий)

Рекурсивна:

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

Нерекурсивні:

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]=...;? Тоді ви повинні мати можливість позбутися брекетів.
Мартін Ендер

На жаль, їх доводиться повторювати на кожній ітерації, тому їм доводиться залишатися всередині брекетів.
Гейр

Приріст також повторюється кожною ітерацією, саме тому ви розміщуєте їх у третьому слоті (відокремленому від ++iта один одного комами, а не крапками з комою). Спробуй. :)
Мартін Ендер

Я бачу, куди ви їдете, але я втрачаю оновлення під час остаточної ітерації (якщо тільки немає хитрості, яку я не знаю). І все-таки зможете поголити кілька байтів тут і там, роблячи "потворні речі" :)
Geir

Я не думаю, що ви втрачаєте оновлення під час остаточної ітерації. f(a;b;c){d;e;}має бути повністю ідентичним f{a;b;}{d;e;c;}, а отже, і цьому f(a;b;e,c)d;. Однак із переставленим кодом він більше не працює, тому що ви не можете перемістити forвсередину інший for, тому, мабуть, усе це вже не має значення. ;)
Мартін Ендер

1

Пітон 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

Безголівки:

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

Математика, 81 байт

У мене є відчуття, що це може бути більше гольфу, якби я міг знайти кращий спосіб впоратися з умовою позитивності.

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

Варто зауважити: Mathematica пропонує безліч потенційних вбудованих рішень у своєму спектрі функцій обробки списків та фільтрів, а також CellularAutomaton. Я вибрав, Nest[... ListConvolve ...]тому що це був найпростіший спосіб опрацювати перегини в кінці списку, але інші кути можуть виявитись коротшими.


0

Матлаб, 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

Япт, 39 37 байт (неконкурентоспроможний)

Ця відповідь є неконкурентоспроможною, оскільки мова є новішою, ніж виклик. Мені просто хотілося побачити, наскільки добре моя мова з гольфу може відповідати моєму першому виклику.

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==double, якvector<double> .

Безголівки:

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

Безголівки:

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.