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
ช้ากว่าs
lexicographically เรารู้เพียง แต่จะเพิ่มโปรแกรมที่เริ่มต้นด้วยซึ่งเป็นอย่างเคร่งครัดสั้นกว่า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)
จะตัดสินใจว่าจะคืนค่า 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