Floyd's triangle

From Rosetta Code
Revision as of 16:07, 25 June 2012 by Sonia (talk | contribs) (→‎{{header|Go}}: fix)
Floyd's triangle is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

Floyd's triangle lists the natural numbers in a right triangle aligned to the left where

  • the first row is just 1
  • successive rows start towards the left with the next number followed by successive naturals listing one more number than the line above.

The first few lines of a Floyd triangle looks like this:

 1
 2  3
 4  5  6
 7  8  9 10
11 12 13 14 15

The task is to:

  1. Write a program to generate and display here the first n lines of a Floyd triangle.
    (Use n=5 and n=14 rows).
  2. Ensure that when displayed in a monospace font, the numbers line up in vertical columns as shown and that only one space separates numbers of the last row.

Go

<lang go>package main

import "fmt"

func main() {

   floyd(5)
   floyd(14)

}

func floyd(n int) {

   fmt.Printf("Floyd %d:\n", n)
   lowerLeftCorner := n*(n-1)/2 + 1
   lastInColumn := lowerLeftCorner
   lastInRow := 1
   for i, row := 1, 1; row <= n; i++ {
       w := len(fmt.Sprint(lastInColumn))
       if i < lastInRow {
           fmt.Printf("%*d ", w, i)
           lastInColumn++
       } else {
           fmt.Printf("%*d\n", w, i)
           row++
           lastInRow += row
           lastInColumn = lowerLeftCorner
       }
   }

}</lang>

Output:
Floyd 5:
 1
 2  3
 4  5  6
 7  8  9 10
11 12 13 14 15
Floyd 14:
 1
 2  3
 4  5  6
 7  8  9 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44  45
46 47 48 49 50 51 52 53  54  55
56 57 58 59 60 61 62 63  64  65  66
67 68 69 70 71 72 73 74  75  76  77  78
79 80 81 82 83 84 85 86  87  88  89  90  91
92 93 94 95 96 97 98 99 100 101 102 103 104 105

J

Note: require 'strings' does nothing in J7, but is harmless (strings is already incorporated in J7).

<lang J>require 'strings' floyd=: [: rplc&(' 0';' ')"1@":@(* ($ $ +/\@,)) >:/~@:i.</lang>

Example use:

<lang J> floyd 5

1            
2  3         
4  5  6      
7  8  9 10   

11 12 13 14 15

  floyd 14
1                                             
2  3                                          
4  5  6                                       
7  8  9 10                                    

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105</lang>

Python

<lang python>>>> def floyd(rowcount=5): rows = 1 while len(rows) < rowcount: n = rows[-1][-1] + 1 rows.append(list(range(n, n + len(rows[-1]) + 1))) return rows

>>> floyd() [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10], [11, 12, 13, 14, 15]] >>> def pfloyd(rows=[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]): colspace = [len(str(n)) for n in rows[-1]] for row in rows: print( ' '.join('%*i' % space_n for space_n in zip(colspace, row)))


>>> pfloyd() 1 2 3 4 5 6 7 8 9 10 >>> pfloyd(floyd(5))

1
2  3
4  5  6
7  8  9 10

11 12 13 14 15 >>> pfloyd(floyd(14))

1
2  3
4  5  6
7  8  9 10

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 >>> </lang>

Tcl

<lang tcl>proc floydTriangle n {

   # Compute the column widths
   for {set i [expr {$n*($n-1)/2+1}]} {$i <= $n*($n+1)/2} {incr i} {

lappend w [string length $i]

   }
   # Print the triangle
   for {set i 0; set j 1} {$j <= $n} {incr j} {

for {set p -1; set k 0} {$k < $j} {incr k} { puts -nonewline [format "%*d " [lindex $w [incr p]] [incr i]] } puts ""

   }

}

  1. Demonstration

puts "Floyd 5:" floydTriangle 5 puts "Floyd 14:" floydTriangle 14</lang>

Output:
Floyd 5:
 1 
 2  3 
 4  5  6 
 7  8  9 10 
11 12 13 14 15 
Floyd 14:
 1 
 2  3 
 4  5  6 
 7  8  9 10 
11 12 13 14 15 
16 17 18 19 20 21 
22 23 24 25 26 27 28 
29 30 31 32 33 34 35 36 
37 38 39 40 41 42 43 44  45 
46 47 48 49 50 51 52 53  54  55 
56 57 58 59 60 61 62 63  64  65  66 
67 68 69 70 71 72 73 74  75  76  77  78 
79 80 81 82 83 84 85 86  87  88  89  90  91 
92 93 94 95 96 97 98 99 100 101 102 103 104 105