কমন লিস্প, 560 বাইট
"অবশেষে, আমি এর জন্য একটি ব্যবহার পেয়েছি PROGV
" "
(macrolet((w(S Z G #1=&optional(J Z))`(if(symbolp,S),Z(destructuring-bind(a b #1#c),S(if(eq a'L),G,J)))))(labels((r(S #1#(N 97))(w S(symbol-value s)(let((v(make-symbol(coerce`(,(code-char N))'string))))(progv`(,b,v)`(,v,v)`(L,v,(r c(1+ n)))))(let((F(r a N))(U(r b N)))(w F`(,F,U)(progv`(,b)`(,U)(r c N))))))(p()(do((c()(read-char()()#\)))q u)((eql c #\))u)(setf q(case c(#\S'(L x(L y(L z((x z)(y z))))))(#\K'(L x(L u x)))(#\I'(L a a))(#\((p)))u(if u`(,u,q)q))))(o(S)(w S(symbol-name S)(#2=format()"~A.~A"b(o c))(#2#()"~A(~A)"(o a)(o b)))))(lambda()(o(r(p))))))
Ungolfed
;; Bind S, K and I symbols to their lambda-calculus equivalent.
;;
;; L means lambda, and thus:
;;
;; - (L x S) is variable binding, i.e. "x.S"
;; - (F x) is function application
(define-symbol-macro S '(L x (L y (L z ((x z) (y z))))))
(define-symbol-macro K '(L x (L u x)))
(define-symbol-macro I '(L x x))
;; helper macro: used twice in R and once in O
(defmacro w (S sf lf &optional(af sf))
`(if (symbolp ,S) ,sf
(destructuring-bind(a b &optional c) ,S
(if (eq a 'L)
,lf
,af))))
;; R : beta-reduction
(defun r (S &optional (N 97))
(w S
(symbol-value s)
(let ((v(make-symbol(make-string 1 :initial-element(code-char N)))))
(progv`(,b,v)`(,v,v)
`(L ,v ,(r c (1+ n)))))
(let ((F (r a N))
(U (r b N)))
(w F`(,F,U)(progv`(,b)`(,U)(r c N))))))
;; P : parse from stream to lambda tree
(defun p (&optional (stream *standard-output*))
(loop for c = (read-char stream nil #\))
until (eql c #\))
for q = (case c (#\S S) (#\K K) (#\I I) (#\( (p stream)))
for u = q then `(,u ,q)
finally (return u)))
;; O : output lambda forms as strings
(defun o (S)
(w S
(princ-to-string S)
(format nil "~A.~A" b (o c))
(format nil (w b "(~A~A)" "(~A(~A))") (o a) (o b))))
বিটা-হ্রাস
পরিবর্তনগুলি PROGV
ব্যবহার করে নতুন কমন লিস্প প্রতীকগুলির সাথে হ্রাসের সময় গতিশীলভাবে আবদ্ধ MAKE-SYMBOL
। এটি নামকরণের সংঘর্ষগুলি (যেমন উদ্যানের ভেরিয়েবলগুলির অনাকাঙ্ক্ষিত ছায়াছবি) এড়ানো ভালভাবে অনুমতি দেয়। আমি ব্যবহার করতে পারতাম GENSYM
, তবে আমরা প্রতীকগুলির জন্য ব্যবহারকারী-বান্ধব নাম রাখতে চাই। এজন্য প্রতীকগুলি চিঠির সাথে নামগুলি দেওয়া aহয়েছে z(প্রশ্নের দ্বারা অনুমোদিত হিসাবে)। N
বর্তমান সুযোগে পরবর্তী উপলব্ধ বর্ণের অক্ষর কোডটি উপস্থাপন করে এবং 97, ওরফে দিয়ে শুরু হয় a।
এখানে R
( W
ম্যাক্রো ছাড়াই ) আরও পঠনযোগ্য সংস্করণ রয়েছে :
(defun beta-reduce (S &optional (N 97))
(if (symbolp s)
(symbol-value s)
(if (eq (car s) 'L)
;; lambda
(let ((v (make-symbol (make-string 1 :initial-element (code-char N)))))
(progv (list (second s) v)(list v v)
`(L ,v ,(beta-reduce (third s) (1+ n)))))
(let ((fn (beta-reduce (first s) N))
(arg (beta-reduce (second s) N)))
(if (and(consp fn)(eq'L(car fn)))
(progv (list (second fn)) (list arg)
(beta-reduce (third fn) N))
`(,fn ,arg))))))
মধ্যবর্তী ফলাফল
স্ট্রিং থেকে পার্স:
CL-USER> (p (make-string-input-stream "K(K(K(KK)))"))
((L X (L U X)) ((L X (L U X)) ((L X (L U X)) ((L X (L U X)) (L X (L U X))))))
কমাতে:
CL-USER> (r *)
(L #:|a| (L #:|a| (L #:|a| (L #:|a| (L #:|a| (L #:|b| #:|a|))))))
(ফাঁসি কার্যকর দেখুন)
সুন্দর-মুদ্রণ:
CL-USER> (o *)
"a.a.a.a.a.b.a"
টেস্ট
আমি পাইথনের উত্তরের মতো একই পরীক্ষার স্যুটটি পুনরায় ব্যবহার করেছি:
Input Output Python output (for comparison)
1. KSK a.b.c.a(c)(b(c)) a.b.c.a(c)(b(c))
2. SII a.a(a) a.a(a)
3. S(K(SI))K a.b.b(a) a.b.b(a)
4. S(S(KS)K)I a.b.a(a(b)) a.b.a(a(b))
5. S(S(KS)K)(S(S(KS)K)I) a.b.a(a(a(b))) a.b.a(a(a(b)))
6. K(K(K(KK))) a.a.a.a.a.b.a a.b.c.d.e.f.e
7. SII(SII) ERROR ERROR
উপরের টেবিলের জন্য অষ্টম পরীক্ষার উদাহরণটি খুব বড়:
8. SS(SS)(SS)
CL a.b.a(b)(c.b(c)(a(b)(c)))(a(b.a(b)(c.b(c)(a(b)(c))))(b))
Python a.b.a(b)(c.b(c)(a(b)(c)))(a(d.a(d)(e.d(e)(a(d)(e))))(b))
- সম্পাদনা আমি অনুক্রমে হিসাবে একই গোষ্ঠী আচরণ আছে আমার উত্তর আপডেট aditsu এর উত্তর কারণ এটি লিখতে কম বাইট খরচ।
- অবশিষ্ট পার্থক্য পরীক্ষার 6 এবং 8 এর জন্য দেখা যেতে পারে ফলাফলের
a.a.a.a.a.b.a
সঠিক এবং পাইথন উত্তর যতটা অক্ষর, যেখানে বাইন্ডিং যেমন ব্যবহার করে না a
, b
, c
এবং d
রেফারেন্সড নেই।
কর্মক্ষমতা
উপরের 7 টি উত্তীর্ণ পরীক্ষার উপরে লুপিং এবং ফলাফল সংগ্রহ করা অবিলম্বে (এসবিসিএল আউটপুট):
Evaluation took:
0.000 seconds of real time
0.000000 seconds of total run time (0.000000 user, 0.000000 system)
100.00% CPU
310,837 processor cycles
129,792 bytes consed
একই পরীক্ষা কয়েকশো বার করা থেকে শুরু করে ... বিশেষ ভেরিয়েবল সম্পর্কিত একটি সীমাবদ্ধতার কারণে এসবিসিএলে "থ্রেড লোকাল স্টোরেজ ক্লান্ত" । সিসিএল সহ, একই পরীক্ষার স্যুটকে 10000 বার কল করতে ৩.৩৩ সেকেন্ড সময় লাগে।