» Goto page 1, 2  Next
This is Pascal's Triangle:

The top starts with row 0. I created a program that can calculate the numbers of a row and store them in L₂. The program can also use pascal's triangle for the binomial theorem. Which is (X+A)^B, with B being pascal's triangle's row number. One problem. In Basic is there any command that either can:
1. Display both numbers and strings at the same time?
Ex: Display: "+" A^Q "X^" B
or
2. Tell the length (in digits) of a variable or variables?
Ex: length of N, or length of N*A
1) I'm assuming you are trying to display the string as if it were a single line, in which case you will need to store the numbers to strings and then work with a single string. Currently, without libs, the simplest way to do this is with a routine that utilises the Equ►String( command also known as ti-basic's perpetual thorn

Code:
```:{0,1→L₁ :{0,N→L₂ :LinReg(ax+b) Y₁ :Equ►String(Y₁,Str1 :sub(Str1,1,length(Str1)-3→Str1```

This will take expr(N) and store it to Str1.
2) If you are only dealing with integers (which is probably the case since you are talking about pascal's triangle), then

Code:
`1+int(log(N`

Is the length in digits of the variable N, for example, if N=854534, then 1+int(log(N))=6
mr womp womp wrote:
1) I'm assuming you are trying to display the string as if it were a single line, in which case you will need to store the numbers to strings and then work with a single string. Currently, without libs, the simplest way to do this is with a routine that utilises the Equ►String( command also known as ti-basic's perpetual thorn

Code:
```:{0,1→L₁ :{0,N→L₂ :LinReg(ax+b) Y₁ :Equ►String(Y₁,Str1 :sub(Str1,1,length(Str1)-3→Str1```

