Трикутник Зейделя


14

Трикутник Зейделя - це математична конструкція, схожа на трикутник Паскаля, і відома тим, що пов’язана з номерами Бернуллі.

Перші рядки:

      1
      1  1
   2  2  1
   2  4  5  5
16 16 14 10 5
16 32 46 56 61 61

Кожен рядок формується наступним чином:

Якщо номер рядка парний (1-індексований):

  • Зніміть перший пункт попереднього рядка

  • Кожен наступний елемент - це сума попереднього елемента та елемента над ним

  • Скопіюйте останній елемент

Якщо номер рядка непарний:

  • Знесіть останній елемент попереднього рядка

  • Якщо повернутись назад , кожен елемент - це сума попереднього пункту та предмета над ним

  • Скопіюйте те, що зараз є першим пунктом.

В основному ми побудуємо трикутник за зигзагоподібною схемою:

    1
    v
    1 > 1
        v
2 < 2 < 1
v
2 > 4 > 5 > 5

Для отримання додаткової інформації дивіться сторінку Вікіпедії за номерами Бернуллі.

Змагання:

Дано n, або як аргумент функції, або з STDIN, надрукуйте або поверніть або nтретій рядок трикутника Сейделя або перші nрядки. Ви можете використовувати індексацію 0 або 1.

Вам не потрібно обробляти негативний чи не цілий вхід (ні 0, якщо 1-індексований). Вам не доведеться обробляти виходи, більші за2147483647 = 2^31 - 1

Оскільки це код-гольф, зробіть це в якомога менше байтах.

Приклади:

У цих прикладах значенням повернення є nth-й ряд, 0-індексований.

Input   ->  Output

0           1
1           1 1
2           2 2 1
6           272 272 256 224 178 122 61
13          22368256 44736512 66750976 88057856 108311296 127181312 144361456 159575936 172585936 183194912 191252686 196658216 199360981 199360981

"Вам не доведеться обробляти виходи, більші за типовий тип int за замовчуванням для вашої мови", робить це дрібницею для мов, які мають лише 1-бітні вставки
лише ASCII

Чи можна виводити рядки завжди відсортованими від малих до великих?
Ангс

@ ASCII Тільки змінено, щоб відповідати максимальному
інту

@Angs Ні, рядки слід впорядкувати так, як показано
Bolce Bussiere

@ Тільки ASCII Це лазівка ​​за замовчуванням (хоча IMO це трохи погано сформульовано, оскільки це залежить від того, що люди вважають би "розумним")
user202729

Відповіді:


7

Мозок-Флак , 66 байт

<>(())<>{({}[()]<(()[{}]<<>{(({}<>{}))<>}>)>)}{}{{}<>{({}<>)<>}}<>

Спробуйте в Інтернеті!

Рядок є 0-індексованим.

# Push 1 (the contents of row 0) on other stack; use implicit zero as parity of current row
<>(())<>

# Do a number of times equal to input:
{({}[()]<

  # Subtract the row parity from 1
  (()[{}]<

    # For each entry in old row:
    <>{

      # Add to previous entry in new row and push twice
      (({}<>{}))<>

    }

  >)

>)}{}

# If row parity is odd:
{{}

  # Reverse stack for output
  <>{({}<>)<>}

# Switch stacks for output
}<>

4

JavaScript (SpiderMonkey) , 67 байт

Цей код зловживає sort()методом і працює не на всіх двигунах.

Рядки індексовані 0.

f=(n,a=[1],r)=>n--?f(n,[...a.map(n=>k+=n,k=0),k].sort(_=>n|r),!r):a

Спробуйте в Інтернеті!

Як?

Ми умовно повертаємо масив, використовуючи sort()метод з функцією зворотного виклику, який ігнорує його параметри і повертає або 0, або додатне ціле число. Не спробуйте цього вдома! Це надійно працює лише на SpiderMonkey.

let A = [1,2,3,4,5] and B = [1,2,3,4,5,6,7,8,9,10,11]

             | SpiderMonkey (Firefox)  | V8 (Chrome)             | Chakra (Edge)
-------------+-------------------------+-------------------------+------------------------
A.sort(_=>0) | 1,2,3,4,5               | 1,2,3,4,5               | 1,2,3,4,5
A.sort(_=>1) | 5,4,3,2,1               | 5,4,3,2,1               | 1,2,3,4,5
B.sort(_=>0) | 1,2,3,4,5,6,7,8,9,10,11 | 6,1,3,4,5,2,7,8,9,10,11 | 1,2,3,4,5,6,7,8,9,10,11
B.sort(_=>1) | 11,10,9,8,7,6,5,4,3,2,1 | 6,11,1,10,9,8,7,2,5,4,3 | 1,2,3,4,5,6,7,8,9,10,11

Зауважте, що V8, ймовірно, використовує різні алгоритми сортування залежно від довжини масиву (менше або більше 10 елементів).

Прокоментував

f = (                     // f = recursive function taking:
  n,                      //   n   = row counter
  a = [1],                //   a[] = current row, initialized to [1]
  r                       //   r   = 'reverse' flag, initially undefined
) =>                      //
  n-- ?                   // decrement n; if it was not equal to zero:
    f(                    //   do a recursive call with:
      n,                  //     - the updated value of n
      [ ...a.map(n =>     //     - a new array:
          k += n, k = 0   //       - made of the cumulative sum of a[]
        ), k              //         with the last value appended twice
      ].sort(_ => n | r), //       - reversed if n is not equal to 0 or r is set
      !r                  //     - the updated flag r
    )                     //   end of recursive call
  :                       // else:
    a                     //   stop recursion and return a[]

Яку специфічну особливість павук-мавпа використовує?
Пуховик

@Downgoat Користуючись перевагою конкретної реалізації sort()цього двигуна. Я додав пояснення.
Арнольд


3

Haskell , 89 87 82 байт

(cycle[r,id]!!)<*>s
r=reverse
s 0=[1]
s n=let a=zipWith(+)(0:a)$(r.s$n-1)++[0]in a

Просто sдрукує рядки в порядку зигзагу, анонімна функція в першому рядку повертає половину рядків.

Дякуємо @nimi за збереження 5 байт!

Спробуйте в Інтернеті!




2

Джулія 0,6 , 85 байт

r(l,n=cumsum(l))=[n...,n[end]]
w=reverse
f(n)=n<2?[1]:n%2<1?r(f(n-1)):w(r(w(f(n-1))))

Спробуйте в Інтернеті!

Це рекурсивне рішення в Джулії. Зауважте, що він має 1-бальну індексацію. Звідси випробування.

Необоротна версія, щоб зрозуміти логіку:

function new_row(last_row)
    new_row = cumsum(last_row)
    push!(new_row, new_row[end])
    return new_row
end


function triangle(n)
    if n == 1
        return [1]
    elseif mod(n,2) == 0
        return new_row(triangle(n-1))
    else
        return reverse(new_row(reverse(triangle(n-1))))
    end
end

Asa bonus, ось нерекурсивна версія, але це довше:

w=reverse;c=cumsum
r(l,i)=i%2<1?c([l...,0]):w(c(w([0,l...])))
f(n,l=[1])=(for i=2:n l=r(l,i)end;l)


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