Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.

Вам нельзя прикреплять файлы к этой странице.