Pascal'ın üçgenini oluştur


35

Pascal üçgeni ilk satırda 1 ile başlayarak üretilir. Sonraki satırlarda, sayı doğrudan üstündeki iki sayının sola ve sağa toplanmasıyla belirlenir.

Göstermek için, işte Pascal'ın üçgeninin ilk 5 sırası:

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

Meydan okuma

Bir girdi n verildiğinde (ancak, seçtiğiniz dilde en uygun olanı), Pascal üçgeninin ilk n satırını oluşturun . N'nin 1 ile 25 arasında bir tam sayı olduğunu varsayabilirsiniz. Her satır ile her sayı arasında bir boşluk olmalıdır, bunun dışında istediğiniz şekilde biçimlendirmeniz gerekir.

Bu kod golf , bu yüzden en kısa çözüm kazanır.

Örnek G / Ç

> 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 Bir anlamda, bu topları dağıtma
Peter Taylor

@Peter Olson: Cırcır ucubesinin "istediğiniz gibi biçimlendirebilirsin" yorumunu ne düşünüyorsunuz? Onun yorumunu takip edersem, 18 karakteri tıraş edebilirim.
Steven Rumbalski,

@StevenRumbalski O iyi. Her satır arasında yeni bir satır var ve her sayı arasında bir boşluk var, bu yüzden kriterleri karşılıyor.
Peter Olson

@Peter Olson: Açıklama için teşekkürler. Tomas T'nin n'nin zaten tanımlanmış olduğu varsayımına ne dersiniz?
Steven Rumbalski,

4
@Gaffi Muhtemelen hayır, bir cevabı kabul etmek yarışmaya son verdiğimi ve yeni ve muhtemelen daha iyi cevapları caydırdığımı hissettiriyor.
Peter Olson,

Yanıtlar:


30

J , 12 karakter

