Утворіть трикутник Паскаля


35

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

Для демонстрації ось перші 5 рядів трикутника Паскаля:

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

Змагання

З огляду на введення n (за умови, що це найбільш зручно для обраної вами мови), створіть перші n рядків трикутника Паскаля. Ви можете припустити, що n - це ціле число, включно між 1 і 25. Між кожним рядком і пробілом між кожним числом повинен бути розрив рядка, але окрім цього, ви можете відформатувати його як завгодно.

Це код-гольф , тому найкоротше рішення виграє.

Приклад вводу / виводу

> 1
1
> 9
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1

NB У певному сенсі це спрощена версія розподілу кульок
Пітер Тейлор

@ Peter Olson: Яка ваша думка про тлумачення щурячого чудака "ви можете відформатувати його як завгодно"? Якби я дотримувався його тлумачення, я міг поголити 18 персонажів.
Стівен Румбальський

@StevenRumbalski Він добре. Між кожним рядком є ​​новий рядок, і між кожним номером є пробіл, тому він відповідає критеріям.
Пітер Олсон

@ Петер Олсон: Дякую за роз’яснення. Що з припущення Томаса Т, що n вже визначено?
Стівен Румбальський

4
@Gaffi Мабуть, ні, прийняття відповіді змушує мене відчувати, що я закінчую конкурс і відмовляю від нових і, можливо, кращих відповідей.
Пітер Олсон

Відповіді:


30

J , 12 символів

":@(!{:)\@i.

   i.5
