On Tue, Oct 13, 2009 at 5:30 PM, Barry Rowlingson <b.rowling...@lancaster.ac.uk> wrote: > On Tue, Oct 13, 2009 at 2:41 PM, Thomas Lumley <tlum...@u.washington.edu> > wrote: >> On Tue, 13 Oct 2009, AJ83 wrote: >> >>> >>> I need to create a function to find all the prime numbers in an array. Can >>> anyone point me in the right direction? > > This almost sounds like a homework problem to me... So here's a > solution that you can happily present to a tutor - if you can explain > how it works, then you deserve full marks!
This almost sounds like an extra assignment to me :-) > > primer=function(v){ > return(regexpr("^1$|^(11+?)\\1+$",unlist(lapply(v,function(z){paste(rep("1",z),sep='',collapse='')})),perl=TRUE) > == -1) > } > > Test: > > > (1:30)[primer(1:30)] > [1] 2 3 5 7 11 13 17 19 23 29 > > I'm not sure how big a number this works for.... > > R golf anyone? I take the challenge and give AJ some more stuff to think about. First the obvious : primer=function(v){ return(regexpr("^1$|^(11+?)\\1+$",sapply(v,function(z){paste(rep("1",z),sep='',collapse='')}),perl=TRUE) == -1) } Test : > (1:30)[primer(1:30)] [1] 2 3 5 7 11 13 17 19 23 29 Shorter, if I keep the same use of the function primer : primer=function(v){ return(sapply(v,function(z){sum(z/1:z==z%/%1:z)})==2) } (1:30)[primer(1:30)] [1] 2 3 5 7 11 13 17 19 23 29 nchar("primer=function(v){ . . . (1:30)[primer(1:30)]") [1] 97 This works for all numbers. It also allows for a function primes : primes=function(v){ return(v[sapply(v,function(z){sum(z/1:z==z%/%1:z)==2})]) } primes(1:30) [1] 2 3 5 7 11 13 17 19 23 29 > nchar("primes=function(v){ . . . primes(1:30)") [1] 91 Cheers Joris ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.