Well,

load 'strings'
   f =. x:1%2+10000%~i.10001  NB. Generate equal-spaced floating fractions
between 1/3 and 1/2
  k =. 12001>".(": f) rplc ' ';',';'r';','   NB. Find all numerators and
denominators less than 12001

counts all numerators and denominators below 12000 as separate entities.
Unfortunately, that
wasn't what the problem asked.

In order to count only rational fractions between 0.5 & 0.333 where both
the numerator and the denominatorhave values of 12000 or less, we need to
add one more line to the program that pairs the
numerator and denominator comparisons, and then "ands" them, to find
fractions that have
both the numerator and denominator below 12001.

   +/ *./"1(10001 2) $ k     NB. And values pairwise & sum.

That should get the correct answer. The whole thing takes less that 2
seconds to run on my machine.

Skip




Skip Cave
Cave Consulting LLC


On Sun, Jun 15, 2014 at 6:39 PM, Raul Miller <[email protected]> wrote:

> I generally avoid project euler, because I do not like working under its
> constraint on disclosure. So I'm pleased when something leaks out that I
> can play with. But I also try to live within the implied spirit of the
> contest, so I'm not going to release my code.
>
> Still: a quick calculation suggests that J's floating point representation
> is adequate for this problem (and gives a 30x speed improvement over use of
> rationals). Also, a trivial approach seems plenty adequate here
>
> Thanks,
>
> --
> Raul
>
>
>
> On Sun, Jun 15, 2014 at 7:07 PM, David Lambert <[email protected]>
> wrote:
>
> > On 15/06/2014 16:59, Jon Hough wrote:
> >>
> >>> >Another Project Euler... (apologies)
> >>> >#73http://projecteuler.net/problem=73
> >>>
> >>> >I found this one more tricky than it first seems.
> >>> >My attempt fails.
> >>> >My reasoning of solution. Trying to find all reduced fractions with
> >>> denominator and numerator in range 1... 12000 that are greater than
> 1/3 but
> >>> less than 1/2.The most naive way would be to make a 12000x12000 grid of
> >>> fractions, nubbing out duplicates.
> >>>
> >>
> >    Note 'Naive solution to PE 73'
> > Generate all the fractions one denominator at a time
> > using  low  memory.   The program  exceeds  the  one
> > minute time requirement even on your new computer.
> >
> > Method: insert  a verb into a  list of denominators.
> > The verb is necessarily a  dyad.  y retains the list
> > of  unique  fractions,  x  (a scalar)  is  the  next
> > denominator to evaluate.  Therefor the verb could be
> > a hook that generates  new fractions of one argument
> > which it appends and  nubs with the other, producing
> > a  "current result".   We'll start  with a  "current
> > result" of 0, removed as a post-processing step.
> > )
> >
> >    Filter=: (#~`)(`:6)
> >    odd=: 2&|
> >    odd Filter i.5
> > 1 3
> >
> >    NB. generate the denominators and initial solution of 0
> >    NB. Accumulating the results from few to many decreases
> >    NB. the computational work.
> >    data=: i.@:(_1x&-)
> >    data 8
> > 8 7 6 5 4 3 2 1 0
> >
> >    numerators=: >.@:-: (] + i.@:-) <.@:(1r3&*)
> >
> >    boxdraw_j_ 1
> >
> >    numerators&.>  8 14
> > +---+-----+
> >
> > |2 3|4 5 6|
> > +---+-----+
> >    fractions =: %~ numerators
> >
> >    ~.@:(, fractions)~/ data 8
> >    0 1r3 1r4 1r5 2r5 2r7 3r7 3r8
> >
> >    (1r3&< *. <&1r2)Filter ~.@:(, fractions)~/ data 8
> > 2r5 3r7 3r8
> >
> >    #  (1r3&<*.<&1r2)Filter~.@:(, fractions)~/  data 8
> > 3
> >
> >
> >   NB. watch progress
> >
> >   show=: [ smoutput
> >
> >   # (1r3&<*.<&1r2)Filter~.@:(, fractions@:show)~/ data  500
> >
> >
> > ----------------------------------------------------------------------
> > 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