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