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