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.

MU bulmacasında elimizde bir liste (biçimsel dizge) var. Bu liste sadece M, U ve I harflerini içerebiliyor. Verili kuralları uygulayarak (M I) listesi ile başlayarak (M U) listesi elde etmeye çalışacağız.

gecerli-p fonksiyonu listenin geçerli olup olmadığını kontrol ediyor.
k1 - 1.kural listenin son elemanı I ise yanına bir U eklenebileceğini belirtiyor ve parametre olarak verilen listeye bu kuralı uygulayıp sonucu döndürüyor.

k2 - eğer elimizdeki liste M ile başlıyorsa (ki bu her zaman garantidir) M den sonraki kısmı listenin sonuna ekleyebileceğimizi gösteriyor.

k3 - 3. kural benim problemli kuralım. Buradaki amaç listenin herhangi bir yerinde ardışık olarak 3 tane I varsa bunların yerine bir tane U koymak. Ben 3 tane ardışık I yı bulan ve onları listeden çıkaran fonksiyonu yazdım ama aynı pozisyona U harfini koyacak kodu çıkaramadım. Bu ilk sorum aslında.

k4 - 4. kural da listenin herhangi bir yerinde 2 ardışık U varsa bunları komple listeden çıkarabileceğimizi söylüyor.

Şimdi 3. kuraldaki listeye belirli bir pozisyondan eleman ekleme için fikirlerinizi alabilirsem çok değerli olacak benim için.

Bir de genel olarak yazdığım kodu yorumlayabilirseniz, ne kadar Lisp tarzında ya da ne kadar fonksiyonel programlama örneğidir ya da "Lisp'de bu kodu şöyle yazarsak daha Lispvari olur" gibi önerileriniz de olursa artık dört köşe olurum heralde. :) :)

Herkese şimdiden teşekkürler.

P.S.:Bu arada salı günkü toplantı hakkında yorumları ve notları, olduysa eğer video kayıtlarını heyecanla bekliyoruz. Gelemediğim için yeterince hüzünlüyüm bir de habersiz bırakmayın :)

;;; 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))))

(defun k1 (dizge)
  (if (gecerli-p dizge)
      (if (equal (last dizge) '(I))
          (append dizge '(U))
        dizge)))

(defun k2 (dizge)
  (if (gecerli-p dizge)
      (if (equal (first dizge) 'M)
          (append dizge (rest dizge))
        dizge)))

(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)))))))

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



--
Zekeriya KOÇ
 http://www.metkoi.com/zekus

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

Cevap