Author Topic: Floyd's Triangle  (Read 4156 times)

Tomaaz

• Guest
Floyd's Triangle
« on: October 16, 2018, 07:31:11 PM »
Here is my version of Floyd's Triangle. I wanted to make it as compact as possible and created this one line in Ruby:

Code: [Select]
`(1..14).each {|x| puts (((1 + x) * (x / 2.0) - (x - 1)).to_i..((1 + x) * (x / 2.0)).to_i).to_a.to_s.split(",").join}`
Anyone wants to post something in BASIC? But please, try to do something different than two loops and couple of variables.

B+

• Guest
Re: Floyd's Triangle
« Reply #1 on: October 16, 2018, 11:30:38 PM »
Here's what I have:

B+

• Guest
Re: Floyd's Triangle
« Reply #2 on: October 16, 2018, 11:58:33 PM »
SmallBASIC version:
Code: [Select]
`floyd 20sub floyd (r)locate r, 1for i in seq(((r - 1) * r) / 2 + 1, r * (r + 1) / 2, r * (r + 1) / 2 - (r - 1) * r / 2 ) do ? right("   " + str(i), 4);? : if r > 0 then floyd (r - 1) else locate 1, 4 : ? 1end`

Tomaaz

• Guest
Re: Floyd's Triangle
« Reply #3 on: October 17, 2018, 12:31:03 PM »
Recursion. Nice. Anyone else?

B+

• Guest
Re: Floyd's Triangle
« Reply #4 on: October 17, 2018, 02:10:21 PM »
Dang! I missed the Rosetta spec about spacing, that probably eliminates a recursive method or makes it very ugly.

B+

• Guest
Re: Floyd's Triangle
« Reply #5 on: October 17, 2018, 02:52:37 PM »
Yep! John's got a good one!

Works in JB too:
Code: [Select]
`' "Floyd John's version" ' from All BASIC 2018-10-17 looking pretty good!"l = 14 'number of rows for Floyd to processn = 1 ' number incrementFOR r = 1 TO l    FOR c = 1 TO r        PRINT RIGHT\$("    " + STR\$(n), LEN(STR\$(c + l * (l - 1) / 2)) + 1);        n = n + 1    NEXT    PRINTNEXT`
Output:
Code: [Select]
`  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`
« Last Edit: October 17, 2018, 03:12:12 PM by B+ »

Mike Lobanovsky

• Guest
Re: Floyd's Triangle
« Reply #6 on: October 17, 2018, 08:40:38 PM »
Yep! John's got a good one!

Yes Mark,

And while we're at it let me note that John's code beats Tomaaz's kabbala hands down 3 times:
• code length wise
• speed wise
Slightly underdone, you say?

jj2007

• Guest
Re: Floyd's Triangle
« Reply #7 on: October 17, 2018, 08:41:34 PM »
Version 1, a smooth triangle (but not exactly what the Rosetta specs ask for):

SetGlobals rows, columns, ct
Init
For_ rows=0 To 19
For_ columns=0 To rows
inc ct
Print Str\$("%__i ", ct)
Next
Print
Next
Inkey
EndOfCode

Code: [Select]
`  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 105106 107 108 109 110 111 112 113 114 115 116 117 118 119 120121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210`
Version 2, strictly following the spacing specs:

SetGlobals rows, columns, ct
Init
round=0
repeat 2
Clr ct
For_ rows=0 To 4+9*round
For_ columns=0 To rows
inc ct
Print Str\$("%__i", ct)
.if columns>6
Print " "
.endif
Next
Print
Next
Print
round=round+1
endm
Inkey
EndOfCode

Code: [Select]
`  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15  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`

Tomaaz

• Guest
Re: Floyd's Triangle
« Reply #8 on: October 17, 2018, 11:59:43 PM »
Yep! John's got a good one!

Yes Mark,

And while we're at it let me note that John's code beats Tomaaz's kabbala hands down 3 times:
• code length wise
• speed wise
Slightly underdone, you say?

While I really enjoyed reading your comments, I need to say that you've totally missed the point of my example. It wasn't about speed, readability was the last thing I was concerned about and I didn't really care about the beauty of the output. It was more about finding a less obvious mathematical solution to the problem. Also I wanted it to be specific to the used language. Of course, I could have written something like this:

Code: [Select]
`x, y = 1, 1print "Number of rows? "gets.to_i.times do y.times do print x, "\t" x += 1 end puts y += 1end`

The question is - is this boring and obvious code worth posting? IMO, it isn't. Hence "But please, try to do something different than two loops and couple of variables. " at the end of my post. This code can be easily translated to almost every language. The one from my first post can't, because, due to use of ranges, arrays and OO syntax is Ruby specific. Also, I wanted to have one variable in the entire program. It took me about half an hour to re-study high school level maths, but it was fun.
« Last Edit: October 18, 2018, 12:42:23 AM by Tomaaz »

Mike Lobanovsky

• Guest
Re: Floyd's Triangle
« Reply #9 on: October 18, 2018, 03:54:08 AM »
Tomaaz,

Quote
... due to use of ranges, arrays and OO syntax is Ruby specific.

What was the point in building your challenge around alien language specific features? What were you expecting from the Beginner's ASIC audience? Lists, ranges, and OOP re-written via line numbers and goto's???

There's no such stuff in BASIC and will never be, and you know that no worse than I do regardless of any meaning you pretend to have put in your challenge.

There's absolutely no point either in an alternative mathematical solution that's almost twice longer, twenty times slower, and cryptic beyond recognition at least to the BASIC audience. IMO you plain wasted that half hour of your life for nothing.

jj2007

• Guest
Re: Floyd's Triangle
« Reply #10 on: October 18, 2018, 03:57:22 AM »
It wasn't about speed, readability was the last thing I was concerned about and I didn't really care about the beauty of the output. ... but it was fun.

You should add it to the Rosetta code Ruby example. Your coding style is certainly different from mine, but when I saw your one-liner, my first thought was WOW!

@Mike: No, that was no waste of time. Tomaaz impressed you and me, and he had fun.
« Last Edit: October 18, 2018, 04:00:37 AM by jj2007 »

Aurel

• Guest
Re: Floyd's Triangle
« Reply #11 on: October 18, 2018, 06:58:05 AM »
well tommat (  ) like to to do such a stuff ,,,yee haaa

here is one in REXX

This REXX version uses a simple formula to calculate the maximum value (triangle element) displayed.

/*REXX program constructs & displays  Floyd's triangle for any number of specified rows.*/
parse arg N .;    if N=='' | N==","  then N= 5   /*Not specified?  Then use the default.*/
mx= N * (N+1) % 2  - N                           /*calculate the maximum of any value.  */
say 'displaying a '  N  " row Floyd's triangle:" /*show the header for Floyd's triangle.*/
say                                              /*display a blank line below the title.*/
#=1;    do    r=1  for N;           i= 0;     _= /*construct Floyd's triangle row by row*/
do #=#  for r;           i= i + 1     /*start to construct a row of triangle.*/
_= _ right(#, length( mx+i ) )        /*build a row of the Floyd's triangle. */
end   /*#*/                           /*calculate the max length on the fly. */
say substr(_, 2)                         /*remove 1st leading blank in the line.*/
end      /*r*/                           /*stick a fork in it,  we're all done. */

Tomaaz

• Guest
Re: Floyd's Triangle
« Reply #12 on: October 18, 2018, 10:34:44 AM »
Mike, you wasted much more than 30 min. for talking about me wasting 30 min. That's rather funny. What is not funny is your patronising style and constan attempts to convert every single topic to BASIC vs other languages competition. I want to show and see differences between languages. I'm not interested in finding overall winner, because it's simply impossible.

B+

• Guest
Re: Floyd's Triangle
« Reply #13 on: October 19, 2018, 02:54:24 PM »
I have to say, what Tomaaz contributes to this forum has usually been challenging, interesting, stimulating, at least to this BASIC fan.

I also appreciate Mike's (no L needed) experienced tech point of view that can see through smoke and mirrors eg the illusion of one-liners.

What is boring is hostility or hysterics which I think Mike himself has noted when I screwed up and Tomaaz has mentioned a time or two too.

And I have to agree with JJ on two points:
1. It is NOT a waste of time when someone is having fun at no other's expense.
2. The fixed spacing, right alignment of columns in Floyd's Triangle just plain looks better with a nice crisp line down the slope.

« Last Edit: October 19, 2018, 03:06:25 PM by B+ »