Note the 2nd to last "step" is superfluous - the same as the previous line with slightly different spacing!
On Mon, Sep 10, 2018 at 6:11 PM Ric Sherlock <[email protected]> wrote: > The following is a simple refactoring of the original: > > pmt=: {: * 1&{ ((% <:)@(^~ >:) * ]) 1200 %~ {. > pmt 5.75 240 12500 > 87.7604 > > > The steps to get there went something like this: > pmt > =: 3 : 0 > ' > r t b'=. y > d=. (1 + > r % 1200) ^ t > > b*(r % 1200) * d % d - 1 > ) > > pmt=: 3 : 0 > 'r t b'=. y > > b * > r (%&1200@[ * ((1 + %&1200)@[ ^ ]) % (1 -~ (1 + %&1200)@[ ^ ]) ) t > ) > > pmt=: 3 : 0 > ' > r t b'=. y > > b * t ( %&1200@] * (^~ 1 + %&1200) % <:@(^~ 1 + %&1200) ) r > ) > > pmt=: {: * 1&{ ( %&1200@] * (^~ 1 + %&1200) % <:@(^~ 1 + %&1200) ) {. > > pmt=: {: * 1&{ ( %&1200@] * (% <:)@(^~ 1 + %&1200) ) {. > > pmt=: {: * 1&{ ( (% <:)@(^~ 1 + %&1200) * %&1200@] ) {. > > pmt=: {: * 1&{ ((% <:)@(^~ 1 + %&1200) * %&1200@]) {. > > pmt=: {: * 1&{ ((% <:)@(^~ >:) * ]) 1200 %~ {. > > On Mon, Sep 10, 2018 at 4:55 PM Raul Miller <[email protected]> wrote: > >> x=:0 is bad form, so I am going to ignore that part. >> >> In fact, I'd eliminate all internal =: from that definition and start >> with: >> >> pmt=: 3 : 0 >> 0 pmt y >> : >> 'r t b'=. y >> D=.(1 + r % 1200) ^ t >> b*(r % 1200) * D % D - 1 >> ) >> >> And our paranoia test is: >> pmt 5.75 240 12500 >> 87.7604 >> >> The next issue is that we're working with more than two values, that >> makes it a bit complicated. >> >> On the other hand, we never use x - if it's provide we ignore it. So >> I'm going to ignore it here. If that bothers you, use pmt=: pmt&] f. >> after we've got the tacit expression. (Using f. on the final >> expression will also protect from some damage if you happen to run the >> original with it's D=: expression...). >> >> Anyways... >> >> To simplify this slightly, notice that we never want to use the value >> of r. Instead, we always want r%1200. So we can divide y by 1200 1 1 >> and work the remainder of the dyadic expression becomes: >> >> pmt1200=: 3 : 0 >> 'r t b'=. y >> D=.(1 + r) ^ t >> b*r * D % D - 1 >> ) >> >> A tacit expression to compute D directly from this y would be: >> D=: [: (^~ >:)/ (2 3$0 1 0 1 0 0) +/ .* ] >> >> with that definition of D, pmt1200 can be >> pmt1200 =: (%<:)@D * 1 0 1 */ .# ] >> >> and our tacit pmt becomes >> pmt=: pmt1200@(%&1200 1 1) >> >> Trying it out: >> pmt 5.75 240 12500 >> 87.7604 >> >> Good enough? >> >> -- >> Raul >> On Sun, Sep 9, 2018 at 9:55 PM Linda Alvord <[email protected]> >> wrote: >> > >> > Here's a classic. Can anyone write this in tacit? >> > >> > NB. Mortgage is Rate Months Loan >> > >> > pmt=: 3 : 0 >> > (x =: 0) pmt y >> > : >> > 'r t b'=:y >> > D=:(1 + r % 1200) ^ t >> > b*(r % 1200) * D % D - 1 >> > ) >> > >> > pmt 5.75 240 12500 >> > >> > In 1961 I bought a house for $17,000. With a loan of $12,000 at 5.75 >> interest for 20 years. As a tenured teacher and a woman no bank would give >> me a mortgage but for 20 years I payed the previous woman owner $87.77. At >> the last payment it just so happened that I sold it. >> > >> > Linda >> > >> > -----Original Message----- >> > From: Programming <[email protected]> On Behalf >> Of 'Mike Day' via Programming >> > Sent: Saturday, September 8, 2018 1:45 PM >> > To: [email protected] >> > Subject: Re: [Jprogramming] Tacit form: How to handle intermediate >> > >> > Agreed on the "strong hint" in herona below. I got into that habit >> > >> > years ago in Fortran.... >> > >> > And Sorry for the unintentional extra characters. (I'm seeing >> > >> > A-circumflex where I'd typed space!) Just as well we're not talking APL! >> > >> > Mike >> > >> > >> > On 08/09/2018 09:40, Martin Kreuzer wrote: >> > > @Linda >> > > >> > > I think that your >> > > heron=: 13 :'%:*/(s y),(s y)-y' >> > > looks superior to my initial approach as it gathers _all four_ factors >> > > under the (*/) Times Insert. >> > > >> > > btw "Hope you have good classes!" >> > > >> > > For quite some time, I don't have classes any more, but once in a >> > > while do private tutoring; my last two students finished their >> > > 'matura' at Easter this year (and one of them is on 'work & travel' in >> > > New Zealand presently). >> > > >> > > @Mike >> > > >> > > Looking at your 'minor change' and the resulting tacit code, methinks >> > > that (sy=. s - y) is giving the interpreter a much stronger hint that >> > > there's a re-used intemediate result than the construct (' ... [ s2=. >> > > .... ') I used initially. >> > > >> > > -M >> > > >> > > At 2018-09-07 09:43, you wrote: >> > > >> > >> Fair enough, it looks neat, but doesn't deal with Martin >> > >> Kreuzer's original requirement to apply s just the once, ie how >> > >> should we handle the intermediate result, s? >> > >> >> > >> On the other hand, David Lambert and others propose variations on how >> > >> to factor the formula so as to use the result of s. >> > >> >> > >> It's usually easy in explicit form, harder in tacit form. It >> > >> seems to me that using 13 : ... is very helpful in developing a tacit >> > >> form, but it often fails to spot opportunities to save intermediate >> > >> results. 13 : ... isn't an optimising compiler - or is it? It >> > >> certainly doesn't spot the opportunity to save the repeated (s y) in >> > >> Linda's example. >> > >> >> > >> Somewhat to my surprise, a minor change to Linda's explicit >> > >> expression does result in a single applicaton of s in a quite elegant >> > >> tacit form: >> > >> >> > >>    herona=: 13 :'%:*/sy,(sy=.s y)-y' >> > >> >> > >>    herona 3 4 5 >> > >> >> > >> >> > >> >> > >>    herona 5 12 13 >> > >> >> > >> 30 >> > >> >> > >>    herona >> > >> >> > >> [: %: [: */ s ([ , -) ] >> > >> >> > >> >> > >> Cheers, >> > >> >> > >> Mike >> > >> >> > >> On 07/09/2018 08:19, Linda Alvord wrote: >> > >>> It keeps getting simpler: >> > >> >> > >>> s=: 13 :'-:+/y' >> > >>> heron=: 13 :'%:*/(s y),(s y)-y' >> > >>> heron 3 4 5 >> > >>> heron 4 5 6 >> > >>> d >> > >> >> > >> >> > >>> ;:'[: -: +/' >> > >> >> > >>> heron >> > >> >> > >>> ;:'[: %: [: */ s , s - ]' >> > >>> >> > >> >> > >>> Explisit sentences are like English and the new language is the >> > >>> computers J anguage. First learn the words and then learn to read >> > >>> ghe ords in sentences. And just as you might when learning Spanish, >> > >>> you might in time begin to speak it. >> > >> >> > >>> Linda >> > >> >> > >> >> > >>> -----Original Message----- >> > >>> From: Programming <[email protected]> On >> > >>> Behalf Of David Lambert >> > >>> Sent: Thursday, September 6, 2018 6:11 PM >> > >>> To: programming <[email protected]> >> > >>> Subject: Re: [Jprogramming] Tacit form: How to handle intermediate >> > >> >> > >>> A hook can save recomputation. >> > >> >> > >>> (computation with original data and reused me) (resuse me) >> > >> >> > >> >> > >>>   test=: [: %: ([: -: +/) * [: */ ([: -: +/) - ] >> > >> >> > >>>   NB. play with the half factor >> > >>>   f=:   4 %~ [: %: [: */ (([ , (- +:))~ +/) >> > >> >> > >>>   NB. shorter >> > >> >> > >>>   NB.   c o m p u t a t i o n   r e u s e >> > >>>   g=:   ([: %: [: */ [ , -)~    ([: -: +/) >> > >> >> > >>>   g2=:  ([: %: [: */ [ , -)~ -:@:(+/) >> > >> >> > >> >> > >>>   %/ (g , test) 3?@:$0 >> > >>> 1 >> > >> >> > >> >> > >>> On 09/04/2018 08:00 AM, [email protected] >> wrote: >> > >>>> Date: Tue, 04 Sep 2018 11:50:43 +0000 >> > >>>> From: Martin Kreuzer<[email protected]> >> > >>>> To:[email protected] >> > >>>> Subject: [Jprogramming] Tacit form: How to handle intermediate >> > >>>> result..? >> > >>>> Message-ID: >> > >>>> <[email protected]> >> > >>>> Content-Type: text/plain; charset="us-ascii"; format=flowed >> > >>>> >> > >>>> Hi all - >> > >>>> >> > >>>> To calculate the area of a flat triangle, using Heron's formula, >> > >>>> A(a,b,c)= sqrt( s2*(s2-a)*(s2-b)*(s2-c) ) I wrote a simple function >> > >>>> doing this: >> > >>>> >> > >>>> * get the three sides (as list input y) >> > >>>> * compute the half perimeter s2 >> > >>>> * build the differences s2-y >> > >>>> * build product >> > >>>> * take square root >> > >>>> >> > >>>> My explicit solution looks like this >> > >>>> >> > >>>> taher=: 13 : '%: s2 * */ s2-y [ s2=. -: +/ y' >> > >>>> >> > >>>> and works >> > >>>> >> > >>>> taher 3 4 5 >> > >>>> 6 >> > >>>> >> > >>>> Suggested tacit version looks like this (and works too) >> > >>>> >> > >>>> tahert=: [: %: ([: -: +/) * [: */ ([: -: +/) - ] >> > >>>> >> > >>>> Q: Is there a way to reference the intermediate result of ([: -: >> > >>>> +/) the half perimeter s2 within the tacit expression, as has been >> > >>>> done in the explicit..? >> > >>>> [Guess the interpreter takes care of this anyway; my question aims >> > >>>> at whether a shorter formulation could be reached.] >> > >>>> >> > >>>> Thanks >> > >>>> -M >> > >>> -------------------------------------------------------------------- >> > >>> -- >> > >>> For information about J forums see >> > >>> >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww >> > >>> .jsoftware.com >> %2Fforums.htm&data=02%7C01%7C%7C8d2147240443485c7f >> > >>> 8c08d61445ac18%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63671868 >> > >>> 6798916834&sdata=Yuys8QE3yMvBtUraCohR9dRgPugZDeNaNh3BoBCzJjU%3D& >> > >>> amp;reserved=0 >> > >>> -------------------------------------------------------------------- >> > >>> -- For information about J forums see >> > >>> >> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww >> > >>> .jsoftware.com >> %2Fforums.htm&data=02%7C01%7C%7Cfbcf68689bed4e31e2 >> > >>> 8108d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63672025 >> > >>> 5064176871&sdata=0sleKYElksLSP%2BOT8BYYtyzcuL3GTBuL14taSrgJQS8%3 >> > >>> D&reserved=0 >> > >> >> > >> >> > >> >> > >> --- >> > >> This email has been checked for viruses by Avast antivirus software. >> > >> >> https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww >> > >> .avast.com >> %2Fantivirus&data=02%7C01%7C%7Cfbcf68689bed4e31e28108d6 >> > >> 15b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636720255064176 >> > >> 871&sdata=kMQGWHLjMejRbJOuSn5EvWU4j39TqVPCX73QNKV6k7g%3D&rese >> > >> rved=0 >> > >> --------------------------------------------------------------------- >> > >> - For information about J forums see >> > >> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww >> . >> > >> jsoftware.com >> %2Fforums.htm&data=02%7C01%7C%7Cfbcf68689bed4e31e281 >> > >> 08d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63672025506 >> > >> 4176871&sdata=0sleKYElksLSP%2BOT8BYYtyzcuL3GTBuL14taSrgJQS8%3D&am >> > >> p;reserved=0 >> > > >> > > ---------------------------------------------------------------------- >> > > For information about J forums see >> > > >> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.j >> > > software.com >> %2Fforums.htm&data=02%7C01%7C%7Cfbcf68689bed4e31e28108 >> > > d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63672025506417 >> > > 6871&sdata=0sleKYElksLSP%2BOT8BYYtyzcuL3GTBuL14taSrgJQS8%3D&re >> > > served=0 >> > >> > ---------------------------------------------------------------------- >> > For information about J forums see >> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.jsoftware.com%2Fforums.htm&data=02%7C01%7C%7Cfbcf68689bed4e31e28108d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636720255064176871&sdata=0sleKYElksLSP%2BOT8BYYtyzcuL3GTBuL14taSrgJQS8%3D&reserved=0 >> > ---------------------------------------------------------------------- >> > For information about J forums see http://www.jsoftware.com/forums.htm >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
