1. Python / Говнокод #24536

    0

    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
    #-*-coding:utf8;-*-
    
    combinators = {
       'I': lambda x: x if len(x) <= 1 else calc(x[1:]),
       'K': lambda x: x if len(x) <= 2 else calc((x[1],) + x[3:]),
       'W': lambda x: x if len(x) <= 2 else calc(x[1:3] + x[2:]),
       'S': lambda x: x if len(x) <= 3 else calc((x[1], x[3], (x[2], x[3])) + x[4:]),
       'B': lambda x: x if len(x) <= 3 else calc((x[1], (x[2], x[3])) + x[4:]),
       'C': lambda x: x if len(x) <= 3 else calc((x[1], x[3], x[2]) + x[4:]),
       'U': lambda x: x if len(x) <= 2 else calc((x[2], (x[1], x[1], x[2])) + x[3:]),
       'Y': lambda x: x if len(x) <= 1 else calc(('S',('K',('S','I','I')),('S',('S',('K','S'),'K'),('K',('S','I','I')))) + x[2:])
    }
    
    def calc(x):
        def f(x, top = False):
            if type(x) is not tuple or len(x) == 0:
                return x
            if top:
                while type(x[0]) is tuple:
                    x = x[0] + x[1:]
            else:
                if type(x[0]) is tuple:
                    return (calc(x[0]),) + f(x[1:])
            print(termrepr(x))
            input('Press Enter...')
            return combinators.get(x[0], lambda _: (x[0],) + f(x[1:]))(x)
    
        return f(x, True)
    
    def parse(s):
        def f(s, n):
            res = ()
            i = n
            while i < len(s):
                if s[i] == '(':
                    t, j = f(s, i + 1)
                    res += (t,)
                    i = j - 1
                elif s[i] == ')':
                    return (res, i + 1)
                else:
                    res += (s[i],)
                i += 1
            return (res, i)
            
        return f(s, 0)[0]
    
    def termrepr(x):
        if len(x) == 0:
            return ''
        if type(x[0]) is tuple:
            return '(' + termrepr(x[0]) + ')' + termrepr(x[1:])
        else:
            return x[0] + termrepr(x[1:])
    
    print('>> ', end = '')
    while True:
        print(termrepr(calc(parse(input()))))
        print('\n>> ', end = '')

    Я перепесал #24129:

    >> BUGURT
    BUGURT
    Press Enter...
    U(GU)RT
    Press Enter...
    R((GU)(GU)R)T
    Press Enter...
    GU(GU)R
    Press Enter...
    U(GU)R
    Press Enter...
    R((GU)(GU)R)
    Press Enter...
    GU(GU)R
    Press Enter...
    U(GU)R
    Press Enter...

    Запостил: 666_N33D135, 24 Июля 2018

    Комментарии (12) RSS

    • показать все, что скрытоvanished
      Ответить
      • > складывать куда-нибудь

        Куда-куда, в префиксное дерево.
        Ответить
      • Кстати, по поводу зацикливаний, знаете такую задачку:
        Продолжи ряд чисел:
        1, 11, 21, 1112, 3112, 211213, 312213, 212223, 114213, 31121314, 41122314, 31221324, 21322314, 21322314, ...

        Если начинать этот ряд с каких-нибудь других чисел, можно собрать какое-то количество таких self-describing чисел. Наименьшее из них ­— 22.
        Ответить
      • Если считать правильно, то GU(GU)R так и останется GU(GU)R'ом, но тогда выражение будет коверкаться только пока впереди кобенатор.
        Ответить
      • Есть кобенаторные термы, вычисление которых никогда не закончится, и которые не имеют повторяющихся промежуточных значений. Самый простой:
        >> SII(SII)
        SII(SII)
        Press Enter...
        I(SII)(I(SII))
        Press Enter...
        SII(I(SII))
        Press Enter...
        I(I(SII))(I(I(SII)))
        Press Enter...
        I(SII)(I(I(SII)))
        Press Enter...
        SII(I(I(SII)))
        Press Enter...
        I(I(I(SII)))(I(I(I(SII))))
        Press Enter...
        И вот ещё дико мутирующий:
        >> SSSSSSISSSS
        SSSSSSISSSS
        Press Enter...
        SS(SS)SSISSSS
        Press Enter...
        SS((SS)S)SISSSS
        Press Enter...
        SS(((SS)S)S)ISSSS
        Press Enter...
        SI((((SS)S)S)I)SSSS
        Press Enter...
        IS(((((SS)S)S)I)S)SSS
        Press Enter...
        S(((((SS)S)S)I)S)SSS
        Press Enter...
        SSSSISS(SS)S
        Press Enter...
        SS(SS)ISS(SS)S
        Press Enter...
        SI((SS)I)SS(SS)S
        Press Enter...
        IS(((SS)I)S)S(SS)S
        Press Enter...
        S(((SS)I)S)S(SS)S
        Press Enter...
        SSIS(SS)(S(SS))S
        Press Enter...
        SS(IS)(SS)(S(SS))S
        Press Enter...
        S(SS)((IS)(SS))(S(SS))S
        Press Enter...
        SS(S(SS))(((IS)(SS))(S(SS)))S
        Press Enter...
        S(((IS)(SS))(S(SS)))((S(SS))(((IS)(SS))(S(SS))))S
        Потом он начинает очень быстро расти.
        Ответить
        • Не видать конца и края:
          >> SSS(SSS)(SSS)
          SSS(SSS)(SSS)
          Type any string to stop...
          S(SSS)(S(SSS))(SSS)
          Type any string to stop...
          SSS(SSS)((S(SSS))(SSS))
          Type any string to stop...
          S(SSS)(S(SSS))((S(SSS))(SSS))
          Type any string to stop...
          SSS((S(SSS))(SSS))((S(SSS))((S(SSS))(SSS)))
          Type any string to stop...
          S((S(SSS))(SSS))(S((S(SSS))(SSS)))((S(SSS))((S(SSS))(SSS)))
          Type any string to stop...
          S(SSS)(SSS)((S(SSS))((S(SSS))(SSS)))((S((S(SSS))(SSS)))((S(SSS))((S(SSS))(SSS))))
          Type any string to stop...
          SSS((S(SSS))((S(SSS))(SSS)))((SSS)((S(SSS))((S(SSS))(SSS))))((S((S(SSS))(SSS)))((S(SSS))((S(SSS))(SSS))))
          Type any string to stop...
          S((S(SSS))((S(SSS))(SSS)))(S((S(SSS))((S(SSS))(SSS))))((SSS)((S(SSS))((S(SSS))(SSS))))((S((S(SSS))(SSS)))((S(SSS))((S(SSS))(SSS))))
          Type any string to stop...
          S(SSS)((S(SSS))(SSS))((SSS)((S(SSS))((S(SSS))(SSS))))((S((S(SSS))((S(SSS))(SSS))))((SSS)((S(SSS))((S(SSS))(SSS)))))((S((S(SSS))(SSS)))((S(SSS))((S(SSS))(SSS))))
          Type any string to stop...
          SSS((SSS)((S(SSS))((S(SSS))(SSS))))(((S(SSS))(SSS))((SSS)((S(SSS))((S(SSS))(SSS)))))((S((S(SSS))((S(SSS))(SSS))))((SSS)((S(SSS))((S(SSS))(SSS)))))((S((S(SSS))(SSS)))((S(SSS))((S(SSS))(SSS))))
          Type any string to stop...
          Ответить
    • На "PHP", пожалуйста.
      Ответить
    • Считаем правильно:
      combinators = {
         'I': lambda x: None if len(x) <= 1 else x[1:],
         'K': lambda x: None if len(x) <= 2 else (x[1],) + x[3:],
         'W': lambda x: None if len(x) <= 2 else (x[1:3],) + x[2:],
         'S': lambda x: None if len(x) <= 3 else (x[1], x[3], (x[2], x[3])) + x[4:],
         'B': lambda x: None if len(x) <= 3 else (x[1], (x[2], x[3])) + x[4:],
         'C': lambda x: None if len(x) <= 3 else (x[1], x[3], x[2]) + x[4:],
         'U': lambda x: None if len(x) <= 2 else (x[2], (x[1], x[1], x[2])) + x[3:],
         'Y': lambda x: None if len(x) <= 1 else ('S',('K',('S','I','I')),('S',('S',('K','S'),'K'),('K',('S','I','I')))) + x[2:]
      }
      
      def truecalc(x):
          if type(x) is not tuple or len(x) == 0:
              return x
          while type(x[0]) is tuple:
              x = x[0] + x[1:]
          print(termrepr(x))#, x2, top)
          if '' != input('Type any string to stop...'):
              return x
          x2 = combinators.get(x[0], lambda x: None)(x)
          if x2 is None:
              x = list(x)
              for i, v in filter(lambda x: type(x[1]) is tuple, enumerate(x)):
                  x[i] = truecalc(v)
              return tuple(x)
          return truecalc(x2)
      
      def parse(s):
          def f(s, n):
              res = ()
              i = n
              while i < len(s):
                  if s[i] == '(':
                      t, j = f(s, i + 1)
                      res += (t,)
                      i = j - 1
                  elif s[i] == ')':
                      return (res, i + 1)
                  else:
                      res += (s[i],)
                  i += 1
              return (res, i)
              
          return f(s, 0)[0]
      
      def termrepr(x):
          if len(x) == 0:
              return ''
          if type(x[0]) is tuple:
              return '(' + termrepr(x[0]) + ')' + termrepr(x[1:])
          else:
              return x[0] + termrepr(x[1:])
      
      print('>> ', end = '')
      while True:
          print(termrepr(truecalc(parse(input()))))
          print('\n>> ', end = '')
      Ответить

    Добавить комментарий