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&amp;data=02%7C01%7C%7C8d2147240443485c7f
>> > >>> 8c08d61445ac18%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63671868
>> > >>> 6798916834&amp;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&amp;data=02%7C01%7C%7Cfbcf68689bed4e31e2
>> > >>> 8108d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63672025
>> > >>> 5064176871&amp;sdata=0sleKYElksLSP%2BOT8BYYtyzcuL3GTBuL14taSrgJQS8%3
>> > >>> D&amp;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&amp;data=02%7C01%7C%7Cfbcf68689bed4e31e28108d6
>> > >> 15b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636720255064176
>> > >> 871&amp;sdata=kMQGWHLjMejRbJOuSn5EvWU4j39TqVPCX73QNKV6k7g%3D&amp;rese
>> > >> rved=0
>> > >> ---------------------------------------------------------------------
>> > >> - For information about J forums see
>> > >> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww
>> .
>> > >> jsoftware.com
>> %2Fforums.htm&amp;data=02%7C01%7C%7Cfbcf68689bed4e31e281
>> > >> 08d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63672025506
>> > >> 4176871&amp;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&amp;data=02%7C01%7C%7Cfbcf68689bed4e31e28108
>> > > d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63672025506417
>> > > 6871&amp;sdata=0sleKYElksLSP%2BOT8BYYtyzcuL3GTBuL14taSrgJQS8%3D&amp;re
>> > > served=0
>> >
>> > ----------------------------------------------------------------------
>> > For information about J forums see
>> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.jsoftware.com%2Fforums.htm&amp;data=02%7C01%7C%7Cfbcf68689bed4e31e28108d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636720255064176871&amp;sdata=0sleKYElksLSP%2BOT8BYYtyzcuL3GTBuL14taSrgJQS8%3D&amp;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

Reply via email to