Talk:Pascal's triangle: Difference between revisions
m →Right Output Format?: added comment about formatting the triangle's numbers. |
|||
Line 33: | Line 33: | ||
row=[l+r for l,r in zip(row+k,k+row)] |
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. --[[User:Jnever1|Jnever1]] 04:35, 14 March 2012 (UTC) |
z -= 1</lang>Likely, there are more elegant formatting methods. This is to my ability. --[[User:Jnever1|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. -- [[User:Gerard Schildberger|Gerard Schildberger]] 19:07, 14 May 2012 (UTC) |
|||
== J Explanation == |
== J Explanation == |
Revision as of 19:07, 14 May 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)
- --- 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)
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)