41 bytes version initially golfed from @Georg_Tavonius entry ( http://twitter.com/#!/Georg_Tavonius/status/97239621959815170 )
-
-
Save p01/1115434 to your computer and use it in GitHub Desktop.
| function( | |
| n, // the number | |
| i // placeholder counter | |
| ){ | |
| for(i=n;n%--i;); // keeps going until the modulo is falsy like n%1 for instance | |
| return i<2 | |
| } |
| function(n,i){for(i=n;n%--i;);return i<2} |
| DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
| Version 2, December 2004 | |
| Copyright (C) 2011 Mathieu 'p01' Henri <http://www.p01.org/releases/> | |
| Everyone is permitted to copy and distribute verbatim or modified | |
| copies of this license document, and changing it is allowed as long | |
| as the name is changed. | |
| DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
| TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
| 0. You just DO WHAT THE FUCK YOU WANT TO. |
| { | |
| "name": "isPrimeNumber", | |
| "description": "Check if a number is prime in 41bytes.", | |
| "keywords": [ | |
| "isPrimeNumber", | |
| "prime", | |
| "number" | |
| ] | |
| } |
| <!DOCTYPE html> | |
| <title>isPrimeNumber</title> | |
| <div>Expected values: <b>false,true</b></div> | |
| <div>Actual value: <b id="ret"></b></div> | |
| <script> | |
| var myFunction = function(n,i){for(i=n;n%--i;);return i<2}; | |
| document.getElementById( "ret" ).innerHTML = myFunction(140)+','+myFunction(541); | |
| </script> |
@Yaffle: you can use * instead of && in the for loop, because false coerces to zero.
Update: operator precedence failed me... sorry. My current result is:
function(n,i){for(i=1;++i<=n&&n%i;);return i==n}
Nice move putting the n%i inside the condition. Yaffle's i*i speed optimization and fix for the case for 0 and 1 were a nice touch.
Here's a 47 bytes version of Atk's golf:
function(n,i){for(i=1;n>++i&&n%i;);return i==n}
then a 55bytes version with Yaffle's improvements:
function(n,i){for(i=1;n>++i*i&&n%i;);return n<2||i*i>n}
And 52bytes with fixing the case for 0 and 1:
function(n,i){for(i=1;n>++i&&n%i;);return n<2||i==n}
:D/ reversing the loop brought this puppy down to 46 bytes with the fix for the case 0 and 1
function(n,i){for(i=n;n%--i;);return n<2||i<2}
EDIT: Actually the n<2|| is not necessary anymore due the falsiness of x%1 and x%0. And that, gentlemen, brings us to 41 bytes:
function(n,i){for(i=n;n%--i;);return i<2}
Nice!
But I think 0 and 1 shouldn't be identified as prime numbers.
Ref: http://oeis.org/A000040
return i==1 instead of return i<2 will return correctness of function at the expense of a byte.
42 is a nice number anyway.
If javascript could better handle large numbers this could be done in 30 bytes via Fermat's little theorem:
function(n){return(1<<n)%n==2}
Sadly, this function only works for numbers less than 30 due to the poor handling of math in JavaScript.
@mattneary: I think even JavaScript could handle large numbers, your code won't work.
Because some non-prime numbers (e.g. 341) can pass the test.
I mean the theorem cannot tell whether a number is really a prime number or not, 341 is an example(It passes the test even it is not a prime number).
function(n,i){for(i=2;i_i<=n&&n%i;i++);return n>1&&i_i>n}