Sorry I didn't reply before, I just came back from a trip. I'll take a better
look soon.
Those are all good and fair points, and some clever solutions too!I tend to
think (almost) everything should be methods, and where applicable optimized for
the class, but that could be just my deviation (I have smalltalk seizures
sometimes :P).
Thank you both, Александр and Jon!Fede s.
El Jueves, 26 de enero, 2017 8:27:43, Jon Harper <jon.harpe...@gmail.com>
escribió:
Hi,
instead of creating range-unclip, a simpler idea is to use unclip-slice.
this article has some insights regarding unclip vs unclip-slice :
http://docs.factorcode.org/content/article-sequences-slices.html
You can also look at the word next-prime from math.primes
http://docs.factorcode.org/content/word-next-prime,math.primes.html
Usually, we do not add the recursive declaration to non-combinators recursive
words (see http://docs.factorcode.org/content/word-recursive,syntax.html )
I'm not sure if creating specialized words to unclip (or more generally create
new ranges from previous ranges) is useful, because most of the time you have
one range on which you iterate, not recursive creations of ranges. You can use
unclip-slice, cut-slice etc for that.
Regarding your problem, here's a solution for posterity :)
A very simple prototype implementation could be:
USE: math.primes
: gap ( gap from to -- pair/f )
primes-between dup rest zip [ first2 swap - = ] with find nip ;
It's too simple because it computes all the primes until the end in a vector
and then looks for the gap.
Here's a more complex version with locals to compute primes and check for the
gap on the fly:
:: gap ( gap from to -- pair/f )
from 1 - next-prime dup next-prime
[ 2dup [ swap - gap = ] [ to > ] bi or ]
[ nip dup gap 1 - + next-prime ] until
dup to > [ 2array ] [ 2drop f ] if ;
I think it could be made simpler but didn't try very hard.
Jon
Jon
On Thu, Jan 26, 2017 at 6:59 AM, Alexander Ilin <ajs...@yandex.ru> wrote:
Hello, fede s! I'm guessing, unclipping a range (which is a small tuple)
produces a huge array of integers. It feels like In this algorithm you don't
need any arrays at all, a simple iteration would suffice. Plus, you don't need
to check all the numbers with prime?, only the odd ones, so unlcip is doubly
unfit here as the propulsion engine. The idea of doing the special range-unclip
is fine. Although the current implementation never ends producing the "first"
elements, even after the range is exhausted. This is due to the possibility of
having ranges with negative step slot, as in `5 -5 [a,b]`. The regular `unclip`
on the other hand, throws an error when applied to an empty sequence. I've
looked at the code, and I don't see a way to override the word unclip to work
on ranges in the more optimal way that you suggest. Maybe some specialized
words like range-unclip could be added to math.ranges? 23.01.2017, 02:24, "fede
s" <elfeder...@yahoo.com.ar>:
Hi, I noticed this Q in StackExchange http://codereview.
stackexchange.com/questions/ 153288/codewars-gap-in-primes
and attempted a (naive) solution for the problem: : next-prime ( range -- rest
prime? )
dup empty?
[ f ]
[ unclip dup prime?
[ drop next-prime ] unless
] if ; recursive
:: check-gap ( gap prev rest last -- g p r l ? )
gap prev rest last
prev last - gap = ;
: (primes-gap) ( gap range last -- n1? n2? )
swap next-prime dup
[ check-gap
[ nip rot drop ]
[ [ drop ] 2dip (primes-gap) ]
if ]
[ 4 ndrop f f ] if ; recursive
: primes-gap ( gap from to -- n1? n2? )
[a,b] next-prime over
[ (primes-gap) ]
[ 3drop f f ] if ; For that version,[ 8 3,000,000 4,000,000 primes-gap [ .
] bi@ ] timegave 59 seconds on my system, most spent on unclip. I changed: :
range-unclip ( r -- r' 1st )
[ first 1 + ] [ last [a,b] ] [ first ] tri ;
: next-prime ( range -- rest prime? )
dup empty?
[ f ]
[ range-unclip dup prime?
[ drop next-prime ] unless
] if ; recursive which gave only "Running time: 0.000342938 seconds" Factor
0.98 x86.64 (1777, heads/master-ed29fbd93f, Mon Aug 8 20:45:47 2016)
[Microsoft Visual C++ 190023506] on windows 7 I know there have been some
changes since then, and that I'm probably doing things in a very sub-optimal
way, but thought that there may still be something of value here.
---=====---Александр
------------------------------ ------------------------------ ------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
______________________________ _________________
Factor-talk mailing list
Factor-talk@lists.sourceforge. net
https://lists.sourceforge.net/ lists/listinfo/factor-talk
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk