Talk:Pascal's triangle

From Rosetta Code

Right Output Format?[edit]

The task description says the triangle looks like this:

   1
  1 1
 1 2 1
1 3 3 1

And yet, some examples are showing the easier to construct:

1
1 1
1 2 1
1 3 3 1

I think that maybe all example output should follow the task description format of an isosceles triangle. --Paddy3118 08:59, 27 December 2009 (UTC)

That's not always easy to do. I think the important part of the task is the generation of each row. We don't need to complicate it with output formatting that isn't important to the theory involved. --Mwn3d 18:37, 27 December 2009 (UTC)
It seems easy enough to do, just indent:   Total Rows-Current Row.   -- Gerard Schildberger 22:12, 2 November 2012 (UTC)
(For further edification and clarification):   indent each displayed row with:     value(totalRows   minus   currentRow).     -- Gerard Schildberger (talk) 20:33, 18 July 2016 (UTC)
Need it or not, the Python~2 code as available strays from theory by virtue of the return statement. I submit that completeness and conformity trumps raw theory in the case of code examples and would serve an additional segment of the public with formatting applied. I further submit the following as alternative and addition to present code under the potential heading of "Traditionally Formatted, Python~3":
def pascal(n):
# Prints n rows of Pascal's triangle, traditionally formatted.
# Good for 1 <= n <= 20 rows.
# Beyond n = 20, digits exceed allotted character space
# and overlap occurs.
row = [1]
k = [0]
z = n-1
for x in range(n):
tabs = ' '*z
for i in range(len(row)):
row[i] = str(format(row[i], '6d'))
print(tabs+''.join( row[i] for i in range(len(row)) ) )
for i in range(len(row)):
row[i] = int(row[i])
row=[l+r for l,r in zip(row+k,k+row)]
z -= 1
Likely, there are more elegant formatting methods. This is to my ability. --Jnever1 04:35, 14 March 2012 (UTC)
Easy or not, it's what makes Pascal's triangle a ... well, a triangle. Having the output in a triangle is what shows (easlily) what the relationship is between any number and the two above it, assuming that the "above" numbers in the line are formatted properly. Next thing you know, Latin squares will be acceptable as all the numbers on one line. It should be an easy thing to insert some blanks before/between the numbers. -- Gerard Schildberger 19:07, 14 May 2012 (UTC)
FWIW my two cents on this is that it's easy enough to tilt your head left 45° :). It's not stated in the problem text, but I saw this task as an exercise in creating the triangle itself, and the extra code to format it properly can obfuscate the more important underlying logic. I agree it's not hard, but even so, for a beginning programmer to sift through which logic applies to which issue can be difficult. I think a separate formatting task would be a great way to address this. --Mike Lorenz 13:28, 3 November 2012 (UTC)

J Explanation[edit]

!/[email protected] N

The triangle itself is simply the table of number-of-combinations, for the first N non-negative integers.

   !/~i.5
1 1 1 1 1
0 1 2 3 4
0 0 1 3 6
0 0 0 1 4
0 0 0 0 1

That is, C(n,k) for all n,k in [0 .. n). J's notation for C(n,k) is k ! n (mnemonic: combinations are closely related to factorials, which are denoted by ! in math).

So, for example, the number of ways to choose a poker hand (5 cards from the deck of 52):

   5!52     
2598960

So ! is the mathematical choose function. As for /[email protected], the /~ would be "table of" and i. "the first N non-negative integers (i.e. 0 .. N-1)". (And @ is just glue.)

But, formatting the thing takes a bit more effort:

   ([email protected]|. |."_1 [: ;:inv [: ":@-.&0&.>@|: !/~)@i. 5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

Here, we have refactored the operation slightly:

(stuff)@i.5
makes the sequence 0 1 2 3 4 available every odd verb (counting from the right) in stuff

The "stuff" are (from right to left)

!/~
build our table of combinations
":@-.&0&.>@|:
transpose that array, and for each number remove it if it is zero, format it as a string and put it in a box
[:
placeholder meaning "no verb here" the verb to the right does not get a left argument
;:inv
combine the strings in rows of boxes as word (with spaces between them
[:
placeholder meaning "no verb here" the verb to the right does not get a left argument
|."_1
rotate each item (each row of characters) by the indicated amount (rotation would be moving contents left except that the amounts are negative).
[email protected]|.
reverse and negate the argument (resulting in the negative sequence _4 _3 _2 _1 0)