":@(!{:)\@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 |||
|| ||| \ | + ------------------- + || |||
|| ||| || + - + --------------- + ||| |||
|| ||| ||| @ | + - + ---------- + |||| |||
|| ||| ||| || ": | + - + ------ + ||||| |||
|| ||| ||| || || 2 | + - + - + |||||| |||
|| ||| ||| || || || | {:! ||||||| |||
|| ||| ||| || || | + - + - + |||||| |||
|| ||| ||| || | + - + ------ + ||||| |||
|| ||| ||| | + - + ---------- + |||| |||
|| ||| || + - + --------------- + ||| |||
|| ||| | + ------------------- + || |||
|| || + - + --------------------- + | |||
|| | + ------------------------- + - + ||
| + - + ------------------------------ + |
+ ---------------------------------- +

1
J GolfScript'i yener mi? İlginç. Vaktiniz varsa, bu kod için bir açıklama görmek istiyorum.
Sihirbaz

4
Şimdiden ayrıldı, ancak ek ingilizce istiyorsanız, satır satır sıra. Satır 1 i.5ilk beş doğalları döndürür. Satır 2 {:"Kuyruk" ekler (sonuncu dönüş). Satır 3 onları !"Out Of" (kombinasyon sayısı) ile birleştirir. Satır 4 (!{:)i.5aynıdır. kancayı çarpanlara ayırma. Öyleyse (!:), ilk n doğalları Pascal üçgeninin inci çizgisine dönüştüren bir işlem . Satır 5, 0,4 olan tüm Öneklere (ters eğik çizgi) uygulanır, ancak J kullanılmayan noktaları 0 ile doldurur, böylece işlem @dizgi biçimlendirme işlemiyle birleştirilir ( )": . Çok havalı olan J.
JB

@JB değil! burada faktoring demektir? Ayrıca sağdaki @ kurtulabiliriz.
12’de

@Artemce Monadic faktoring !anlamına gelir; ikili !, kombinasyonları sayar. Nihai @içinde ":@(!{:)\@i.bu tek başına bir fiil için sadece var.
efemient

18

Python, 56 Bayt

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

Örnek kullanım:

echo 9 | python filename.py

üretir:

[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 Kullanmanın akıllı yolu execbir fordöngüden kaçının .
Steven Rumbalski

15

Python, 94 91 88 70 63 karakter

x=[1]
for i in input()*x:
 print x
 x=map(sum,zip([0]+x,x+[0]))

14

Mathematica: 36 (41?)


Mathematica'nın bir Binomialişlevi var, ama bu eğlenceyi ortadan kaldırıyor. Öneriyorum:

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

Yukarıdaki satır aşağıdaki gibi düzensiz bir dizi oluşturacaktır:

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

Bu, Mathematica'da temel bir format olduğu için kabul edilebilir olacağını düşündüm, ancak kuralları tekrar okuduğumda, olmayabileceğini düşünüyorum. Ekleme Grid@, toplamda 41 olmak üzere kesin olarak kabul edilebilir bir çıktı üretecektir. karakter :

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

Kendini gösteren bir C cevap. Daha net olamazdı! Ekstra karakteri bulmak için bonus puan.

#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
Yardım edemem ama bunun kod golf noktasını özlediğini hissediyorum. (Ayrıca, fazladan karakterin \ binom {5} {4} konumunda olduğunu belirtmekte de yardımcı olamam).
Peter Taylor,

2
Yazmak eğlenceliydi. Genelde bunun için codegolf'a geldim.
Walpen

1
Zeki :) Belki kazanan bir aday değil, yaratıcı bir aday!
Accatyyc

11

Golfscript (21 karakter)

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

Bir açıklama istendiğinden:

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


Lütfen biraz sözde kod veya açıklama verebilir misiniz? Neler olup bittiğini anlıyorum ama değiş tokuş eden kısmı tamamen anlamıyorum.
Rob,

Ayrıntılı açıklama ve mükemmel cevap için teşekkür ederiz (+1), ama şimdi daha da kafam karıştı. Mantık (süreç) doğru oturmuyor.
Rob,

@MikeDtrick, açıklamada küçük bir hata oluştu. Ayrıca açıklanması gereken, ama kodunu yazdığımdan bu yana çok uzun sürdüğü için kaçırdığım ince bir nokta var.
Peter Taylor

Tamam, mantıklı olmaya başladı. Son sorum şu; baskı ve yürütme işlemi yukarıdan aşağıya veya aşağıdan yukarıya doğru işler mi (1, 1 1, 1 2 1: yukarıdan aşağıya, 1 2 1, 1 1, 1: aşağıdan yukarıya)?
Rob

7

Haskell, 94 92

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

Çıktı:

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

Her numara arasında boşluk bırakmayan 71 karakterlik bir sürüm:

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

Çıktı:

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

Bunun mapMyerine karakter kullanarak kaydedebilirsiniz mapM_.
dfeuer

7

Scala, 81 78 72 70 karakter

81 karakter: ilk deneme, utanmadan Python versiyonundan kopyalandı :)

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

Bir komut dosyası olarak veya doğrudan REPL'de çalıştırın.

Şaşırtıcı derecede okunabilir ve deyimsel bir şeyle 70 karaktere kesin:

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

Veya tamamen farklı bir yöntemle 72 70 karakter:

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

Utanmaz kopyalar için + 1!
Steven Rumbalski,

Son sürüm, readInt'ın büyük değerleri için dikkatli bir şekilde kullanılmalıdır, 50 gibi;;)
kullanıcı bilinmeyen

@ userunknown muhtemelen bu yüzden soru 25 'in üst sınırını
belirliyor

Meraklı için bir uyarı olarak, eleştirel olarak değildi.
kullanıcı bilinmeyen

6

Yakut: 51 49 46 karakter

(45 karakter kodu + 1 karakter komut satırı seçeneği)

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

Sayesinde:

  • Değer değiştirme için bir alternatif önermek için jsvnm (2 karakter)
  • Önceki iyileştirmeden sonra kullanılmayan bir değişkeni bulmak için GB (4 karakter)

Örnek çalışma:

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]

Çevrimiçi deneyin!


1
2 karakter ile tasarruf edebilirsinizp.map!{|i|(v=n)+n=i}
jsvnm

Harika, @jsvnm! Dostum, bu kısmı kısaltmak için ne kadar süre bir araya geldim. Teşekkürler.
Manat çalışması

1
Belki biraz geç, ama: v değişkenini neden kullanıyorsunuz?
GB

İyi yakalama, @GB! Bu, 1. revizyondan geride kaldı , nerede… nerede… Nerede de bir işe yaramazdı. Sanırım kullanıldığında daha önceki bir denemeden geliyor .map. Teşekkür ederim.
Manat çalışması

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)

