Merhaba,

On Dec 05 06:57, Volkan YAZICI wrote:
> a, b, c ve d şeklinde 4 tane tamsayımız var ve bunlar 0'dan 9'a
> kadar rakamlardan oluşuyor. Öyle ki, bir rakam tek bir seferliğine
> kullanılabiliyor. (Yani, örneğin b'nin içinde 7 kullanıldıysa,
> başka bir yerde 7 kullanılamıyor.) Acaba bu kurallar altında
> (a+b+c+d)^2 = abcd denklemini sağlayan tamsayılar hangileridir?

Yukarıdaki problemi çözmek için, Mehmet Bey'in önerisini dikkate
alarak, soruya tersten yaklaşan bir Scheme betiği yazıverdim. Örnek
çıktı şu şekilde:

$ time guile -l abcd.scm -c "(display (find-valid-4s 98765))"
((8 930 2 5))
real    0m5.924s
user    0m5.616s
sys     0m0.036s

Ah, neden zaman bilgisi ile birlikte mi veriyorum? Hoca'nın odasına
gittiğimde bana Mathematica ile yazdığı programın 8 saattir
çalıştığını, programın daha yeni durduğunu söylemişti. Aslında aynı
kodu CHICKEN ile C koduna çevirip derledikten sonra bir daha
çalıştırmayı deneyecektim ama... Bir gün içinde bu kadar heyecan yeter
bana. (Tanrı'dan beni interpreted diller için söylediğim her şeyden
dolayı affetmesini istiyorum.)


İyi çalışmalar.

P.S. find-valid-4s fonksiyonunun o kadar uzun tutmasının nedeni, tail
     recursive call'lardan yararlanmak istememden kaynaklandı
     hep. Cevabı TRC kullanarak kümülativ olarak her döndürmeye
     çalıştığımda stack overflow oluyordu, o yüzden
     [EMAIL PROTECTED]'tekilerin yardımı bile binbir takla
     atarak kodu stack overflow vermeden TRC kullanacak hale
     getirebildik. Açıkcası bu konuda CL'cilerin oyuncaklarını da
     görmek isterim.
; nearest-sqrt is the square root of nearest integer to 9876543210.
(define nearest-sqrt 98765)


;
; hasdupchars - Checks whether a given string has any duplicated characters.
;
(define hasdupchars
  (lambda (str)
    (let loop ((lst (string->list str)))
      (cond
       ((null? lst) #f)
       ((member (car lst) (cdr lst)) #t)
       (else (loop (cdr lst)))))))


; Small macro for calculating ^2 of a number.
(define (^2 n) (* n n))


;
; valid? - Checks (a + b + c + d)^2 = abcd
;
(define (valid? a b c d abcd)
  (let ((a (string->number a))
        (b (string->number b))
        (c (string->number c))
        (d (string->number d)))
    (= (^2 (+ a b c d)) (string->number abcd))))


;
; strspl - Return a list of the combinations of two elements of the given
;          string.
;
(define (strspl s)
  (let ((l (string-length s)))
    (let loop ((n 1))
      (if (>= n l) '()
          (cons (list (substring s 0 n) (substring s n l))
                (loop (+ n 1)))))))


;
; strspln - Return a list of the combinations of specified elements of the
;           given string.
;
(define strspln
  (lambda (n s)
    (if (<= n 1) (list (list s))
        (apply append
               (map
                (lambda (l)
                  (map
                   (lambda (s2) (append s2 (cdr l)))
                   (strspl (car l))))
                (strspln (- n 1) s))))))


;
; find-valid-4s - Return list of the elements that satisfies the valid?
;                 condition from 0 to given start number.
;
(define find-valid-4s
  (lambda (start)
    (let loop ((num start)
               (accum '()))
      (cond
       ((< num 1) (apply append accum))
       (else
        (let* ((val (^2 num))
               (str (number->string val)))
          (loop (- num 1)
                (cons
                 (cond
                  ((hasdupchars str) '())
                  (else
                   (apply
                    append
                    (map
                     (lambda (combs)
                       (if (apply valid? (append
                                          combs
                                          (list (apply string-append combs))))
                           (list combs)
                           '()))
                     (strspln 4 str)))))
                 accum))))))))
_______________________________________________
cs-lisp mailing list
cs-lisp@cs.bilgi.edu.tr
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp

Cevap