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

    • Красиво.

      Теперь ясно, почему зацикливает. GU(GU)R = U(GU)R = R((GU)(GU)R) и дальше ничего не сделать.

      Можно реализовать детектор циклов: складывать куда-нибудь промежуточные значения, а потом каждый новый результат сравнивать со всеми предыдущими.
      Ответить
      • > складывать куда-нибудь

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

        Если начинать этот ряд с каких-нибудь других чисел, можно собрать какое-то количество таких self-describing чисел. Наименьшее из них ­— 22.
        Ответить
        • Заебись) Написал задачку, и сразу же ответ к ней )))
          Ответить
          • Но можно же продолжать ряд чисел: …, 21322314, 21322314, 21322314, 21322314, …
            Ответить
          • Вот все такие числа, если начинать с единицы и со строгим порядком цифр

            21322314
            31123314
            3122331415
            41322324151617
            5132231425161718
            613223141526171819
            Ответить
      • Если считать правильно, то 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 = '')
      Ответить

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