Trójkąt Pascala jest generowany, zaczynając od 1 w pierwszym rzędzie. W kolejnych wierszach liczba jest określona przez sumę dwóch liczb bezpośrednio nad nią po lewej i prawej stronie.
Aby to zademonstrować, oto 5 pierwszych rzędów trójkąta Pascala:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
Wyzwanie
Biorąc pod uwagę wartość n (pod warunkiem, że jest to najwygodniejsze w wybranym języku), wygeneruj pierwsze n wierszy trójkąta Pascala. Możesz założyć, że n jest liczbą całkowitą zawierającą się między 1 a 25. Musi istnieć przerwa między wierszami i spacja między każdą liczbą, ale poza tym możesz sformatować ją w dowolny sposób.
To jest golf golfowy , więc wygrywa najkrótsze rozwiązanie.
Przykład I / O
> 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
code-golf
math
combinatorics
Peter Olson
źródło
źródło
Odpowiedzi:
J , 12 znaków
źródło
i.5
zwraca pierwszych pięć naturali. Wiersz 2 dodaje{:
„Ogon” (powrót ostatni). Linia 3 łączy je z!
„Out Of” (liczba kombinacji). Linia 4(!{:)i.5
jest taka sama. faktoring z hakiem. Podobnie(!:)
jest z operacją, która przekształca pierwsze n naturali w n-tą linię trójkąta Pascala. Wiersz 5 stosuje go do wszystkich prefiksów (ukośnik odwrotny) 0..4, ale J wypełnia nieużywane miejsca 0, więc operacja jest łączona (@
) z operacją formatowania łańcucha":
. Bardzo fajne J, głosowałem.!
oznacza silnia;!
kombinacje dyadyczne . Ostateczna@
w":@(!{:)\@i.
to właśnie tam, aby to samodzielny czasownik.Python, 56 bajtów
Przykładowe użycie:
Produkuje:
źródło
exec
unikajfor
pętli.Python,
9491887063 znakówźródło
Mathematica: 36 (41?)
Mathematica ma tę
Binomial
funkcję, ale zabiera to zabawę. Proponuję:Linia powyżej wyświetli nierówną tablicę, taką jak:
Ponieważ jest to podstawowy format w Mathematica, pomyślałem, że będzie akceptowalny, ale kiedy ponownie czytam zasady, myślę, że może nie być. Dodanie
Grid@
wygeneruje jednoznacznie akceptowalny wynik, w sumie 41 znaków:n = 6
:źródło
C 522
Samo demonstrująca odpowiedź C. Nie może być jaśniejsze! Punkty bonusowe za znalezienie dodatkowej postaci.
źródło
Golfscript (21 znaków)
Ponieważ zażądano wyjaśnienia:
źródło
Haskell,
9492Wydajność:
Wersja 71 znaków, która nie drukuje spacji między każdą liczbą:
Wydajność:
źródło
mapM
zamiastmapM_
.Scala,
81787270 znaków81 znaków: pierwsza próba, bezwstydnie skopiowana z wersji Python :)
Uruchom jako skrypt lub bezpośrednio w REPL.
Obetnij do 70 znaków za pomocą czegoś zaskakująco czytelnego i idiomatycznego:
Lub
7270 znaków z zupełnie inną metodą:źródło
Ruby:
514946 znaków(Kod 45 znaków + opcja wiersza poleceń 1 znak)
Dzięki:
Przykładowy przebieg:
Wypróbuj online!
źródło
p.map!{|i|(v=n)+n=i}
.map
. Dziękuję Ci.JavaScript (
90858381)Demo: http://jsfiddle.net/tcRCS/3/
UWAGA : Nie działa dobrze w praktyce dla około n> 30, ponieważ liczby przepełniają wbudowany typ danych liczb całkowitych i stają się liczbami zmiennoprzecinkowymi.
Edycja 1 : 5 znaków usunięto przez konwersję
while
dofor
i łączenie sprawozdańEdycja 2 : przenieś
s=
instrukcję do środkafor
i zapisz 2 znakiEdycja 3 : połącz
s=1,j=1
inicjators=j=1
i zapisz 2 znakiźródło
s*(i-j)/j
, nies*((i-j)/j)
.(i-j)
przed podzieleniem przezj
, to nie ma potrzeby arytmetyki zmiennoprzecinkowej, ponieważ wyniki zawsze powinny być liczbą całkowitą. Jeśli zrobisz to((i-j)/j)
najpierw, spowoduje to wartości dziesiętne, które mogą być źródłem błędów, a co najmniej wymagać będzie dodatkowego kodu do zaokrąglania / obcinania. Nie zaczniesz tego widzieć, dopóki nie przejdziesz dookołan>11
, a zobaczysz wartości dziesiętne na wyjściu, tj.1 11 55 165 330 461.99999999999994 461.99999999999994...
R, 39 znaków
R wydaje się być właściwym narzędziem do tego zadania :-)
źródło
n
dane są podane? Poprawiłem kod. Czy to jest w porządku?n
musi być dostarczony ze źródła zewnętrznego w czasie wykonywania, a urządzenie do jego przechwytywania jest zawarte w twoim programie. Zazwyczaj oznacza to argument wiersza poleceń, standardowe wejście lub plik. Według pliku prawie nigdy nie jest używany, ponieważ jest niezmiennie dłuższy niż dwie pozostałe opcje.w Q (25 znaków / 20 w krótszej wersji)
Krótszy
Przykładowe użycie:
źródło
t:{(x-1){0+':x,0}\1}
awk - 73 znaki
dość prosta implementacja:
przykładowy przebieg:
źródło
Perl,
52, 49 znakówEdycja: za pomocą
say
zamiastprint
źródło
Perl,
4754 znakówPobiera liczbę z wiersza poleceń, ale nie wykonuje żadnych kontroli błędów.
Właśnie zdałem sobie sprawę, że działa tylko do n = 4. To był stary kod, który miałem na swoim dysku HD.
Działa to jednak:
n musi jednak zostać wprowadzone do skryptu, inaczej byłby to jeden znak więcej.
źródło
Beczka , 40 bajtów
Wyjaśnił
źródło
Perl, 77 znaków
Przykładowe dane wejściowe
Przykładowe dane wyjściowe
źródło
C,
132127 znakówźródło
Pascal:
216192 znaków(Nie prawdziwy konkurent, tylko honorowa obecność.)
Przykładowy przebieg:
źródło
MATL, 10 bytes
Language created after this challenge
Try it online!
źródło
D
134128 charsoutput for 9 is
taking full advantage of "you may format it however you like"; there is a space between each number and a linebreak
edit repositioned the assignment to
l
to shave of some charsźródło
Scala, 131 characters
Takes the input from the command line.
Output for n=10:
źródło
0
s :-)?F♯ - 203 characters
My first attempt at a round of code golf, and first attempt at functional programming. There is probably some obvious way to shorten it I haven't quite figured out yet. It complies in VS2010s F♯ compiler (which has the effect of running #light by default unlike earlier versions), and also works in the F♯ interpreter. Accepts input via stdin. Wish there was a better way for the input/output though! Lots of characters!
źródło
Why is there no accepted answer to this question?
VBA - 249 chars
źródło
postscript - 59 chars (63 if you count
-dn=
to get the number of rows in)run with
to get
źródło
Mathematica 35 chars
Here is the dull and lazy way of slicing Pascal's triangle:
źródło
APL,
1915 charactersA bit late to the party, perhaps?
It doesn't beat the J entry, though.
This assumes that the index origin (
⎕IO
) is set to0
. Unfortunately, with an index origin of1
, we need2518 characters:There are two
⍨
s in the code to express my frustration.Demo:
Explanations
Short version:
⍳⍵
(with an index origin of 0) produces an array of the numbers from 0 to⍵-1
inclusive, where⍵
is the right argument to the function.⍳⍵+1
generates all numbers from 0 to⍵
{⍵!⍨⍳⍵+1}
generates⍵
choosek
for every elementk
in⍳⍵+1
. The⍨
(commute) operator swaps the arguments to a function around, such that the right hand argument becomes the left, and vice versa.{⍵!⍨⍳⍵+1}¨⍳⍵
passes each element in⍳⍵
using the¨
(each) operator. The result is a one dimensional array containing the first⍵
rows of the Pascal's Triangle.⍪
takes a one dimensional vector, and makes it a column rather than a row. Each row of the triangle is put on its own line.Long answer:
1-⍨
is placed before an⍳
to replicate an index origin of 0.0,⍳⍵
with an index origin of 1 replicates⍳⍵+1
with an index origin of 0.źródło
Maple, 46
Usage:
źródło
VBA,
16214210280 bytesSaved 22 bytes thanks to Taylor Scott.
This is an old question now but I saw a shorter solution for VBA.
This is meant to be run in the immediate window. Input is in cell
A1
of the active worksheet. Output is in the active worksheet starting atB2
and using however many cells are required based on the input. TheCOLUMN()>ROW()
check keeps the top right of the triangle blank. TheROW()=2
check makes the first value1
to initiate the triangle. I could have shifted the output down and dropped this check, but it introduces a lot of extraneous output before the actual triangle and I didn't feel that it was in the spirit of the challenge.I originally posted a much more complicated method that calculated every value based on its row and column. All this method does, though, is to use in-cell formulas. I start at
B2
so I can reference the row above it without#REF!
errors. Then, it copies and pastes the same formula over a block of cells n wide and n tall. The input and output forn=25
looks like this:źródło
Function p(r)
toSub p(r)
since you have no function output value, removing the space fromdebug.? c(n,k);
and converting the multilineif-then-else
statement to a single line (If k Then c=c(n-1,k-1)*n/k Else c=1
) brings the byte-count down to130
by my countFor n=0 To...
can be condensed toFor n=0To...
bringing my version of the code toSub 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
with a byte count of139
For n=0To[A1-1]:For k=0To n:?c(n,k);:Next:?:Next
Helper Function:Function c(n,k)
If k Then c=c(n-1,k-1)*n/k Else c=1
End Function
)B2
instead ofA1
is acceptable.05AB1E, 14 bytes
Try it online!
źródło