Черговий трикутник Паскаля


21

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

Починаємо рядок 1просто з одинокою 1. Після цього додавання робиться на непарні рядки, а множення робиться на парні рядки (1-індексується). Виконуючи крок додавання, припустимо, що проміжки поза трикутником заповнені 0s. Виконуючи крок множення, припустимо, що зовні заповнено 1s.

Ось повний трикутник до 7 рядів. *Або +зліва показує , що крок був виконаний для створення цього рядка.

1                1
2 *            1   1
3 +          1   2   1
4 *        1   2   2   1
5 +      1   3   4   3   1
6 *    1   3  12  12   3   1
7 +  1   4  15  24  15   4   1

Виклик

Враховуючи введення n, виведіть перший nрядок цього трикутника.

Правила

  • Ви можете замість цього вибрати 0-індекс, але тоді, будь ласка, усвідомлюйте, що рядки додавання та множення повинні перевертатись, щоб генерувався той самий трикутник, як вище. Будь ласка, вкажіть у своєму поданні, якщо ви вирішите це зробити.
  • Можна вважати, що вхід і вихід відповідають цілому цілому типу вашої мови.
  • Введення та вихід можуть бути задані у будь-якому зручному форматі .
  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Якщо можливо, додайте посилання на онлайн-тестувальне середовище, щоб інші люди могли спробувати ваш код!
  • Стандартні лазівки заборонені.
  • Це тому застосовуються всі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Приклади

Показано два можливі приклади виведення з багатьох: список або розділений пробілом рядок.

4
[1, 2, 2, 1]

8
"1 4 60 360 360 60 4 1"

2
@totallyhuman Ні, єдиним, що потрібно відрізати, повинен бути nth ряд.
AdmBorkBork

Відповіді:


16

Паскаль , 249 247 233 байт

Ну, це змінний трикутник Паскаля .

1 байт збережено завдяки @ Mr.Xcoder

function f(n,k:integer):integer;begin if((k<1)or(k>n)or(n=1))then f:=n mod 2 else if n mod 2=0then f:=f(n-1,k-1)*f(n-1,k)else f:=f(n-1,k-1)+f(n-1,k)end;
procedure g(n:integer);var k:integer;begin for k:=1to n do write(f(n,k),' ')end;

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



7

Пітон 2 , 97 93 86 81 78 байт

-4 байти завдяки Роду. -10 байт завдяки Halvard Hummel.

f=lambda n:n and[[i+j,i*j][n%2]for i,j in zip([n%2]+f(n-1),f(n-1)+[n%2])]or[1]

0-індексований.

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


1
Хороша робота, у мене був (набагато) довший підхід . Хоча я ще не встиг його пограти.
Містер Xcoder

1
Я здогадуюсь, що це map([int.__add__ ,int.__mul__][i%2],[i%2]+a,a+[i%2])повинно спрацювати (не перевірено)
Rod


1
Ні, це рекурсивно. Ви повинні вказати ім’я.
Містер Xcoder


5

Желе , 17 12 байт

µ×+LḂ$?Ḋ1;µ¡

Це повна програма (або niladic посилання), яка приймає дані від STDIN.

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

Як це працює

µ×+LḂ$?Ḋ1;µ¡  Main link. No arguments. Implicit argument: 0

          µ¡  Start a monadic chain and apply the ntimes quick to the previous one.
              This reads an integer n from STDIN and executes the previous chain n
              times, with initial argument 0, returning the last result.
µ             Start a monadic chain. Argument: A (array or 0)
       Ḋ          Dequeue; yield A without its first element.
   LḂ$?           If the length of A is odd:
 ×                    Multiply A and dequeued A.
                  Else:
  +                   Add A and dequeued A.
        1;        Prepend a 1 to the result.

5

Python 2 , 96 89 87 байт

s=a=[1]
for i in range(1,input()):a=s+[[k+l,k*l][i%2]for k,l in zip(a[1:],a)]+s
print a

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



@totallyhuman Спасибо .. Я закотив його назад ...
officialaimm

1
Раптово веде метод exec: D
Dead Possum

1
87 байт , оголошуючи [1].
Містер Xcoder

3

CJam , 25 байт

{1a\{2%!_2$+\{.*}{.+}?}/}

0-індексований.

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

Пояснення

Це анонімний блок, який бере число з стека і залишає результат у стеку.