This will take expr(N) and store it to Str1.
2) If you are only dealing with integers (which is probably the case since you are talking about pascal's triangle), then

Code:
`1+int(log(N`

Is the length in digits of the variable N, for example, if N=854534, then 1+int(log(N))=6

Thank you. I've seen both examples, just never knew what they were for. So if I wanted to find the length of a floating point number, then I'd have to use fPart and iPart I'm assuming and add the two answers together.
Adding the fPart and iPart of a number together will result in the original number... At that point, if you need to figure out the length of a number with decimals, I'm sure you could come up with a pretty messy routine that could do it, but I'd suggest just storing the number to a string with the first routine and using the length( command.
But, then you'd have a decimal so you'd have to subtract by 1. But yes thank you for giving me the faster version.
Interesting that you made a program to calculate the numbers in a row. Without input one can do it in 10 bytes
seq(N nCr X, X,0, N
I am using that to output the row. I'm making the program for those who don't want to take the time to memorize that sequence. Plus, this program involves the binomial theorem also.
I keep having a syntax error here:

Code:
```{0,1}→L₁ {0,B}→L₂                       //power, triangle row {0,J}→L₃                       //Current element of triangle row {0,H}→L₅                      //Last element of binomial LinReg(ax+b) L₁,L₂,Y₁ LinReg(ax+b) L₁,L₃,Y₂ LinReg(ax+b) L₁,L₅,Y₄          //error on this line Equ►String(Y₁,Str1 Equ►String(Y₂,Str2 Equ►String(Y₄,Str4 sub(Str1,1,length(Str1)-3→Str1 sub(Str2,1,length(Str2)-3→Str2 sub(Str4,1,length(Str4)-3→Str4 DelVar Y₁DelVar Y₂DelVar Y₄```
seanlego23 wrote:
I keep having a syntax error here:

Code:
```{0,1}→L₁ {0,B}→L₂                       //power, triangle row {0,J}→L₃                       //Current element of triangle row {0,H}→L₅                      //Last element of binomial LinReg(ax+b) L₁,L₂,Y₁ LinReg(ax+b) L₁,L₃,Y₂ LinReg(ax+b) L₁,L₅,Y₄          //error on this line Equ►String(Y₁,Str1 Equ►String(Y₂,Str2 Equ►String(Y₄,Str4 sub(Str1,1,length(Str1)-3→Str1 sub(Str2,1,length(Str2)-3→Str2 sub(Str4,1,length(Str4)-3→Str4 DelVar Y₁DelVar Y₂DelVar Y₄```

Since you are doing it three times, I don't know if it would be better, but it would definitely be more elegant, to do all three at once using the QuadReg command like this:

Code:
```{0,1,2→L₁ seq(Bχ²+Jχ+H,χ,0,2→L₂ QuadReg Y₁ Equ►String(Y₁,Str1```

In Str1 will be a quadratic equation with three arguemnts, each one being the numbers contained in the variables B.J and H respectively.
mr womp womp wrote:
seanlego23 wrote:
I keep having a syntax error here:

Code:
```{0,1}→L₁ {0,B}→L₂                       //power, triangle row {0,J}→L₃                       //Current element of triangle row {0,H}→L₅                      //Last element of binomial LinReg(ax+b) L₁,L₂,Y₁ LinReg(ax+b) L₁,L₃,Y₂ LinReg(ax+b) L₁,L₅,Y₄          //error on this line Equ►String(Y₁,Str1 Equ►String(Y₂,Str2 Equ►String(Y₄,Str4 sub(Str1,1,length(Str1)-3→Str1 sub(Str2,1,length(Str2)-3→Str2 sub(Str4,1,length(Str4)-3→Str4 DelVar Y₁DelVar Y₂DelVar Y₄```

Since you are doing it three times, I don't know if it would be better, but it would definitely be more elegant, to do all three at once using the QuadReg command like this:

Code:
```{0,1,2→L₁ seq(Bχ²+Jχ+H,χ,0,2→L₂ QuadReg Equ►String(Y₁,Str1```

In Str1 will be a quadratic equation with three arguemnts, each one being the numbers contained in the variables B.J and H respectively.

Then I can just use the sub() command to split them up. Thanks.
Yep, also a quick tip when using the regression commands, the default settings are already
Code:
`L₁,L₂`

So if you are using those lists, then you don't need to put them, kind of like how an increment of 1 is assumed if you skip the final argument in a For() loop
mr womp womp wrote:
Yep, also a quick tip when using the regression commands, the default settings are already
Code:
`L₁,L₂`

So if you are using those lists, then you don't need to put them, kind of like how an increment of 1 is assumed if you skip the final argument in a For() loop

That's true. Thanks for reminding me. I primarily use C now so I've forgotten a bit.
The QuadReg Equation comes up with B,J, and H, but B and J are just barely off. If B=2 then it shows 1.9999... if J = -1 then it shows -0.9999...
How do I fix this? Also, If B, J, and H, are different digit lengths per the user input, how do I figure out how long it is in the code?
seanlego23 wrote:
The QuadReg Equation comes up with B,J, and H, but B and J are just barely off. If B=2 then it shows 1.9999... if J = -1 then it shows -0.9999...
How do I fix this? Also, If B, J, and H, are different digit lengths per the user input, how do I figure out how long it is in the code?

AHHH I was afrait it would do that, once it's in a string, it's pretty much too late to mess with it once it's in a string, luckily, there is one simple thing you can do that will fix it which is running the Fix command before the whole operation so that when it does the QuadReg, it immediately round that off, you could probably get away with Fix 7, so it would look like this:

Code:
```Fix 7 {0,1,2→L₁ seq(Bχ²+Jχ+H,χ,0,2→L₂ QuadReg Equ►String(Y₁,Str1```

Oh and if you're still geting rounding errors, you can always reduce the accuracy down to 6. but I doubt that will be necessary
Thanks that worked. How would you get rid of things in the middle/beginning of a string?
Here's my code:

Code:
```Lbl 0 ClrHome Menu("OPTIONS","ROW#",A,"BIONOMIAL THEOREM",B,"QUIT",C Lbl A Output(10,1,"ROW#≤69 Input "ROW:",C If C≥70:Then Output(10,15,"ERROR Goto A End seq(C nCr X,X,0,C)→L₆ Disp L₆ Pause  Goto 0 Lbl B ClrHome 0→D:1→K:1→Z:1→Y "+→Str0 "X^→Str9 Output(4,1,"D(X+A)^B Output(5,1,"B≤69 Input "A=",A Input "B=",B Input "D=",D If B≥70:Then Output(10,1,"ERROR Goto B End If D=0:Then Output(4,1,"EQUALS ZERO Pause Goto B End If D≠1:Goto 1 ClrHome For(Q,0,B (B!)/(Q!((B-Q)!))→N Q-K→J N(A^Q)→G A^B→H Fix 6 {0,1,2}→L₁ seq(BX²+JX+H,X,0,2,1→L₂ seq(JX²+HX+B,X,0,2,1→L₃ seq(HX²+BX+J,X,0,2,1→L₄ QuadReg Y₁ QuadReg L₁,L₃,Y₂ QuadReg L₁,L₄,Y₃ {0,1}→L₁ {0,J}→L₂ {0,H}→L₃ {0,B}→L₄ LinReg(ax+b) Y₄ LinReg(ax+b) L₁,L₃,Y₅ LinReg(ax+b) L₁,L₄,Y₆ EquString(Y₁,Str1 EquString(Y₂,Str2 EquString(Y₃,Str3 EquString(Y₄,Str4 EquString(Y₅,Str5 EquString(Y₆,Str6 sub(Str4,1,length(Str4)-3→Str4 sub(Str5,1,length(Str5)-3→Str5 sub(Str6,1,length(Str6)-3→Str6 sub(Str1,1,length(Str1)-(length(Str4)+length(Str5)+6)→Str1 sub(Str2,1,length(Str2)-(length(Str5)+length(Str6)+6)→Str2 sub(Str3,1,length(Str3)-(length(Str6)+length(Str4)+6)→Str3 If G≠1:Then {0,G}→L₂ LinReg(ax+b) L₁,L₂,Y₁ EquString(Y₁,Str7 sub(Str7,1,length(Str7)-3→Str7 End If B<20:Then If not(Q):Then Output(1,1,Str9+Str1 Y+length(Str9+Str1→Y End If Q=B:Output(Z,Y,Str0+Str3 If Q and Q≠B:Then If (A^Q):Then Output(Z,Y,Str0+Str7+Str9+Str2 K+1→K:Y+length(Str0+Str7+Str9+Str2→Y End If not(A^Q):Goto E End:End If B≥20:Then If not(Q):Then Output(1,1,Str9+Str1 Y+length(Str9+Str1→Y End If Q=B:Output(Z,Y,Str0+Str3 If Q and Q≠B:Then If (A^Q):Then Output(Z,Y,Str0+Str7+Str9+Str2 K+1→K:Y+length(Str0+Str7+Str9+Str2→Y End If not(A^Q):Goto E End If fPart(Z/10)=9:Then Pause 10:Asm(prgmSHFTUP 1→Z End If Y>26:Then (Y-26)+1→Y:Z+1→Z End:End Lbl E Output(Z+1,1,"DONE Pause Float Goto 0 Lbl 1 ClrHome For(Q,0,B (B!)/(Q!((B-Q)!))→N Q-K→J DN(A^Q)→G D(A^B)→H Fix 6 {0,1,2}→L₁ seq(BX²+JX+H,X,0,2,1→L₂ seq(JX²+HX+B,X,0,2,1→L₃ seq(HX²+BX+J,X,0,2,1→L₄ QuadReg Y₁ QuadReg L₁,L₃,Y₂ QuadReg L₁,L₄,Y₃ {0,1}→L₁ {0,J}→L₂ {0,H}→L₃ {0,B}→L₄ {0,D}→L₅ LinReg(ax+b) Y₄ LinReg(ax+b) L₁,L₃,Y₅ LinReg(ax+b) L₁,L₄,Y₆ LinReg(ax+b) L₁,L₅,Y₇ EquString(Y₁,Str1 EquString(Y₂,Str2 EquString(Y₃,Str3 EquString(Y₄,Str4 EquString(Y₅,Str5 EquString(Y₆,Str6 EquString(Y₇,Str7 sub(Str4,1,length(Str4)-3→Str4 sub(Str5,1,length(Str5)-3→Str5 sub(Str6,1,length(Str6)-3→Str6 sub(Str1,1,length(Str1)-(length(Str4)+length(Str5)+5)→Str1 sub(Str2,1,length(Str2)-(length(Str5)+length(Str6)+5)→Str2 sub(Str3,1,length(Str3)-(length(Str6)+length(Str4)+5)→Str3 If G≠1:Then {0,G}→L₂ LinReg(ax+b) L₁,L₂,Y₁ EquString(Y₁,Str8 sub(Str8,1,length(Str8)-3→Str8 End If B<20:Then If not(Q):Then Output(1,1,Str7+Str9+Str1 Y+length(Str9+Str1→Y End If Q=B:Output(Z,Y,Str0+Str3 If Q and Q≠B:Then If (A^Q):Then Output(Z,Y,Str0+Str8+Str9+Str2 K+1→K:Y+length(Str0+Str8+Str9+Str2→Y End If not(A^Q):Goto F End:End If B≥20:Then If not(Q):Then Output(1,1,Str7+Str9+Str1 Y+length(Str9+Str1→Y End If Q=B:Output(Z,Y,Str0+Str3 If Q and Q≠B:Then If (A^Q):Then Output(Z,Y,Str0+Str8+Str9+Str2 K+1→K:Y+length(Str0+Str8+Str9+Str2→Y End If not(A^Q):Goto F End If fPart(Z/10)=9:Then Pause 10:Asm(prgmSHFTUP 1→Z End If Y>26:Then (Y-26)+1→Y:Z+1→Z End:End Lbl F Output(Z+1,1,"DONE Pause Float Goto 0 Lbl C Float```

It's error free as far as I know. However, if I run it and click Binomial Theorem, with A=5,B=2,D=1, it should come out with X^2+10X+25 right? Nope, it just prints X^2. And Q=0 at the end. I don't understand why.
Help me find my error. Any optimization ideas are welcome because this is a lot of code. Thanks.
I haven't taken the time to look through the whole thing, but some things I noticed...:

Code:
```Fix 6 {0,1,2}→L₁ seq(BX²+JX+H,X,0,2,1→L₂ seq(JX²+HX+B,X,0,2,1→L₃ seq(HX²+BX+J,X,0,2,1→L₄ QuadReg Y₁ QuadReg L₁,L₃,Y₂ QuadReg L₁,L₄,Y₃ {0,1}→L₁ {0,J}→L₂ {0,H}→L₃ {0,B}→L₄ LinReg(ax+b) Y₄ LinReg(ax+b) L₁,L₃,Y₅ LinReg(ax+b) L₁,L₄,Y₆ ```

This stuff is missing the point of using QuadReg completely.... If you're doing it this many times, it might be worth considering a loop with a linreg in it, or if you want to try real hard, go with QuartReg and get a quartic function to do 5 at at a time but these "all at once" things don't seem to be of your liking

Code:
`If fPart(Z/10)=9`

By definition, the fPart of a number will never be bigger than 0.99999999... so this conditional will never go through.

Code:
```seq(C nCr X,X,0,C)→L₆ Disp L₆ ```

Here you don't reuse L₆, so you could just do

Code:
`Disp seq(C nCr X,X,0,C`

Here, you could use the Prompt command...

Code:
```Input "A=",A Input "B=",B Input "D=",D```

could be

Code:
`Prompt A,B,D`

The only difference would be that it would say "A=?" instead of "A="

Code:
```(Y-26)+1→Y could be Y-25→Y this doesn't make much of a difference but I try to keep things simplified...```
mr womp womp wrote:
I haven't taken the time to look through the whole thing, but some things I noticed...:

Code:
```Fix 6 {0,1,2}→L₁ seq(BX²+JX+H,X,0,2,1→L₂ seq(JX²+HX+B,X,0,2,1→L₃ seq(HX²+BX+J,X,0,2,1→L₄ QuadReg Y₁ QuadReg L₁,L₃,Y₂ QuadReg L₁,L₄,Y₃ {0,1}→L₁ {0,J}→L₂ {0,H}→L₃ {0,B}→L₄ LinReg(ax+b) Y₄ LinReg(ax+b) L₁,L₃,Y₅ LinReg(ax+b) L₁,L₄,Y₆ ```

This stuff is missing the point of using QuadReg completely.... If you're doing it this many times, it might be worth considering a loop with a linreg in it, or if you want to try real hard, go with QuartReg and get a quartic function to do 5 at at a time but these "all at once" things don't seem to be of your liking

I did that because I didn't know how to get J and H out of the string because of what comes before it. Is there a way to delete characters at the start of the string?
Quote:

Code:
`If fPart(Z/10)=9`

By definition, the fPart of a number will never be bigger than 0.99999999... so this conditional will never go through.

I did this because Z holds the row value for output(). So if the fraction of Z/10 is 9, that means we are on row 9.
Quote:

Code:
```seq(C nCr X,X,0,C)→L₆ Disp L₆ ```

Here you don't reuse L₆, so you could just do

Code:
`Disp seq(C nCr X,X,0,C`

Makes sense.
Quote:
Here, you could use the Prompt command...
Code:
```Input "A=",A Input "B=",B Input "D=",D```

could be

Code:
`Prompt A,B,D`

The only difference would be that it would say "A=?" instead of "A="

I've heard that Input was a better command than Prompt. Is there a difference?
Quote:

Code:
```(Y-26)+1→Y could be Y-25→Y this doesn't make much of a difference but I try to keep things simplified...```

Will do.
seanlego23 wrote:
I did that because I didn't know how to get J and H out of the string because of what comes before it. Is there a way to delete characters at the start of the string?
Sure, just some tricks with sub()
seanlego23 wrote:
I did this because Z holds the row value for output(). So if the fraction of Z/10 is 9, that means we are on row 9.
Just take a simple look at TI-Basic Developer. frac() outputs the fractional part of a number/division. That number is always in the range [0,0.99999999999], and never 9. The fraction of Z/10 is one of these values: 0, 0.1, 0.2 ... 0.9, and never 9.
seanlego23 wrote:

Code:
```seq(C nCr X,X,0,C)→L₆ Disp L₆ ```
Change this to
Code:
`Pause seq(C nCr X,X,0,C`

seanlego23 wrote:
I've heard that Input was a better command than Prompt. Is there a difference?
For the results: no, but with Input you can display another string, which is sometimes useful.

Side question: can we assume A, B and D are integers?
Okay, since you are doing this on a CE, I'd recommend just using ToString CE by MateoConLechuga instead of pure basic. This will be much faster and allow for you to save a ton of bytes. Besides, although it has not yet been officially announced (I think?) the command should come out in the next OS revision.

Register to Join the Conversation
Have your own thoughts to add to this or any other topic? Want to ask a question, offer a suggestion, share your own programs and projects, upload a file to the file archives, get help with calculator and computer programming, or simply chat with like-minded coders and tech and calculator enthusiasts via the site-wide AJAX SAX widget? Registration for a free Cemetech account only takes a minute.

»
» Goto page 1, 2  Next
» All times are GMT - 5 Hours

You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum