Python 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: คำนำหน้าปัจจุบันคือ lexicographically sก่อนหน้านี้กว่า เพิ่มโปรแกรมทั้งหมดด้วยคำนำหน้าและความยาว<= sนี้
d = -1: คำนำหน้าปัจจุบันคือ lexicographically sช้ากว่า เพิ่มโปรแกรมทั้งหมดด้วยคำนำหน้าและความยาว< sนี้
d = 0: คำนำหน้าปัจจุบันเป็นคำนำหน้าsดังนั้นเราอาจเปลี่ยนdเป็น 1 หรือ -1 ในภายหลัง
ตัวอย่างเช่นถ้าเรามีs = "[-]"และคำนำหน้าของเราในปัจจุบันคือp = "+"ตั้งแต่pช้ากว่าslexicographically เรารู้เพียง แต่จะเพิ่มโปรแกรมที่เริ่มต้นด้วยซึ่งเป็นอย่างเคร่งครัดสั้นกว่าps
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)จะตัดสินใจว่าจะคืนค่า 1 หรือไม่ (นับโปรแกรมนี้เนื่องจากโปรแกรมเร็ว / เท่ากับและโปรแกรมนั้นใช้ได้) หรือ 0 (ไม่นับโปรแกรมนี้)
การซิงก์ใด ๆ ที่o < 0ส่งคืนทันที0เนื่องจากโปรแกรมใด ๆ ที่มีคำนำหน้านี้มีมากกว่า]s [และไม่ถูกต้อง
เอาต์พุต 20 รายการแรกคือ:
1
> 2
< 3
. 4
- 5
, 6
+ 7
[] 8
>> 9
>< 10
>. 11
>- 12
>, 13
>+ 14
<> 15
<< 16
<. 17
<- 18
<, 19
<+ 20
ใช้ตัวอย่าง Hello World เดียวกันกับคำตอบของ @ TheNumberOne:
>>> f("++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.")
3465145076881283052460228065290888888678172704871007535700516169748342312215139431629577335423L