Gösteri: http://jsfiddle.net/tcRCS/3/

NOT : N> 30 için pratikte iyi çalışmaz, çünkü sayılar yerleşik tam sayı veri türünden taşar ve kayan noktalı sayılar haline gelir.


Düzenleme 1 : dönüştürerek 5 karakter çıkarıldı whileiçin fortablolar ve birleştirme

Düzenleme 2 : s=deyimi içeri fortaşı ve 2 karakter kaydet

Düzenleme 3 : s=1,j=1başlatıcıyı birleştirin s=j=1ve 2 karakter kaydedin


Güzel! "S = s * ..." olarak "s * = ..." olarak değiştirerek bir karakter daha kazanabilirsiniz
Derek Kurth

@DerekKurth: düşündüğümden olduğunu ben ilk optimizasyonlar yapıyorum ama ne zaman mantığı kadar her şeyi arap saçına olması gerektiğinden bu s*(i-j)/jdeğil s*((i-j)/j).
mellamokb

Hmm, jsfiddle'da s * = ... olarak denedim ve işe yaradı. Belki de yanlış bir şey yaptım.
Derek Kurth

1
@DerekKurth: Teknik olarak aynı, ancak fikir şu ki , (i-j)bölmeden önce çoğalırsanız j, o zaman kayan nokta aritmetiğine gerek kalmaz çünkü sonuçlar her zaman tam sayı olmalıdır. ((i-j)/j)Önce yaparsanız , bu bir hata kaynağı olabilecek ondalık değerlerle sonuçlanır ve en azından yuvarlama / kesme için ekstra kod gerekir. Bunu elde edene kadar bunu görmeye başlamazsınız n>11ve çıktıda ondalık değerler görürsünüz, yani1 11 55 165 330 461.99999999999994 461.99999999999994...
mellamokb

Ah, bu mantıklı!
Derek Kurth

5

R, 39 karakter

R bu görev için doğru araç gibi görünüyor :-)

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

3
Gereksinimlerden birini özlüyorsunuz: "Girdi n (verilen dilde en uygun
olanıysa

@Steven, "Girdi n verildiğinde" ... nverildiğini varsayabilir miyim ? Kodu düzelttim. Bu şimdi iyi mi?
Tomas

Peter Olson'dan netleşmesini rica ediyorum.
Steven Rumbalski

@StevenRumbalski Girdi almadığı sürece bunun geçerli olduğunu sanmıyorum. R'yi bilmiyorum, bu yüzden belki derleyici bunu tanımsız değişkenlerin bir girdi istemesi için yapar, bu yüzden sorun olabilir, ancak bu konuda diğer dillerin çoğu gibi ise, sanmıyorum.
Peter Olson

1
Temel olarak, nçalışma zamanında harici bir kaynaktan temin edilmeli ve onu yakalamak için cihaz programınıza dahil edilmelidir. Genelde, bu komut satırı argümanı, veya stdin veya dosya anlamına gelir. Dosyaya göre neredeyse hiç kullanılmaz çünkü diğer iki seçenekten daha uzun sürmez.
Steven Rumbalski

5

S (25 karakter / 20 kısa versiyonlu)

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

Daha kısa

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

