Четвёртый открытый Зеленоградский турнир 2008

RegExp мастер

Дан набор из 10 заданий. К каждому из них необходимо написать валидное Регулярное Выражение (Regular Expression) минимального размера в формате C (текущей версии установленной на сервере SPOJ). Каждое выражение будет протестировано на специально составленном наборе данных, содержащем правильные и не правильные выражения. Составленное вами выражение должно корректно отработать на всех тестах.

Задача 1 Написать регулярное выражение определяющее является ли данная строчка строкой "abcdefghijklmnopqrstuv18340" или нет.

Пример правильных выражений:
abcdefghijklmnopqrstuv18340
Пример неправильных выражений:
abcdefghijklmnoasdfasdpqrstuv18340

Задача 2 Написать регулярное выражение определяющее является ли данная строчка GUID с или без скобок. Где GUID это строчка, состоящая из 8, 4, 4, 4, 12 шестнадцатеричных цифр разделенных тире.

Пример правильных выражений:

{e02fa0e4-01ad-090A-c130-0d05a0008ba0}
e02fd0e4-00fd-090A-ca30-0d00a0038ba0


Пример неправильных выражений:
02fa0e4-01ad-090A-c130-0d05a0008ba0}
e02fd0e400fd090Aca300d00a0038ba0


Задача 3 Написать регулярное выражение определяющее является ли заданная строка правильным MAC-адресом.

Пример правильных выражений:
01:32:54:67:89:AB
aE:dC:cA:56:76:54


Пример неправильных выражений:
01:33:47:65:89:ab:cd
01:23:45:67:89:Az


Задача 4 Написать регулярное выражение определяющее является ли данная строчка валидным URL адресом. В данной задаче правильным URL считаются адреса http и https, явное указание протокола также может отсутствовать. Учитываются только адреса, состоящие из символов, т.е. IP адреса в качестве URL не присутствуют при проверке. Допускаются поддомены, указание порта доступа через двоеточие, GET запросы с передачей параметров, доступ к подпапкам на домене, допускается наличие якоря через решетку. Однобуквенные домены считаются запрещенными. Запрещены спецсимволы, например «-» в начале и конце имени домена. Запрещен символ «_» и пробел в имени домена. При составлении регулярного выражения ориентируйтесь на список правильных и неправильных выражений заданных ниже.

Пример правильных выражений:
http://www.zcontest.ru
http://zcontest.ru
http://zcontest.com
https://zcontest.ru
https://sub.zcontest-ru.com:8080
http://zcontest.ru/dir%201/dir_2/program.ext?var1=x&var2=my%20value
zcon.com/index.html#bookmark


Пример неправильных выражений:
Just Text.
http://a.com
http://www.domain-.com


Задача 5 Написать регулярное выражение определяющее является ли данная строчка шестнадцатиричным идентификатором цвета в HTML. Где #FFFFFF для белого, #000000 для черного, #FF0000 для красного и.т.д.

Пример правильных выражений:
#FFFFFF
#FF3421
#00ff00


Пример неправильных выражений:
232323
f#fddee
#fd2


Задача 6 Написать регулярное выражение определяющее является ли данная строчка датой в формате dd/mm/yyyy. Начиная с 1600 года до 9999 года

Пример правильных выражений:
29/02/2000
30/04/2003
01/01/2003


Пример неправильных выражений:
29/02/2001
30-04-2003
1/1/1899


Задача 7 Написать регулярное выражение определяющее является ли данная строчка валидным E-mail адресом согласно RFC под номером 2822

Пример правильных выражений:
mail@mail.ru
valid@megapochta.com
aa@aa.info


Пример неправильных выражений:
bug@@@com.ru
@val.ru
Just Text2
val@val
val@val.a.a.a.a
12323123@111[]][]


Задача 8 Составить регулярное выражение, является ли заданная строчка IP адресом, записанным в десятичном виде

Пример правильных выражений:
127.0.0.1
255.255.255.0
192.168.0.1


Пример неправильных выражений:
1300.6.7.8
abc.def.gha.bcd
254.hzf.bar.10


Задача 9 Проверить, надежно ли составлен пароль. Пароль считается надежным, если он состоит из 8 или более символов. Где символом может быть английская буква, цифра и знак подчеркивания. Пароль должен содержать хотя бы одну заглавную букву, одну маленькую букву и одну цифру.

Пример правильных выражений:
C00l_Pass
SupperPas1


Пример неправильных выражений:
Cool_pass
C00l


Задача 10 Проверить является ли заданная строка шестизначным числом, записанным в десятичной системе счисления без нулей в старших разрядах.

Пример правильных выражений:
123456
234567


Пример неправильных выражений:
1234567
12345


Для тестирования применяется следующая функция:

int match(const char *string, char *pattern)
{
    int status;
    regex_t re;

    if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
        return(0);
    }
    status = regexec(&re, string, (size_t) 0, NULL, 0);
    regfree(&re);
    if (status != 0) {
        return (0);
    }
    return (1);
}

Входные данные

В данной задаче нет входных данных

Выходные данные

Выведите ответ в виде 10 строчек, первая строчка соответствует первой задаче, вторая второй и.т.д. Все остальные строчки игнорируются. Если вы не хотите решать какую то задачу, на соответствующей строчке поставьте "---". В противном случае выведите текст регулярного выражения для данной задачи. Если хотя бы одно из выражений окажется неверным, то вы получите статус Wrong Answer.

Начисление очков

За каждую решенную задачу вы получите ровно 1 очко плюс бонусные баллы равные 1/(размер регулярного выражения).

Пример

Выходные данные:
---
^[1-9]{1}[0-9]{3} ?[A-Z]{2}$
---
---
---
---
---
---
---
---

Это просто пример как должны выглядеть выходные данные. Если ответ на вторую задачу правильный, то за него вы получите 1 + 1/28 = 1.035714 очка.