0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
def calc ( x ) :
if type ( x ) is not list :
return x
if len ( x ) == 0 :
return x
while type ( x [ 0 ] ) is list :
x = x [ 0 ] + x [ 1: ]
c = x [ 0 ]
print ( x )
if c == 'I' :
if len ( x ) <= 1 :
return x
return calc ( x [ 1: ] )
elif c == 'K' :
if len ( x ) <= 2 :
return x
return calc ( [ x[1] ] + x [ 3: ] )
elif c == 'W' :
if len ( x ) <= 2 :
return x
return calc ( x[1:3] + x[ 2: ] )
elif c == 'S' :
if len ( x ) <= 3 :
return x
return calc ( [ x[1] , x [3] , [ x[2] , x[3] ] ] + x [ 4: ] )
elif c == 'B' :
if len ( x ) <= 3 :
return x
return calc ( [ x[1] , [ x[2] , x[3] ] ] + x[4:] )
elif c == 'C' :
if len ( x ) <= 3 :
return x
return calc ( [ x[1] , x[3] , x[2] ] + x[ 4 : ] )
return [ c ] + calc ( x [ 1: ] )
def parse ( s , n = 0 ) :
res = []
i = n
while i < len ( s ) :
if s [ i ] == '(' :
t = parse ( s , i + 1 )
res.append ( t [ 0 ] )
i = t [ 1 ] - 1
elif s [ i ] == ')' :
return ( res , i + 1 )
else :
res.append ( s [ i ] )
i += 1
return ( res , i )
print ( '>> ' , end = '' )
while True :
for i in calc ( parse ( input() ) [ 0 ] ) :
print ( i , end = '' )
print ( '\n>> ' , end = '' )
Вычисляэ комбинаторныэ термы, и выдаё промежности, типа:
>> S(SKK)(SKK)x
['S', ['S', 'K', 'K'], ['S', 'K', 'K'], 'x']
['S', 'K', 'K', 'x', [['S', 'K', 'K'], 'x']]
['K', 'x', ['K', 'x'], [['S', 'K', 'K'], 'x']]
['x', [['S', 'K', 'K'], 'x']]
['S', 'K', 'K', 'x']
['K', 'x', ['K', 'x']]
['x']
xx
Запостил:
yet_another_one_shit,
16 Апреля 2018
ЗЫ. print из функции calc можно убрать, он отладочный.
***
Но всё равно, этот код – говно.
Помоему тут баг, комбинаторы же применяются только когда они в начале выражения(если не ошибаюсь). Можно исправить, но тогда им будет неинтересно коверкать слова.
Споки-ноки!
Спасибо за бамп.