Прикреплённый файл «corrnum.py»
Загрузка 1 #!/usr/bin/python
2 # coding: UTF8
3
4 '''
5 Дано число. Требуется определить, корректно ли оно. Число может быть записано в 2-ух формах:
6
7 - обычной
8
9 - экспоненциальной
10
11 Число в обычной форме не должно содержать ведущих нулей. Знак "-" должен стоять только перед непололожительным числом и только в одном экземпляре. Число также может быть записано в двоичной, восьмеричной или шестнадцатиричной системе счисления. В различных системах счисления число будет иметь вид:
12
13 <%0x><обычная форма> - в шестнадцатиричной (состоит из цифр и маленьких латинских букв). Число знаков после "0x" не должно превышать 16.
14
15 <%0o><обычная форма> - в восьмеричной. Число знаков после "0o" не должно превышать 8.
16
17 <%0b><обычная форма> - в двоичной. Число знаков после "0b" не должно превышать 20.
18
19 Знак "-" также может быть только один и должен стоять перед символом "%". Примеры корректных чисел в обычной форме: 75, -%0x6f4,%0b101110,%0o1705.
20
21 Число в экспоненциальной форме представляет собой запись следующего вида (необязательные элементы заключены в квадратные скобки):
22
23 <число в обычной форме>[<.><неотрицательное число в обычной форме, может содержать ведущие нули, не влияющие на подсчет количества знаков и стоящие до символа "%" если число не в десятичной системе счисления>]<E>[<знак "+" или "-"><число в обычной форме>].
24
25 Примеры корректных чисел в экспоненциальной форме: 1.517E+4, -%0b101.00%0xfE–19, -7E.
26 '''
27 # Замечание 1: "<обычная форма>" в условии задачи -- это не то же самое, что "<число в обычной форме>. Это вообще не строгий термин
28 # Замечание 2: десятичные числа не имеют ограничения по длине, остальные имеют (причём довольно противоестественные)
29 # Замечание 3: ноль бывает во всех системах счисления
30 # Замечание 4: в условии явная ошибка: порядок должен задаваться как "<неотрицательное число в обычной форме>", а не как "<число в обычной форме>"
31 # Замечание 5: если регулярное выражение A состоит из альтернатив (имеет | вне скобок), конкатенацию вида AB или BA необходимо записывать со скобками: (A)B или B(A). В принципе, всё можно записывать со скобками в виде (A)(B), независимо от внутренностей, так как это приводит к заполнению списка групп в результирующем объекте
32
33 import re
34
35 # Число в обычной форме не должно содержать ведущих нулей. Знак "-" должен стоять только перед непололожительным числом и только в одном экземпляре
36 rDNumber=r"[1-9][0-9]*"
37 # <%0x><обычная форма> - в шестнадцатиричной (состоит из цифр и маленьких латинских букв). Число знаков после "0x" не должно превышать 16.
38 rHNumber=r"%0x[1-9a-f][0-9a-f]{,16}"
39 #<%0o><обычная форма> - в восьмеричной. Число знаков после "0o" не должно превышать 8.
40 rONumber=r"%0o[1-7][0-7]{,8}"
41 #<%0b><обычная форма> - в двоичной. Число знаков после "0b" не должно превышать 20.
42 rBNumber=r"%0b1[01]{,20}"
43 # Нули
44 rZNumber="0|%0x0|%0o0|%0b0"
45 # Положительное число
46 rNNumber="|".join((rDNumber,rHNumber,rONumber,rBNumber))
47 # Неотрицательное число
48 rCNumber="{0}|{1}".format(rNNumber,rZNumber)
49 # Целое число
50 rINumber="-({0})|{1}".format(rNNumber,rCNumber)
51 #Число в экспоненциальной форме представляет собой запись следующего вида (необязательные элементы заключены в квадратные скобки):
52 #<число в обычной форме>[<.><неотрицательное число в обычной форме, может содержать ведущие нули, не влияющие на подсчет количества знаков и стоящие до символа "%" если число не в десятичной системе счисления>]<E>[<знак "+" или "-"><число в обычной форме>].
53 rENumber="({0})(\.0*({1}))?E([+-]({1}))?".format(rINumber,rCNumber)
54 # ЧИСЛО (неэффективный вариант)
55 rANumber="{0}|{1}".format(rINumber,rENumber)
56 # ЧИСЛО (более эффективный вариант: целое число -- это вещественное без хвоста)
57 rGNumber="({0})((\.0*({1}))?E([+-]({1}))?)?".format(rINumber,rCNumber)
58
59 # немного отладки
60 N=raw_input()
61 if ',' in N: # число определённого типа
62 T,N=N.split(",")
63 NM=eval("r"+T+"Number")
64 R=re.compile(NM)
65 M=R.match(N)
66 print NM
67 if M: print M.groups()
68 else: print "NO"
69 elif '@' in N: # изготовление решения без комментариев
70 import sys
71 S=file(sys.argv[0]).readlines()
72 # важно, чтобы подстрока не была найдена в самом регулярном выражении
73 # для этого используется match() (привязка к началу) или []
74 R=re.compile('import|r.Number=|.*[(]rGNumber|.*["]YES|N=')
75 print "\n".join([s.strip() for s in S if R.match(s)])
76 else:
77 # от начала до конца строки
78 R=re.compile(rGNumber+"$")
79 print R.match(N) and "YES" or "NO"
Прикреплённые файлы
Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2011-09-26 11:35:39, 6.8 KB) [[attachment:corrnum.py]]
- [получить | показать] (2011-09-26 11:35:39, 0.6 KB) [[attachment:corrnumC.py]]
- [получить | показать] (2011-09-26 11:35:39, 2.4 KB) [[attachment:vyr4.py]]
- [получить | показать] (2011-09-26 11:35:39, 2.4 KB) [[attachment:vyr4G.py]]
- [получить | показать] (2011-09-26 11:35:39, 1.4 KB) [[attachment:wiki.py]]
- [получить | показать] (2011-09-26 11:35:39, 2.0 KB) [[attachment:word_number3.py]]
Вам нельзя прикреплять файлы к этой странице.