파이썬 2, 157 바이트
def f(s,o=0,d=0,D={}):T=s,o,d;x=D[T]=D[T]if T in D else~o and 0**o+sum(f(s[1:],cmp(c,"[")%-3-~o,d or cmp(c,s[0]))for c in"+,-.<>[]")if s else~d<0==o;return+x
여전히 꽤 골프 타는 것처럼 보이지만 지금은 이것을 게시하고 있습니다. 약간의 캐싱으로 재귀를 사용합니다. 성가신 D.get
것은 캐싱을 단락시키지 않으므로 9 바이트를 절약 할 수 없습니다 ...
매핑의 우선 순위는 우선 순위를 정한 다음 순서보다 사전 사전 순입니다 "][><.-,+"
(아래 출력 예 참조). 주요 아이디어는 접두사를 비교하는 것입니다.
변수 는 현재 접두사에 대해 여전히 열려 o
있는 [
괄호 수를 추적 하며 변수 d
는 다음을 나타내는 세 가지 값 중 하나를 사용합니다.
d = 1
: 현재 접두어가 사전 적으로 사전 s
입니다. 이 접두사와 길이를 가진 모든 프로그램을 추가하십시오 <= s
.
d = -1
: 현재 접두어가 사전 적으로 이후 s
입니다. 이 접두사와 길이를 가진 모든 프로그램을 추가하십시오 < s
.
d = 0
: 현재 접두사는 접두사 s
이므로 d
나중에 1 또는 -1로 변경할 수 있습니다 .
예를 들어, 우리는이 있다면 s = "[-]"
우리의 현재의 접두사입니다 p = "+"
때문에, p
보다 이후 s
전적으로 우리가 시작하는 프로그램 추가 만 알고 p
있는보다 엄격하게 짧다 s
.
보다 자세한 예제를 제공하기 위해 입력 프로그램이 있다고 가정하십시오 s = "-[]"
. 첫 번째 재귀 확장은 다음을 수행합니다.
(o == 0) # Adds a program shorter than s if it's valid
# For the first expansion, this is 1 for the empty program
+ f(s[1:], o=-1, d=1) # ']', o goes down by one due to closing bracket
+ f(s[1:], o=1, d=1) # '[', o goes up by one due to opening bracket
+ f(s[1:], o=0, d=1) # '>'
+ f(s[1:], o=0, d=1) # '<'
+ f(s[1:], o=0, d=1) # '.', d is set to 1 for this and the previous branches
# since they are lexicographically earlier than s's first char
+ f(s[1:], o=0, d=0) # '-', d is still 0 since this is equal to s's first char
+ f(s[1:], o=0, d=-1) # ',', d is set to -1 for this and the later branches
# since they are lexicographically later than s's first char
+ f(s[1:], o=0, d=-1) # '+'
우리가 그들에 대해 관심을 모든 변수를 통해 캡처 - 주 우리는 실제로 재귀의 접두사를 사용하지 않는 방법 d
, o
및 축소 입력 프로그램 s
. 위와 같이 반복이 많이 발생하는 것을 알 수 있습니다.이 부분에서 캐싱이 발생하여 시간 제한 내에 100 개 문자 프로그램을 처리 할 수 있습니다.
때 s
비어있는, 우리가 볼 (d>=0 and o==0)
일을 반환할지 여부를 결정하는, (이 / 사 전적으로 초기 동일한의 프로그램이 유효하기 때문에이 프로그램을 계산) 또는 0 (이 프로그램을 포함되지 않습니다).
이 접두사가있는 프로그램은보다 s 이기 때문에 유효하지 않기 때문에 o < 0
즉시로 리턴하는 모든 situtation은 을 리턴합니다 .0
]
[
처음 20 개의 출력은 다음과 같습니다.
1
> 2
< 3
. 4
- 5
, 6
+ 7
[] 8
>> 9
>< 10
>. 11
>- 12
>, 13
>+ 14
<> 15
<< 16
<. 17
<- 18
<, 19
<+ 20
@TheNumberOne의 답변과 동일한 Hello World 예제를 사용하십시오.
>>> f("++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.")
3465145076881283052460228065290888888678172704871007535700516169748342312215139431629577335423L