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 <lindaalvor...@outlook.com> 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 <programming-boun...@forums.jsoftware.com> On Behalf Of 
> 'Mike Day' via Programming
> Sent: Saturday, September 8, 2018 1:45 PM
> To: programm...@jsoftware.com
> 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 <programming-boun...@forums.jsoftware.com> On
> >>> Behalf Of David Lambert
> >>> Sent: Thursday, September 6, 2018 6:11 PM
> >>> To: programming <programm...@jsoftware.com>
> >>> 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, programming-requ...@forums.jsoftware.com wrote:
> >>>> Date: Tue, 04 Sep 2018 11:50:43 +0000
> >>>> From: Martin Kreuzer<i...@airkreuzer.com>
> >>>> To:programm...@jsoftware.com
> >>>> Subject: [Jprogramming] Tacit form: How to handle intermediate
> >>>>         result..?
> >>>> Message-ID:
> >>>> <5b8e71a5.1c69fb81.65e5c.4a9esmtpin_added_miss...@mx.google.com>
> >>>> 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

Reply via email to