Örnek kullanım:

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

Veya alternatif olarak, 20 karaktert:{(x-1){0+':x,0}\1}
35'te skeevey

Güzel, şimdi GolfScript çözümünden daha kısa.
sinedcm

4

awk - 73 karakter

oldukça basit uygulama:

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

örnek çalışma:

% 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 karakter

Düzenleme: sayyerineprint

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

4

Perl, 47 54 karakter

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

Komut satırından bir sayı alır, ancak hata kontrolleri yapmaz.

Sadece n = 4'e kadar çalıştığını fark ettim. Benim hd üzerinde sahip olduğum eski bir koddu.

Bu olsa çalışır:

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

n komut dosyasına girdi olmak zorunda, yoksa bir karakterden daha fazla olurdu.



3

Perl, 77 Karakter

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

Örnek giriş

5

Örnek çıktı

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

3

C, 132 127 karakter

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

Pascal: 216 192 karakter

(Gerçek bir rakip değil, sadece onurlu bir varlık.)

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.

Örnek çalışma:

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 bayt

Bu mücadeleden sonra oluşturulan dil

1iq:"tTTY+

Çevrimiçi deneyin!

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

rekabet etmeyen ancak kutsal bir felaket, önceki gönderilerden hiçbiri (hatta J) Matl'in ne kadarını azaltmayı başaramadı !!!
Abr001,

Jelly ya da 05AB1E'nin :-) daha kısa olacağından eminim
Luis Mendo

2

D 134 128 karakter

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 için çıktı

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

tam olarak yararlanarak "dilediğiniz şekilde biçimlendirebilirsiniz"; Her sayı ve bir satır sonu arasında boşluk var

değiştir lbazı karakterlerin traş edilmesine yapılan atama


2

Scala, 131 karakter

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

Girişi komut satırından alır.

N = 10 için çıktı:

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

Bunların nesi var 0:-)?
mellamokb

@mellamokb Yeniden düzenleme biti onları uzaklaştırdı ve kodu kısaltdı. :-)
Gareth

2

F♯ - 203 karakter

İlk olarak bir golf turunda ilk denemem ve ilk olarak fonksiyonel programlamaya başladım. Muhtemelen, henüz tam olarak çözemediğim kısaltmanın açık bir yolu var. VS2010'un F♯ derleyicisine (önceki sürümlerden farklı olarak varsayılan olarak #light'ı çalıştırma etkisi olan) uygundur ve ayrıca F♯ yorumlayıcısında da çalışır. Stdin ile girişi kabul eder. Keşke girdi / çıktı için daha iyi bir yol olsaydı! Bir sürü karakter!

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

Neden bu soruya kabul edilmiş bir cevap yok?

VBA - 249 karakter

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

postscript - 59 karakter ( -dn=satır sayısını bulmak için sayılırsanız 63 )

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

koşmak

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

almak

