2008-09-29 15 views
24
('1' * N) !~ /^1?$|^(11+?)\1+$/ 

En la red, encontré este fragmento de código de Ruby que funciona para N> = 0 que determina si N es o no un primo. Por lo que puedo decir, parece jugar con expresiones regulares, pero no tengo idea de cómo funciona. ¿Podría alguien decirme cómo funciona?Ruby isPrime Método

+0

Lo que tienes es una acusación de la sintaxis de Ruby oscura? Si es así, estoy totalmente de acuerdo, ¡guau es tan oscuro! –

+1

¿Qué quiere decir con "sintaxis oscura de Ruby"? Las expresiones regulares se ven más o menos iguales en todos los idiomas, ¿no? –

+4

Esto es solo una expresión regex oscura, en realidad no tiene nada que ver con ruby ​​ –

Respuesta

1

máximo común divisor (mcd):

/^(1+)\1*=\1+$/.match('1' * x + '=' + '1' * y)[1].length 

Tanto ésta como la is_prime uno trabaja en aproximadamente la misma forma. Prueba todas las combinaciones antes de darse por vencido.

Éste tratará de dividir el primer número en partes pares, y unir el segundo número con una o más de esas partes. Si encuentra una coincidencia, devuelve la longitud de la parte seleccionada.

20

Esta es, probablemente, más bien fuera de tema, pero en Rubí 1.9, se puede hacer esto:

require 'mathn' 
38749711234868463.prime? 
=> false 
1

Si la longitud de una cadena de 1s es compuesto, entonces la cadena se puede descomponer en varias subseries idénticos, como 111111 - > 11 11 11

Por ejemplo, 1111111111, tiene 10 1, e iguala (11) {5} o (11111) {2}, donde {2} significa repetido 2 veces. 111111111, tiene 9 1, y coincide con (111) {3}.

Al generalizar el recuento de 1 y el número en {}, la expresión regular es /(1{2,}){2,}/. Sin embargo, 1 {2,} también se puede escribir como 11+, y (...) {2,} se puede reescribir como (...) \ 1+, con referencias retrospectivas.

La parte ^1?$ en la primera alternancia comprueba 0 y 1 casos.

3
require 'prime' 

Prime.prime?(4) 
# => false 

Prime.prime?(5) 
# => true 

O:

require 'prime' 

Prime.instance.prime?(4) 
# => false 

Prime.instance.prime?(5) 
# => true