Zekeriya KOÇ wrote:

Merhaba,
Lisp ile yeni yeni ilgileniyorum. Uzun zaman önce bir kenara bıraktığım Douglas Hofstadter'in Gödel, Escher, Bach (GEB) kitabını yeniden okumaya başladım ve kitabın ilk bölümünde verilen bir bulmacayı Lisp ile kodlamaya çalıştım. Aşağıdaki kodda bazı başlangıç değerleri ve konuyla ilgili listelere uygulanabilecek kuralları karşılayan fonksiyonlar var.


Ne kadar eglenceli bir e-posta bu böyle! :)


;;; mu.lisp ;;;
(defvar *miu* '(M I U))  ;; Biçimsel dizge.
(defvar *ilksav* '(M I)) ;; Baslangic dizgesi.
(defvar *hedef* '(M U))  ;; Bulunmasi istenen dizge.

(defun gecerli-p (dizge)
  (dolist (i dizge t)
    (if (not (member i *miu* :test #'equal))
(return nil))))


Korkunc bir performansi olabilecegini düsünsem de bazen, ben set-difference fonksiyonunu seviyorum (bkz. matematik formasyonu almis
ve idealar dünyasinda yasayan insan profili:

(defun gecerli-p (dizge)
  (not (set-difference dizge *miu*)))

Eger girdi dizgesinde *miu* listesinde olmayan bir eleman var ise o elemani (bunu true kabul edebiliriz) aksi takdirde
NIL döndürür.

illa member fonksiyonu kullanilacaksa, :test keyword'üne bu durum icin gerek var mi? Varsayilan
test zaten #equal degil mi?



(defun k3 (dizge)
  (if (gecerli-p dizge)
      (let ((sayac1 0)
        (sayac2 0))
    (dolist (i dizge dizge)
      (setf sayac1 (1+ sayac1))
      (if (equal i 'I)
          (setf sayac2(1+ sayac2))
        (setf sayac2 0))
      (if (= sayac2 3)
(return (remove 'I dizge :start (- sayac1 3) :end sayac1)))))))


Böyle bol sayacli, dolistli bir seyler görünce aklima LOOP'a gidiyor nedense:

http://www.gigamonkeys.com/book/loop-for-black-belts.html

Bu arada o "mu" bilmecesinin yani talep edilen ispatin varligina, yokluguna dair bir fikriniz var mi?

Oradaki asil kilit nokta odur cünkü.

--
Emre Sevinç
eMBA Yazılım Geliştirme
İstanbul Bilgi Üniversitesi


_______________________________________________
cs-lisp mailing list
[email protected]
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp

Cevap