1a                        Push [1].
  \                       Bring the number to the top.
   {                 }/   For reach number 0 .. arg-1, do:
    2%!                    Push 0 if even, 1 if odd.
       _                   Copy that.
        2$+                Copy the list so far and prepend the 0 or 1 to it.
           \               Bring the 0 or 1 back to the top.
            {.*}{.+}?      If 1, element-wise multiplication. If 0, element-wise addition.

Зачекайте, 2%!якщо натисніть 1, якщо парне і 0, якщо непарне, ні?
Esolanging Fruit


3

Haskell , 76 72 байти

0-індексований розчин:

(p!!)
p=[1]:[zipWith o(e:l)l++[1]|(l,(o,e))<-zip p$cycle[((*),1),((+),0)]]

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

Пояснення

p рекурсивно визначає змінний трикутник, основний корпус / перший його елемент [1]

p=[1]:[                                                            ]

Потім він будує трикутник, взявши попередній рядок ( l). Для того, щоб знати, що з ним робити, нам слід відслідковувати правильний оператор ( o) та відповідний нейтральний елемент ( e):

                           |(l,(o,e))<-zip p$cycle[((*),1),((+),0)]

З цього побудуйте новий рядок, дублюючи рядок, і для однієї копії додаємо нейтральний елемент, застебніть їх оператором і додайте 1:

       zipWith o(e:l)l++[1]

3

R , 108 98 байт

-10 байт, замінивши фактичний знак множення на знак плюс. Пробач мені, будь ласка.

f=function(n){if(n<3)return(rep(1,n))else{v=f(n-1)};if(n%%2)`*`=`+`;return(c(1,v[3:n-2]*v[-1],1))}

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

Досить задоволений загальним методом (вперше я відчув примітиву), але я впевнений, що на ньому ще потрібно зробити гольф, особливо з незручним поводженням із випадками, коли n <3 призводить до безлічі котлів.


85 байт . Я дуже люблю ваше рішення `*`=`+`! досить розумний. Решта моїх удосконалень - це лише стандартні методи в гольфі, які я би радий пояснити на ваш запит :)
Джузеппе

80 байт . Я взяв натхнення з вашої записки про поводження з випадками, колиn<3
Джузеппе

2

Лушпиння , 17 16 байт

!G₅;1¢e*+
:1Sż⁰t

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

1-індексований розчин.

Пояснення

Перший рядок - це основна функція, яка викликає функцію помічника у другому рядку. Зазвичай функція помічника викликається , але в цьому випадку я використовую функцію Husk: переповнення міток : якщо ви посилаєтесь на рядок N у програмі з M <N рядками, ви отримуєте рядок N mod M з функцією модифікатора M / N застосовується до нього. Друга функція модифікатора є flip, тому я використовую для перегортання аргументів допоміжної функції без додаткових витрат на байт.

Ось функція помічника.

:1Sż⁰t  Takes a function f and a list x.
   ż    Zip preserving elements of longer list
    ⁰   using function f
  S  t  x and its tail,
:1      then prepend 1.

Ось основна функція.

!G₅;1¢e*+  Takes a number n.
      e*+  2-element list of the functions * and +
     ¢     repeated infinitely.
 G         Left scan this list
  ₅        using the flipped helper function
   ;1      with initial value [1].
!          Get n'th element.

2

C # (.NET Core) , 143 134 128 байт

-4 байти завдяки Phaeze
-5 байт завдяки Zac Faragher
-6 байтів завдяки Kevin Cruijssen

n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}

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

Пояснення:

n =>
{
    int[] b = { 1 }, c;               // Create first layer
    for(int i = 0, j; ++i < n; b = c) // Iterate for every layer, replace last layer with a new one
        for(c = new int[i+1],         // Create new layer
            c[0] = c[i] = 1,          // First and last elements are always 1
            j = 0;
            ++j < i; )                // Replace every element (besides 1st and last)...
                c[j] = i % 2 == 0 ?
                    b[j - 1] + b[j] : // ... with addition...
                    b[j - 1] * b[j];  // ... or multiplication of two from previous layers
    return b;                         // Return latest layer
};

Ви повинні мати змогу змінити ініціалізацію b масиву на, var b=new[]{1};і компілятор визначить тип масиву для вас.
JustinM

1
Інший спосіб побудови першого шару int[]b={1};- 11 байт проти 20, як 16, або 16, як у пропозиції
@Phaeze

