Question
('1' * N) !~ /^1?$|^(11+?)\1+$/
Sur le net, j’ai trouvé ce code Ruby qui fonctionne pour N > = 0 et qui détermine si N est un nombre premier. D'après ce que je peux dire, cela ressemble à jouer avec regex mais je n'ai aucune idée de la façon dont cela fonctionne. Quelqu'un pourrait-il me dire comment cela fonctionne?
La solution
Vous pouvez trouver une longue explication de ce code ici: www.noulakaz.net/weblog/2007/03/18/a-expression-tentaire-check-pour-les-nombre-prime/
Autres conseils
Ceci est probablement plutôt hors sujet, mais en Ruby 1.9, vous pouvez le faire:
require 'mathn'
38749711234868463.prime?
=> false
require 'prime'
Prime.prime?(4)
# => false
Prime.prime?(5)
# => true
Ou:
require 'prime'
Prime.instance.prime?(4)
# => false
Prime.instance.prime?(5)
# => true
Voir aussi Quelle est la regex la plus brillante que vous avez # 8217 ; ai-je déjà utilisé? (et oui, je peux confirmer que cette expression rationnelle a été écrite à l'origine par Abigail. Je l'ai même entendue expliquer son fonctionnement:)
Le plus grand commun diviseur (gcd):
/^(1+)\1*=\1+$/.match('1' * x + '=' + '1' * y)[1].length
this et is_prime one fonctionnent à peu près de la même manière. Il essaie toutes les combinaisons avant d'abandonner.
Celui-ci essaiera de scinder le premier nombre en parties paires et de faire correspondre le deuxième nombre avec une ou plusieurs de ces parties. S'il trouve une correspondance, il renvoie la longueur de la pièce sélectionnée.
Encore un autre blog avec une assez bonne explication: célèbre Perl One-Liners Explained (Part III)
Si la longueur d'une chaîne de 1 est composite, elle peut être décomposée en plusieurs sous-chaînes identiques, comme 111111 - > 11 11 11
Par exemple, 1111111111 a 10 1 et correspond à (11) {5} ou (11111) {2}, où {2} signifie répété 2 fois. 111111111, a 9 1 et il correspond (111) {3}.
En généralisant le nombre de 1 et le nombre entre {}, l'expression rationnelle est
/ (1 {2,}) {2,} /
.
Cependant, 1 {2,} peut également être écrit en 11+, et (...) {2,} en (...) \ 1+, avec des références arrières.
La partie ^ 1? $
de la première alternance recherche les cas 0 et 1.