On Nov 01 07:22, Zekeriya KOÇ wrote:
> Benim düşüncemde bu yönde fakat 3 numaralı kural ile ilgili bir sorunum  
> var.
> """ 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. """
> 
> (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)))))))
> 
> bu fonksiyon ardışık 3 tane I varsa tespit ediyor ve pozisyonuna göre  
> dizgeden çıkarıyor. Ama aynı pozisyona bir U ekleme konusunda takıldım.
> 
> Bu konuda listeden fikirler gelir mi acaba ?

Bence list yerine normal string (yani char array) kullanmanız, binlerce
döngü içinde uuup uzun listeler ile boğuşacağınızı düşünürsek, programın
performans akıbeti açısından daha iyi olabilir. (Belki de CL bu konuda
gerekli yerde ilgili optimizasyonu yapabiliyordur.)

Scheme'de probleminizi şu şekilde çözdüm: (Common Lisp'e aktarması o
kadar zor olmasa gerek. Çünkü sadece temel fonksiyonlardan yararlandım.)

(define (replace-3-i-with-u str)
  (let ((found 0))
    (let loop ((i 0)
               (j 0))
      (if (< j (string-length str))
        (begin
          (if (char=? (string-ref str j) #\I)
            (begin
              (set! found (+ 1 found))
              (if (= found 3)
                (begin
                  (set! i (- i 2))
                  (string-set! str j #\U)
                  (set! found 0))))
            (set! found 0))
            
          (string-set! str i (string-ref str j))
          (loop (+ i 1) (+ j 1)))
          
        (string-copy str 0 i)))))

Ayrıca, bu işi - eğer string kullanırsanız - regex fonksiyonları ile
yapmanız daha iyi olmaz mı? Hem program gereksiz yere uzamamış olur.
(Tekerleği yeniden keşfetmek, bilmiyorum gerçekten planlanan başarımı
sağlayacak mı?)

> Soru bir listeye isteğimiz pozisyona eleman ekleme işlemini nasıl  
> yapabiliriz ?

set-car! ya da set-cdr! gibi bir şeyler olması lazım. (En azından
Scheme'de bu böyle.)

Ayrıca ufak bir soru sormak istiyorum. Sonuç itibari ile bu program
hiçbir zaman sonuca ulaşamayacak. (Umarım amacınızı yanlış
anlamamışmdır.) Bunun yerine Gödel'in Tamsızlık teoremini (akabinde
Richard Paradoxu'nu) Lisp'e aktararak, verilen başlangıç değerleri
içinde böyle bir aksiyomatik sistemin çözülemeyeceğini Lisp'in
göstermesini sağlamak daha şık olmaz mı?


İyi çalışmalar.

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

Cevap