1. Список говнокодов пользователя KolesnichenkoDS

    Всего: 1

  2. Python / Говнокод #18239

    −123

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    def run(code):
        
        def func(operator):
            from functools import reduce
            
            add    = lambda a, b: float(a) + float(b)
            mul    = lambda a, b: float(a) * float(b)
            div    = lambda a, b: float(a) / float(b)
            deduct = lambda a, b: float(a) - float(b)
            
            d = {
                '+': lambda arr: reduce(add,    arr),
                '*': lambda arr: reduce(mul,    arr),
                '/': lambda arr: reduce(div,    arr),
                '-': lambda arr: reduce(deduct, arr)
            }
            
            return d[operator]
        
        def lex(token):
            if token in ('+', '-', '/', '*', '%'):
                return "operator"
            elif token == '(':
                return "lbracket"
            elif token == ')':
                return "rbracket"
            elif token[0].isalpha():
                return "name"
            elif token[0] == token[-1] and token[0] in ('"', "'"):
                return "string"
            else:
                try:
                    float(token)
                    return "number"
                except:
                    raise ValueError
                
        def getArgs(words):
            args = []
            arg = []
            i = 0
            for word in words[2:]:
                if word == '(':
                    i += 1
                    arg.append(word)
                elif word == ')':
                    i -= 1
                    arg.append(word)
                    if i == 0:
                        args.append(arg)
                        arg = []
                elif i == 0:
                    arg.append(word)
                    args.append(arg)
                    arg = []
                else:
                    arg.append(word)
            return args
        
        def expr(words):
            args = getArgs(words)
            args_ = []
            for arg in args:
                if len(arg) == 1:
                    args_.append(arg)
                else:
                    args_.append(expr(arg))
            
            if lex(words[1]) == "operator":
                return func(words[1])(list(map(lambda a: (type(a) in (list, tuple) and a[0]) or a, args_)))
    
        lines = code.split("\n")
        for line in lines:
            word = ''
            words = []
            chars = tuple(line)
            
            for i in tuple(line):
                
                if i in ('(', ')'):
                    if word: words.append((word, lex(word)))
                    words.append((i, lex(i)))
                    word = ''
                
                elif i == ' ':
                    if word: words.append((word, lex(word)))
                    word = ''
                    
                else:
                    word += i
                    
            if word: words.append((word, lex(word)))
        words_ = list(map(lambda arr: arr[0], words))
        print(expr(words_))

    функция считает лиспоподобные арифметические выражения, например так:

    run("(+ 2 (* 3 4))") # 14

    в своё оправдание могу лишь сказать, что писал это в электричке на планшете

    KolesnichenkoDS, 27 Мая 2015

    Комментарии (14)