পাইথন 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
: বর্তমান উপসর্গ lexicographically চেয়ে পরে 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)
, যা 1 (এই প্রোগ্রামটি গণনা করুন কারণ এটি অভিধানের দিক থেকে প্রথম / সমান এবং প্রোগ্রামটি বৈধ) বা 0 (এই প্রোগ্রামটিকে গণনা করবেন না) তা স্থির করে।
সঙ্গে কোন situtation o < 0
অবিলম্বে আয় 0
, যেহেতু এই উপসর্গ সঙ্গে কোনো প্রোগ্রাম আরো আছে ]
চেয়ে গুলি [
, এবং এইভাবে অবৈধ।
প্রথম 20 ফলাফলগুলি হ'ল:
1
> 2
< 3
. 4
- 5
, 6
+ 7
[] 8
>> 9
>< 10
>. 11
>- 12
>, 13
>+ 14
<> 15
<< 16
<. 17
<- 18
<, 19
<+ 20
@ TheNumberOne এর উত্তর হিসাবে একই হ্যালো ওয়ার্ল্ড উদাহরণ ব্যবহার করে:
>>> f("++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.")
3465145076881283052460228065290888888678172704871007535700516169748342312215139431629577335423L