Змея / Говнокод #24536 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 666_N33D135, (Updated )

Комментарии (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...
        Ответить
  • Считаем правильно:
    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 = '')
    Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8