0 1 2 3 4
   {: i.5
4
   (i.5)! {: i.5
1 4 6 4 1
   (! {:) i.5
1 4 6 4 1
   (! {:) \ i.5
1 0 0 0 0
1 1 0 0 0
1 2 1 0 0
1 3 3 1 0
1 4 6 4 1
   ": @ (! {:) \ i.5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
   (": @ (! {:) \ @ i.)` `"
+ ---------------------------------- +
| + - + ------------------------------ + |
|| @ | + ------------------------- + - + ||
|| || + - + --------------------- + | i. |||
|| ||| \ | + ------------------- + || |||
|| ||| || + - + --------------- + ||| |||
|| ||| ||| @ | + - + ---------- + |||| |||
|| ||| ||| || ": | + - + ------ + ||||| |||
|| ||| ||| || || 2 | + - + - + |||||| |||
|| ||| ||| || || ||! | {: ||||||| |||
|| ||| ||| || || | + - + - + |||||| |||
|| ||| ||| || | + - + ------ + ||||| |||
|| ||| ||| | + - + ---------- + |||| |||
|| ||| || + - + --------------- + ||| |||
|| ||| | + ------------------- + || |||
|| || + - + --------------------- + | |||
|| | + ------------------------- + - + ||
| + - + ------------------------------ + |
+ ---------------------------------- +

1
J б'є GolfScript? Цікаво. Я хотів би побачити пояснення цього коду, якщо у вас є час.
Mr.Wizard

4
Він уже розбився, але ось рядок за рядком, якщо ви хочете отримати додаткову англійську мову. Рядок 1 i.5повертає перші п’ять натуралів. У рядку 2 додається {:"Хвіст" (повернення останнім). Рядок 3 поєднує їх із !"Out Of" (кількість комбінацій). Рядок 4 (!{:)i.5той самий. факторинг гака. Отже (!:), це операція, яка перетворює перші n натуралів у n-ту лінію трикутника Паскаля. Рядок 5 застосовується до всіх префіксів (зворотна косою рисою) 0..4, але J заповнює невикористані місця з 0, тому операція поєднується ( @) з операцією форматування рядків ":. Дуже круто J, прихильне.
JB

@JB Ні! означає тут факторіал? Також ми можемо позбутися від @ справа.
дефш

@ArtemIce Monadic !означає фактор ; діадичний !підрахунок комбінацій. Фінал @в ":@(!{:)\@i.якраз є, щоб зробити це самостійним дієсловом.
ефемія

18

Пітон, 56 байт

a=[1];exec"print a;a=map(sum,zip([0]+a,a+[0]));"*input()

Використання зразка:

echo 9 | python filename.py

Виробляє:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]

1
+1 Розумний спосіб використання execуникати forциклу.
Стівен Румбальський


14

Математика: 36 (41?)


Математика має Binomialфункцію, але це позбавляє задоволення від цього. Я пропоную:

NestList[{0,##}+{##,0}&@@#&,{1},n-1]

Рядок вище буде відображати нерівний масив, такий як:

{{1}, {1, 1}, {1, 2, 1}, {1, 3, 3, 1}, {1, 4, 6, 4, 1},
 {1, 5, 10, 10, 5, 1}, {1, 6, 15, 20, 15, 6, 1}}

Оскільки це основний формат у Mathematica, я вважав, що це буде прийнятним, але, коли я читаю правила ще раз, я думаю, що це не може бути. Додавання Grid@дасть однозначно прийнятний вихід для загальної кількості 41 символу:

Grid@NestList[{0,##}+{##,0}&@@#&,{1},n-1]

n = 6:

1                       
1   1                   
1   2   1               
1   3   3   1           
1   4   6   4   1       
1   5   10  10  5   1   
1   6   15  20  15  6   1

14

C, 522

Самодоказ демонстрації відповіді на С. Не можу бути зрозумілішим! Бонусні бали за пошук зайвого персонажа.

#define returns return 0
#define fr for
#define twentyonechexpressis0 0
                                                                                i
                                                                               , x
                                                                              [ 52 ]
                                                                            [ 52] ,j, y
                                                                       ; main (c){fr (;i< c
                                                                    ; i++){ x[i][i]=x[ i][0]= 1
                                                         ; }for(i =2;i<c;i++){for (j=1;j<i;j++){x [i][j] =
                                    1 +x[i][j ]+x[i-1][j-1]+x[i-1] [j]+1-1+1-1+1-1+1-1+1-1+111-11- twentyonechexpressis0 -100-1; }
} ;for(i=0 ;i<c;i++){for(j=0;j<=i;j++){ printf("%3d%c",x[i][j],(1+1+1+1)*(1+1+1+1+1+1+1+1)) ;}putchar(1+1+(1<<1+1)+1+1+1+1+1+111111-111111-1);} /*thiscomment_takes28chars*/ returns; }

4
Я не можу не відчути, що це не вистачає точки коду гольфу. (Я також не можу не зазначити, що зайвий символ знаходиться в положенні \ binom {5} {4}).
Пітер Тейлор

2
Було весело писати. Це взагалі те, для чого я приходжу до кодогольфу.
проходити

1
Розумний:) Отримайте нагороду. Можливо, не кандидат-переможець, а креативний!
Accatyyc

11

Гольфскрипт (21 знак)

~]({0\{.@+\}/;1].p}*;

Оскільки вимагається пояснення:

# Stack contains 'n'
~](
# Stack: [] n
{
    # prev_row is [\binom{i,0} ... \binom{i,i}]
    # We loop to generate almost all of the next row as
    #     [(\binom{i,-1} + \binom{i,0}) ... (\binom{i,i-1} + \binom{i,i})]
    # \binom{i,-1} is, of course, 0
    # Stack: prev_row
    0\
    # Stack: 0 prev_row
    {
        # Stack: ... \binom{i,j-1} \binom{i,j}
        .@+\
        # Stack: ... (\binom{i,j-1} + \binom{i,j}) \binom{i,j}
    }/
    # Stack: \binom{i+1,0} ... \binom{i+1,i} \binom{i,i}
    # unless it's the first time round, when we still have 0
    # so we need to pop and then push a 1 for \binom{i+1,i+1}
    ;1]
    # next_row
    .p
}*
# final_row
;

Ви могли б хотіти спробувати golf.shinh.org/p.rb?pascal+triangle
Nabb

Чи можете ви надати псевдо-код чи пояснення? Я начебто розумію, що відбувається, але я не зовсім розумію свою частину.
Роб

Дякую за детальне пояснення та чудову відповідь (+1), але зараз я ще більше розгублений. Логіка (процес) не відповідає правильності.
Роб

@MikeDtrick, у поясненні виникла незначна помилка. Є також тонкий момент, який потребував пояснення, але який я пропустив, тому що так давно я написав код.
Пітер Тейлор

Гаразд, це починає мати сенс. Моє остаточне запитання: чи працює процес друку та виконання зверху вниз або знизу вгору (1, 1 1, 1 2 1: зверху вниз, 1 2 1, 1 1, 1: знизу вгору)?
Роб

7

Хаскелл, 94 92

f=[1]:[zipWith(+)(0:x)x++[1]|x<-f]
main=readLn>>=mapM_(putStrLn.unwords.map show).(`take`f)

Вихід:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

Версія 71 символу, яка не друкує пробіл між кожним номером:

f=[1]:[zipWith(+)(0:x)x++[1]|x<-f]
main=readLn>>=mapM_ print.(`take`f)

Вихід:

[1]
[1,1]
[1,2,1]
[1,3,3,1]

Можна зберегти персонаж, використовуючи mapMзамість mapM_.
dfeuer

7

Скала, 81 78 72 70 символів

81 знак: перша спроба, безсоромно скопійована з версії Python :)

var x=Seq(1)
for(i<-1 to args(0).toInt){println(x)
x=(0+:x,x:+0).zipped.map(_+_)}

Запустіть його як сценарій, або безпосередньо в REPL.

Скоротіть на 70 знаків із чимось дивовижним і зрозумілим:

Seq.iterate(Seq(1),readInt)(a=>(0+:a,a:+0).zipped.map(_+_))map println

Або 72 70 символів абсолютно іншим методом:

0 to(readInt-1)map(i=>println(0 to i map(1 to i combinations(_)size)))

+ 1 за безсоромне копіювання!
Стівен Румбальський

Останню версію слід обережно використовувати для величезних значень readInt, наприклад 50.;)
невідомо користувачеві

@userunknown, мабуть, тому питання задає верхню межу 25 ...
Луїджі Плінге

Це не означало як критику, а як попередження для допитливих.
користувач невідомий

6

Ruby: 51 49 46 символів

(45 символів код + 1 символ командного рядка)

p=[];$_.to_i.times{n=0;p p.map!{|i|n+n=i}<<1}

Завдяки:

  • jsvnm для пропонування альтернативи для переключення значення (2 символи)
  • ГБ для виявлення невикористаної змінної після попереднього вдосконалення (4 символи)

Проба зразка:

bash-4.4$ ruby -ne 'p=[];$_.to_i.times{n=0;p p.map!{|i|n+n=i}<<1}' <<< 1
[1]

bash-4.4$ ruby -ne 'p=[];$_.to_i.times{n=0;p p.map!{|i|n+n=i}<<1}' <<< 9
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]

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


1
ви можете зберегти 2 символи за допомогоюp.map!{|i|(v=n)+n=i}
jsvnm

Чудовий, @jsvnm! Людина, як довго я поєднувався, щоб скоротити цю частину. Спасибі.
манастирство

1
Можливо, трохи пізно, але: навіщо використовувати змінну v?
ГБ

Хороший улов, @GB! Що залишилося від першої редакції , де… де… до. Де також було якесь марне. Я здогадуюсь, що це відбувається з попередньої спроби при використанні .map. Дякую.
манатура

5

JavaScript ( 90 85 83 81)

for(n=prompt(o=i='');i++<n;o+='\n')for(s=j=1;j<=i;s=s*(i-j)/j++)o+=s+' ';alert(o)

Демонстрація: http://jsfiddle.net/tcRCS/3/

ПРИМІТКА : На практиці не працює близько n> 30, оскільки числа переповнюють вбудований цілий тип даних і стають числами з плаваючою комою.


Редагування 1 : 5 символів вилучені шляхом перетворення whileв forі комбінування заяви

Редагувати 2 : перемістити s=оператор всередину forта зберегти 2 символи

Правка 3 : об'єднайте s=1,j=1ініціалізатор у s=j=1та збережіть 2 символи


Приємно! Ви можете зберегти ще одного символу, змінивши "s = s * ..." на "s * = ..."
Derek Kurth

@DerekKurth: Я думав, що коли я вперше робив оптимізацію, але це зіпсує логіку, оскільки це має бути s*(i-j)/j, а не s*((i-j)/j).
mellamokb

Гм, я спробував це як s * = ... у jsfiddle, і, здавалося, працює. Можливо, я щось зробив не так.
Дерек Курт

1
@DerekKurth: Технічно це одне й те саме, але ідея полягає в тому, що якщо ви помножите на, (i-j)перш ніж ділити на j, то немає необхідності в арифметиці з плаваючою комою, оскільки результати завжди повинні бути цілим числом. Якщо зробити це ((i-j)/j)спочатку, це призведе до десяткових значень, які можуть бути джерелом помилок, і, принаймні, знадобиться додатковий код для округлення / обрізання. Ви не починаєте бачити це, поки не досягнете n>11, і ви побачите десяткові значення у виході, тобто1 11 55 165 330 461.99999999999994 461.99999999999994...
mellamokb

Ах, це має сенс!
Дерек Курт

5

R, 39 символів

R, здається, є дуже правильним інструментом для цього завдання :-)

x=1;for(i in 1:n)x=c(print(x),0)+c(0,x)

3
Вам не вистачає однієї з вимог: "Враховуючи введення n (за умови, що це найбільш зручно для обраної вами мови)"
Стівен Румбальський

@Steven, "Враховуючи вхід n" ... тож чи можу я припустити, що nце дано? Я виправив код. Це зараз добре?
Томаш

Мене просять Пітер Олсон уточнити.
Стівен Румбальський

@StevenRumbalski Я не вважаю, що це дійсно, якщо він не бере вхід. Я не знаю R, тому, можливо, компілятор робить це так, що невизначені змінні вимагають введення, щоб це було нормально, але якщо це як і більшість інших мов у цьому плані, я не думаю, що це так.
Пітер Олсон

1
По суті, під час виконання роботи nнеобхідно поставлятись із зовнішнього джерела, а пристрій для його захоплення включено до вашої програми. Як правило, це означає аргумент командного рядка, або stdin, або файл. Файл майже ніколи не використовується, оскільки він незмінно довший, ніж інші два варіанти.
Стівен Румбальський

5

в Q (25 символів / 20 із коротшою версією)

t:{(x-1) (p:{0+':x,0})\1}

Коротше

t:{(x-1){0+':x,0}\1}

Використання зразка:

q)t 4
1
1 1
1 2 1
1 3 3 1

Або ж 20 символівt:{(x-1){0+':x,0}\1}
скейв

Приємно, коротше, ніж рішення GolfScript зараз.
sinedcm

4

awk - 73 ч

досить просто реалізація:

{for(i=0;i<$1;++i)for(j=i;j>=0;)printf"%d%c",Y[j]+=i?Y[j-1]:1,j--?32:10}

проба запуску:

% awk -f pascal.awk <<<10
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1

4

Perl, 52 , 49 символів

Редагувати: використовуючи sayзамістьprint

map{@_=(1,map$_[$_-1]+$_[$_],1..@_);say"@_"}1..<>

4

Perl, 47 54 символи

$p=1;map{print"@{[split//,$p]}\n";$p*=11}1..<>

Він бере номер з командного рядка, але не виконує перевірок помилок.

Щойно зрозумів, він працює лише до n = 4. Це був якийсь старий код, який я мав на своєму hd.

Це працює, хоча:

map{@a=(1,map$a[$_-1]+=$a[$_],1..@a);print"@a\n"}a..n

n слід вводити в сценарій, або це було б на один символ більше.



3

Perl, 77 Chars

$o[0]=1;for(1..<>){$"=" ";for(1..$_){$n[$_]=$o[$_]+$o[$_-1]}@o=@n;print"@o
"}

Приклад введення

5

Приклад виведення

 1
 1 1
 1 2 1
 1 3 3 1
 1 4 6 4 1

3

C, 132 127 символів

c[25][25],n,i,j;main(){for(scanf("%d",&n);i<n;i++)for(j=0;j<=i;j++)printf("%d%c",c[i][j]=j?c[i-1][j-1]+c[i-1][j]:1,i-j?32:10);}

3

Паскаль: 216 192 символів

(Не справжній конкурент, а лише почесна присутність.)

var p:array[0..1,0..25]of LongInt;i,j,n,u:Word;begin
Read(n);u:=0;for i:=1to n do begin
p[1,1]:=1;for j:=1to i do begin
p[u,j]:=p[1-u,j-1]+p[1-u,j];Write(p[u,j],' ')end;u:=1-u;Writeln
end
end.

Проба зразка:

bash-4.2$ fpc pascal.pas 
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?

bash-4.2$ ./pascal <<< 1
1 

bash-4.2$ ./pascal <<< 9
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
1 6 15 20 15 6 1 
1 7 21 35 35 21 7 1 
1 8 28 56 70 56 28 8 1 

3

MATL , 10 байт

Мова, створена після цього виклику

1iq:"tTTY+

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

1       % Push a 1. This will be the first row
iq:     % Take input n. Generate range [1,2,...,n-1]
"       % For each (that is, repeat n-1 times)
  t     %   Duplicate latest row
  TT    %   Push [1 1]
  Y+    %   Convolve latest row with [1 1] to produce next row
        % Implicitly end for each
        % Implicitly display stack contents

не змагаючись, але святе лихо, жодне з попередніх подань (навіть J) не вдалося зменшити його до того, скільки зробив Матл !!!
грудня

Я впевнений, що Jelly або 05AB1E хоч коротше :-)
Луїс Мендо

2

D 134 128 символів

import std.stdio;void main(){int n,m;int[]l,k=[0,1];readf("%d",&n);foreach(i;0..n){writeln(l=k~0);k=[];foreach(e;l)k~=m+(m=e);}}

вихід для 9 є

>9
[0, 1, 0]
[0, 1, 1, 0]
[0, 1, 2, 1, 0]
[0, 1, 3, 3, 1, 0]
[0, 1, 4, 6, 4, 1, 0]
[0, 1, 5, 10, 10, 5, 1, 0]
[0, 1, 6, 15, 20, 15, 6, 1, 0]
[0, 1, 7, 21, 35, 35, 21, 7, 1, 0]
[0, 1, 8, 28, 56, 70, 56, 28, 8, 1, 0]

повною мірою використовуючи "ви можете відформатувати його як завгодно"; між кожним числом і рядком рядка є пробіл

редагувати репозиціоновані завдання lна гоління деяких символів


2

Скала, 131 персонаж

object P extends App{var x=List(1)
while(x.size<=args(0).toInt){println(x.mkString(" "))
x=(0+:x:+0).sliding(2).map(_.sum).toList}}

Бере введення з командного рядка.

Вихід для n = 10:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1

Що з усіма цими 0:-)?
mellamokb

@mellamokb Трохи перестановки змусили їх піти і скоротили код. :-)
Гарет

2

F♯ - 203 символи

Моя перша спроба в раунді кодового гольфу і перша спроба функціонального програмування. Мабуть, є якийсь очевидний спосіб її скоротити, я ще не зовсім з'ясував. Він відповідає компілятору FS Vs2010s (який запускає #light за замовчуванням на відміну від попередніх версій), а також працює в інтерпретаторі F♯. Приймає введення через stdin. Хочеться, щоб був кращий спосіб введення / виводу! Багато персонажів!

open System
let rec C r m =if r=0||m<=0||m>=r then 1 else C(r-1)m+C(r-1)(m-1)
for j = 0 to Convert.ToInt32(Console.ReadLine ()) do (
 [0..j]|>List.map(C j)|>List.iter(fun k->printf "%i " k)
 printf "\n")

2

Чому на це питання немає прийнятої відповіді?

VBA - 249 символів

Sub t(n)
ReDim a(1 To n,1 To n*2)
a(1,n)=1:y=vbCr:z=" ":d=z & 1 & z & y:For b=2 To n:For c=1 To n*2:x=a(b-1,c)
If c>1 Then a(b,c)=a(b-1,c-1)+x
If c<n*2 Then a(b,c)=a(b-1,c+1)+x
d=IIf(a(b,c)<>0,d & z & a(b,c) & z,d):Next:d=d & y:Next:MsgBox d
End Sub

2

постскрипт - 59 символів (63, якщо рахувати -dn=кількість рядків)

[1]n{dup ==[0 3 2 roll{dup 3 2 roll add exch}forall]}repeat

бігати з

gs -q -dn=10 -dBATCH pascal.ps 

отримати

[1]
[1 1]
[1 2 1]
[1 3 3 1]
[1 4 6 4 1]
[1 5 10 10 5 1]
[1 6 15 20 15 6 1]
[1 7 21 35 35 21 7 1]
[1 8 28 56 70 56 28 8 1]
[1 9 36 84 126 126 84 36 9 1]

2

Математика 35 символів

Ось тупий і ледачий спосіб нарізання трикутника Паскаля:

Table[n~Binomial~k,{n,0,5},{k,0,n}]

(* out *)
{{1}, {1, 1}, {1, 2, 1}, {1, 3, 3, 1}, {1, 4, 6, 4, 1}, {1, 5, 10, 10,5, 1}}

2

APL, 19 15 символів

Трохи запізнився на вечірку, можливо?

{⍪{⍵!⍨⍳⍵+1}¨⍳⍵}

Це не переможе запис J, хоча.

Це передбачає, що початок індексу ( ⎕IO) встановлено на 0. На жаль, з індексним походженням 1нам потрібно 25 18 символів:

{⍪{⍵!⍨0,⍳⍵}¨1-⍨⍳⍵}

У коді є два s, щоб висловити своє розчарування.

Демонстрація:

      {⍪{⍵!⍨⍳⍵+1}¨⍳⍵}5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

Пояснення

Коротка версія:

  • ⍳⍵(з початковим індексом 0) створює масив чисел від 0 до ⍵-1включно, де є правильним аргументом функції.
  • ⍳⍵+1 генерує всі числа від 0 до
  • {⍵!⍨⍳⍵+1}створює вибір kдля кожного елемента kв ⍳⍵+1. Оператор (комутується) поміняє аргументи на функцію навколо, так що аргумент праворуч стає лівим, і навпаки.
  • {⍵!⍨⍳⍵+1}¨⍳⍵передає кожен елемент у ⍳⍵використанні ¨(кожного) оператора. Результат - одновимірний масив, що містить перші ряди трикутника Паскаля.
  • Форма одного аргументу бере одновимірний вектор і робить його стовпцем, а не рядком. Кожен ряд трикутника ставиться по своїй лінії.

Довга відповідь:

  • Практично такий же, як і в іншій версії, за винятком того, що 1-⍨ставиться перед копією початку індексу 0.
  • 0,⍳⍵з індексним початком 1 повторень ⍳⍵+1з індексним початком 0.

2

Клен, 46

seq(print(seq(binomial(i,k),k=0..i)),i=0..n-1)

Використання:

> f:=n->seq(print(seq(binomial(i,k),k=0..i)),i=0..n-1);
> f(3)
    1
   1 1
  1 2 1

2

VBA, 162 142 102 80 байт

Збережено 22 байти завдяки Тейлору Скотту.

Це старе питання зараз, але я побачив коротший варіант для VBA.

[B2].Resize([A1],[A1])="=IF(COLUMN()>ROW(),"""",IF(ROW()=2,1,IFERROR(A1+B1,1)))"

Це призначено для запуску в безпосередньому вікні. Введення знаходиться в комірці A1активного робочого аркуша. Вихід є в активному робочому аркуші, починаючи з B2та використовуючи, проте на основі введених даних потрібно багато комірок. COLUMN()>ROW()Перевірка тримає в правому верхньому куті трикутника заготовки. ROW()=2Перевірка робить перше значення , 1щоб ініціювати трикутник. Я міг би змістити вихід вниз і відпустив цю перевірку, але вона вводить багато сторонніх результатів перед фактичним трикутником, і я не відчував, що це в дусі виклику.

Спочатку я розмістив набагато складніший метод, який розраховував кожне значення, виходячи з його рядка та стовпця. Однак цей метод полягає у використанні внутрішньоклітинних формул. Я починаю з того, B2щоб я міг посилатися на рядок над ним без #REF!помилок. Потім він копіює та вставляє ту саму формулу на блок комірок n завширшки та n заввишки. Вхід і вихід n=25виглядають так:

Вихідні дані


Дуже класна відповідь, але ви можете пограти в це зовсім небагато. Перехід Function p(r)до, Sub p(r)оскільки у вас немає значення вихідного значення функції, видалення пробілу debug.? c(n,k);та перетворення багаторядкового if-then-elseоператора в один рядок ( If k Then c=c(n-1,k-1)*n/k Else c=1) приводить кількість байтів до 130мого рахунку
Тейлор Скотт,

@TaylorScott Дякую! Я досить новачка в гольфі і лише трохи менше новачка в програмах взагалі. Я нарахував 142 через розриви рядків. Із того, що я міг би знайти , це слід вважати.
Інженер Тост

Ах, ти маєш рацію, я забув рахувати свої нові рядки, і як виявляється, принаймні ще один трюк з гольфу For n=0 To...можна зменшити до For n=0To...того, щоб привести мою версію коду до Sub p(r):For n=0To r-1:For k=0To n:Debug.?c(n,k);:Next:Debug.?:Next:End Sub Function c(n,k):If k Then c=1 Else c=c(n-1,k-1)*n/k[char (10)] End Functionз кількістю байтів139
Тейлор Скотт

Другий погляд на це наводить на думку , що якщо розбити його на негайну віконної функцію з допоміжною функцією, ви можете отримати його до 112 байт (Immediate Window Function: For n=0To[A1-1]:For k=0To n:?c(n,k);:Next:?:NextДопоміжна функція: Function c(n,k) If k Then c=c(n-1,k-1)*n/k Else c=1 End Function)
Тейлор Скотт

1
@TaylorScott А як же їх повністю скинути? Зі зміною формули вона працює просто чудово. Я думаю, що вихід, починаючи з B2замість, A1є прийнятним.
Інженер Тост

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