[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

Mathematica 35 karakter

İşte Pascal üçgenini kesmenin donuk ve tembel yolu:

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 karakter

Belki partiye biraz geç kaldın?

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

Yine de J girişini geçmiyor.

Bu, indeks orijininin ( ⎕IO) ayarlandığını varsayar 0. Ne yazık ki, bir dizin kökenli, 25 18 karaktere 1ihtiyacımız var :

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

Hayal kırıklığımı ifade etmek için kodda iki tane var .

Demo:

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

açıklamalar

Kısa versiyon:

  • ⍳⍵(0 dizin kökeni ile), 0'dan ⍵-1kapsayıcıya kadar sayılardan oluşan bir dizi üretir , burada işlev için doğru argümandır.
  • ⍳⍵+1 0'dan tüm sayıları oluşturur
  • {⍵!⍨⍳⍵+1}üretir seçim kher eleman için kde ⍳⍵+1. (Gidip gelme), operatörün sağ argüman tersi sol ve yardımcısı olur, öyle ki, yaklaşık bir fonksiyona bağımsız değişkenler değiştirir.
  • {⍵!⍨⍳⍵+1}¨⍳⍵(her) operatörünü ⍳⍵kullanarak her bir öğeyi ¨iletir. Sonuç, ilkini içeren tek boyutlu bir dizidir. Pascal Üçgeni'nin satırlarını .
  • Bir argüman formu tek boyutlu bir vektör alır ve onu bir satırdan ziyade bir sütun haline getirir. Üçgenin her satırı kendi satırına konur.

Uzun cevap:

  • Neredeyse diğer sürümle aynı, bunun dışında 1-⍨ , 0 dizininin bir kopyasını çoğaltmak için
  • 0,⍳⍵1 ⍳⍵+1dizin kökeni olan 0 dizin kökeni ile yinelenir.

2

Akçaağaç, 46

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

Kullanımı:

> 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 bayt

Taylor Scott sayesinde 22 byte kurtarıldı.

Bu şimdi eski bir soru ama VBA için daha kısa bir çözüm gördüm.

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

Bu hemen pencerede çalıştırılmak içindir. Giriş, A1aktif çalışma sayfasının hücresinde . Çıktı, aktif çalışma sayfasında başlar B2ve kullanılır ancak girdi bazında birçok hücre gerekir. COLUMN()>ROW()Çek üçgen boş üst saklı tutar. ROW()=2Çek ilk değeri yapar 1üçgen başlatmak için. Çıkışı düşürebilir ve bu çekimi düşürebilirdim, ancak gerçek üçgenden önce çok fazla dışsal çıktı ortaya çıkardı ve bunun zorunluluk ruhu içinde olduğunu hissetmedim.

Başlangıçta satır ve sütununa göre her değeri hesaplayan çok daha karmaşık bir yöntem yayınladım. Tüm bu yöntem olsa da, hücre içi formülleri kullanmaktır. Baştan başladım, B2böylece yukarıdaki satıra #REF!hatasız başvurabilirim . Daha sonra, hücreler, bir blok üzerine bu kopyalar ve aynı formül n genişliğinde ve n, uzun. Giriş ve çıkış n=25şöyle görünür:

Çıktı


Çok güzel cevap, ama bu biraz golf oynayabilirsiniz. Dönüştürme Function p(r)için Sub p(r)gelen boşluk kaldırarak, hiçbir fonksiyon çıkış değeri yoktur çünkü debug.? c(n,k);ve satırlı dönüştürme if-then-elsetek bir satır (beyanı If k Then c=c(n-1,k-1)*n/k Else c=1aşağı bayt sayım) getiriyor 130saatime göre
Taylor Scott

@TaylorScott Teşekkürler! Golf oynamakta oldukça yeniyim ve genel olarak programlamada sadece biraz daha az yeniyim. Satır sonları nedeniyle 142 saydım. Gönderen ben ne bulabiliriz , bu saymak gerekiyor.
Mühendis Toast

Ah, haklısın, yeni hatlarımı saymayı unuttum ve anlaşıldığı For n=0 To...üzere For n=0To..., kod versiyonumu bayt sayısı ile 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 Functiona getirmek için en az bir başka golf oyunu daha yoğunlaştırılabilir139
Taylor Scott

(: Komut penceresi Fonksiyon bu ikinci bakış, bir yardımcı fonksiyonu ile hemen bir pencere fonksiyonu içine yıkmak varsa, 112 bayt için aşağı alabilirsiniz düşündürmektedir For n=0To[A1-1]:For k=0To n:?c(n,k);:Next:?:NextYardımcısı Fonksiyonu: Function c(n,k) If k Then c=c(n-1,k-1)*n/k Else c=1 End Function)
Taylor Scott

1
@TaylorScott Peki onları tamamen bırakmaya ne dersiniz? Formülde bir değişiklik ile, sadece iyi çalışıyor. Bunun B2yerine başlayan çıkışın A1kabul edilebilir olduğunu düşünüyorum .
Mühendis Toast,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.