Talk:Pascal's triangle: Difference between revisions

From Rosetta Code
Content added Content deleted
Line 15: Line 15:
: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. --[[User:Mwn3d|Mwn3d]] 18:37, 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. --[[User:Mwn3d|Mwn3d]] 18:37, 27 December 2009 (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 additions as alternative and addition to present code under the potential heading of "Traditionally Formatted, Python~3":
::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":
::<lang python>def pascal(n):
::<lang python>def pascal(n):
# Prints n rows of Pascal's triangle, traditionally formatted.
# Prints n rows of Pascal's triangle, traditionally formatted.

Revision as of 05:05, 14 March 2012

Right Output Format?

The task bdescription 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)
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":
<lang python>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</lang>Likely, there are more elegant formatting methods. This is to my ability. --Jnever1 04:35, 14 March 2012 (UTC)

J Explanation

<lang j>!/~@i. N</lang>

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

<lang J>  !/~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</lang>

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): <lang j> 5!52 2598960</lang>

So ! is the mathematical choose function. As for /~@i., 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:

<lang j> (-@|. |."_1 [: ;:inv [: ":@-.&0&.>@|: !/~)@i. 5

    1    
   1 1   
  1 2 1  
 1 3 3 1 
1 4 6 4 1</lang>

Here, we have refactored the operation slightly:

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