Чередующийся треугольник Паскаля

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-index, но затем, пожалуйста, поймите, что строки сложения и умножения должны быть триггерами, чтобы был сформирован точно такой же треугольник, как указано выше. Пожалуйста, укажите в своем представлении, если вы решите это сделать.
  • Можно предположить, что ввод и вывод соответствуют целочисленному типу вашего языка.
  • Ввод и вывод может быть дан в любом удобном формате .
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Примеры

Показаны два возможных примера вывода из множества: список или строка, разделенная пробелом.

4
[1, 2, 2, 1]

8
"1 4 60 360 360 60 4 1"
AdmBorkBork
источник
2
@totallyhuman Нет, единственное, что нужно выводить на экран, это nстрока th.
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;

Попробуйте онлайн!

Уриэль
источник
248 байт
г-н Xcoder
7

Python 2 , 97 93 86 81 78 байт

-4 байта благодаря Роду. -10 байт благодаря Халварду Хаммелю.

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 индексированные.

Попробуйте онлайн!

totallyhuman
источник
1
Хорошая работа, у меня был (намного) более длинный подход . Хотя я еще не успел поиграть в гольф.
Мистер Xcoder
1
Я думаю, что это map([int.__add__ ,int.__mul__][i%2],[i%2]+a,a+[i%2])должно работать (не проверено)
Род
1
Нет, это рекурсивно. Вы должны включить имя.
г-н Xcoder
5

Желе , 17 12 байт

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

Это полная программа (или нильадная ссылка), которая принимает данные от 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

Попробуйте онлайн!

officialaimm
источник
@totallyhuman Спасибо .. Я откатился назад ...
officialaimm
1
Внезапно exec метод ведет: D
Мертвый Опоссум
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

Mathematica, 92 байта

(s={i=1};While[i<#,s=Flatten@{1,{Tr/@#,Times@@@#}[[i~Mod~2+1]]&@Partition[s,2,1],1};i++];s)&

Попробуйте онлайн! (для работы над математикой «Тр» заменяется на «Тотал»)

J42161217
источник
3

Хаскелл , 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, что приводит к большому количеству шаблонов.

CriminallyVulgar
источник
85 байтов . Я действительно люблю ваше решение с `*`=`+`! довольно умно Остальные мои улучшения - это просто стандартные техники игры в гольф, которые я с удовольствием объясню по вашей просьбе :)
Giuseppe
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.
Zgarb
источник
2

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

-4 байта благодаря Phaeze
-5 байтов благодаря Заку Фарагеру
-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;}

Попробуйте онлайн!

Объяснение:

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, как в предложении @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; И снял скобки с петли, положив все внутрь.
Кевин Круйссен
Большой! Спасибо @KevinCruijssen
Гжегож Пулавски
1

Pyth , 22 байта

Сохраненные тонны байта благодаря @FryAmTheEggman сэкономить ! Начальное решение ниже.

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

Полный набор тестов (0-indexed).

Pyth , 40 38 36 35 байт

Это тоже кажется ваааааааай долгим. Предложения приветствуются.

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

Test Suite или попробуйте онлайн!

Мистер Xcoder
источник
Использование Reduce кажется намного короче . Я не уверен, что это также оптимально, я думаю, что саб 20 является управляемым?
FryAmTheEggman
@FryAmTheEggman Смотрите мою историю изменений. Я сказал, что пытаюсь найти обходной путь с помощью Reduce u(но не могу понять это). Благодарность!
г-н Xcoder
Если бы у Pyth был встроенный prepend-append ...
Mr. Xcoder
1

Mathematica, 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

pizzapants184
источник
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)));
}

Birjolaxew
источник
1
Использование троичной памяти должно сохранить 3 байта: i--?n%2?v*p[i]:v+p[i]
Арно