Учитывая десятичное число N
как строку цифр, как проверить, делится ли оно на M
, используя только регулярные выражения, не преобразовывая в int?
M = 2, 4, 5, 10 очевидны. Для M = 3 здесь есть несколько интересных идей: Число фильтров регулярных выражений делится на 3
Может ли кто-нибудь предоставить решение для M = 7, 9, 11, 13 и т.д.? Общий?
Тестирование кода (в python, но не стесняйтесь использовать любой язык):
M = your number, e.g. 2
R = your regexp, e.g., '^[0-9]*[02468]$'
import re
for i in range(1, 2000):
m = re.match(R, str(i))
if i % M:
assert not m, '%d should not match' % i
else:
assert m, '%d must match' % i
Для любопытных, вот пример для M=3
(предполагает двигатель с поддержкой рекурсии):
^
(
| [0369]+ (?1)
| [147] (?1) [258] (?1)
| [258] (?1) [147] (?1)
| ( [258] (?1) ) {3}
| ( [147] (?1) ) {3}
)
$
Обновление: для более подробного обсуждения и примеров см. этот поток. Выражение, опубликованное там, оказалось ошибочным (не работает на 70 * N), но часть "как туда добраться" очень воспитательна.