Прикреплённый файл «vyr4G.py»

Загрузка

   1 #!/usr/bin/python
   2 # coding: UTF8
   3 
   4 '''Генератор для задачи:
   5 
   6    Ввести арифметическое выражение c шестью приоритетами (or, and, < > ==, + -, * /, **) и круглыми скобками -- и вычислить результат'''
   7 
   8 
   9 from random import *
  10 
  11 # Скопироване без изменений из решения
  12 Ops={ # знак, приоритет, свойства, функция, шаблон
  13         'or':   (0,   '',  lambda a,b: a or b , r'or' ),
  14         'and':  (1,   '',  lambda a,b: a and b, r'and'),
  15         '<':    (2,   '',  lambda a,b: a < b  , r'<'),
  16         '>':    (2,   '',  lambda a,b: a > b  , r'>'),
  17         '==':   (2,   '',  lambda a,b: a == b , r'=='),
  18         '+':    (3,   '',  lambda a,b: a + b  , r'\+'),
  19         '-':    (3,   '',  lambda a,b: a - b  , r'-'),
  20         '*':    (4,   '',  lambda a,b: a * b  , r'(?<!\*)\*(?!\*)'),    # из-за **
  21         '/':    (4,   '',  lambda a,b: a / b  , r'/'),
  22         '**':   (5,  'r',  lambda a,b: a ** b , r'\*\*'),
  23     }
  24 
  25 # "Тупой" вариант, генерирует странное
  26 def genraw(num, level):
  27     if not num: return str(randrange(100))
  28     # количество опраций в левом и правом подвыражениях
  29     n1=randrange(num)
  30     n2=num-n1-1
  31     op=choice(Ops.keys())
  32     mylevel=Ops[op][0]
  33     ret=genraw(n1,mylevel)+" "+op+" "+genraw(n2,mylevel)
  34     if mylevel<level: return "("+ret+")"
  35     else: return ret
  36 
  37 # Вариант посложнее
  38 Types=((0,1),(2,),(3,4,5))
  39 def genlevel(num, level, Type):
  40     # Число
  41     if not num: return str(randrange(100))
  42     n1=randrange(num)
  43     n2=num-n1-1
  44     op=choice([k for k in Ops.keys() if Ops[k][0] in Types[Type]])
  45     mylevel=Ops[op][0]
  46     Type1,Type2=Type,Type
  47     if Type==0: # логические операции: минимум по сравнению в каждом параметре
  48         # Не все операции должны быть логическими :)
  49         if num<=2 or randrange(10)>7:
  50             return genlevel(num,level,1)
  51         if   n1==0: n1,n2=n1+1,n2-1
  52         elif n2==0: n1,n2=n1-1,n2+1
  53     elif Type==1:   # сравнение: ровно одна операция
  54         Type1,Type2=2,2
  55     ret=genlevel(n1,mylevel,Type1)+" "+op+" "+genlevel(n2,mylevel,Type2)
  56     if mylevel<level: return "("+ret+")"
  57     else: return ret
  58 
  59 print genlevel(randrange(10,20),-1,0)

Прикреплённые файлы

Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.

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