Pregunta

('1' * N) !~ /^1?$|^(11+?)\1+$/

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

¿Fue útil?

Solución

Otros consejos

Probablemente sea un tema fuera de tema, pero en Ruby 1.9, puedes hacer esto:

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

Prime.prime?(4)
# => false

Prime.prime?(5)
# => true

O:

require 'prime'

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

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

Vea también ¿Cuál es la expresión regular más brillante que usted y # 8217 ; ¿alguna vez has usado? (y sí, puedo confirmar que esta expresión regular fue escrita originalmente por Abigail. Incluso la he escuchado explicar cómo funciona :)

El mayor divisor común (gcd):

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

Tanto esto como is_prime one funcionan de la misma manera. Intenta todas las combinaciones antes de renunciar.

Este intentará 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.

Otro blog con una muy buena explicación: Famoso Perl One-Liners Explicado (parte III)

Si la longitud de una cadena de 1 es compuesta, entonces la cadena se puede descomponer en múltiples subcadenas idénticas, como 111111 - > 11 11 11

Por ejemplo, 1111111111, tiene 10 1's, y coincide con (11) {5} o (11111) {2}, donde {2} significa repetido 2 veces. 111111111, tiene 9 1's, 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 posteriores.

La parte ^ 1? $ en las primeras comprobaciones de alternancia para 0 y 1 casos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top