1
@ZacFaragher і Phaeze дякую!
Гжегож Пулавський

1
Я знаю , що це було досить довгий час, але ви можете грати в гольф більше 6 байт: n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}. Я поєднав cтак int[]b={1},c;; скорочено i%2==0до i%2<1; І зняв дужки петлі, поклавши все всередину.
Kevin Cruijssen

Чудово! Дякуємо @KevinCruijssen
Grzegorz Puławski


1

Піт , 22 байти

Збережено тонни байтів завдяки @FryAmTheEggman ! Початкове рішення нижче.

u++1@,+VGtG*VGtGlG1Q[1

Повний тестовий набір (0-індексований).

Піта , 40 38 36 35 байт

Це відчувається ваааааааай занадто розумно довго. Пропозиції вітаються.

K]1VStQ=K++]1m@,sd*hded%N2C,KtK]1;K

Тестовий сюїт або спробуйте в Інтернеті!


Використання скорочення здається значно коротшим . Я також не впевнений, що це оптимально, я вважаю, що під 20 можна керувати?
FryAmTheEggman

@FryAmTheEggman Дивіться мою історію редагування. Я сказав, що намагаюся знайти вирішення проблеми із зменшенням u(але не змогли це зрозуміти). Спасибі!
Містер Xcoder

Якщо Pyth мав би вбудований додаток із додаванням ...
Містер Xcoder



1

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

Fold[#2@@@Partition[#,2,1,{-1,1},{}]&,{1},PadRight[{},#,{1##&,Plus}]]&

Спробуйте це в пісочниці Wolfram ! На жаль, це не працює в математиці. Він 0-індексований.

Пояснення: Partition[#,2,1,{-1,1},{}]бере список і повертає всі двоелементні списки, а також списки 1-го елемента для початку та кінця - наприклад, {1,2,3,4}стає {{1}, {1,2}, {2,3}, {3,4}, {4}}. PadRight[{},#,{1##&,Plus}]складає змінний перелік 1##&(ефективно Times) і Plus, довжина якого - вхідне число. Потім Foldнеодноразово застосовує функцію розділення з застосованими до неї Pluses і Timeses, щоб скласти рядки трикутника.




0

TI-Basic (TI-84 Plus CE), 100 байт

Prompt X
{1→M
For(A,2,X
LM→L
A→dim(M
For(B,2,A–1
If A/2=int(A/2
Then
LL(B–1)LL(B→LM(B
Else
LL(B–1)+LL(B→LM(B
End
End
1→LM(dim(LM
End
LM

1-індексований, запитує користувача на введення та друкує список, що містить nтретій рядок чергування трикутника Паскаля.

Під час циклу: L M - поточний рядок, а L L - попередній рядок.

TI-Basic - це токенізована мова . Усі використовувані тут жетони є однобайтовими.

Я думаю, що я можу далі пограти в гольф, змінивши М на місці з кінця.

Пояснення:

Prompt X            # 3 bytes; get user input, store in X
{1→M                # 5 bytes, store the first row into LM
For(A,2,X           # 7 bytes, Loop X-1 times, with A as the counter, starting at 2
LM→L                # 5 bytes, copy list M into list L
A→dim(M             # 5 bytes, extend M by one
For(B,2,A–1         # 9 bytes, for each index B that isn't the first or last...
If A/2=int(A/2      # 10 bytes,    if A is even...
Then                # 2 bytes,     then...
LL(B–1)LL(B→LM(B     # 17 bytes,        the Bth item in this row is the Bth times the (B-1)th of the previous row
Else                # 2 bytes,     else...
LL(B–1)+LL(B→LM(B    # 18 bytes,        the Bth item in this row is the Bth plus the (B-1)th of the previous row
End                 # 2 bytes,     endif
End                 # 2 bytes,  endfor
1→LM(dim(LM         # 9 bytes, the last item is always 1
End                 # 2 bytes, endfor
LM                  # 2 bytes, Implicitly print the final row


0

JavaScript (ES6), 71 69 66 байт

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

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

0-індексований.
-3 байти від @Arnauld

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

for (var i = 0; i < 10; ++i) {
  console.log(JSON.stringify(f(i)));
}


1
Використовуючи термінал, слід зберегти 3 байти:i--?n%2?v*p[i]:v+p[i]
Арнольд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.