Solution of Burak BOGA



(define (Aces hand)
	(accumulate + (every (lambda (x)
				     (if (member? 'A x)
					 4
					 0)) hand))) 
					 
(define (Suitlength hand arg)
        (accumulate + (every (lambda (x)
				     (if (member? arg x)
					 1
					 0)) hand)))

; arg = '(SK HK DK CK)
(define (King hand arg)
 	(accumulate + (every (lambda (x)
			             (if (and (> (Suitlength hand (first x)) 1)
					      (member? x hand))  
					 3
					 0)) arg)))

; arg = '(SQ HQ DQ CQ)
(define (Queen hand arg)
        (accumulate + (every (lambda (x)
                                     (if (and (> (Suitlength hand (first x)) 2)
                                              (member? x hand))
                                         2 
                                         0)) arg)))


; arg = '(SJ HJ DJ CJ) 
(define (Jack hand arg)
        (accumulate + (every (lambda (x)
                                     (if (and (> (Suitlength hand (first x)) 3)
                                              (member? x hand))
                                         1 
                                         0)) arg)))

; arg = 'SHDC 
(define (Void hand arg)
        (accumulate + (every (lambda (x)
                                     (if (= (Suitlength hand x) 0)
                                         3 
                                         0)) arg)))

; arg = 'SHDC 
(define (Singleton hand arg)
        (accumulate + (every (lambda (x)
                                     (if (= (Suitlength hand x) 1)
                                         2 
                                         0)) arg)))

; arg = 'SHDC
(define (Balanced hand arg)
        (if (= (accumulate + (every (lambda (x)
                                            (if (> (Suitlength hand x) 2)
                                                3 
                                                0)) arg)) 12)
            #t
            #f))


(define (Point hand)
 	(accumulate + (se (Aces hand) 
		          (King hand '(SK HK DK CK)) 
		          (Queen hand '(SQ HQ DQ CQ))
		          (Jack hand '(SJ HJ DJ CJ))
		          (Void hand 'SHDC)
		          (Singleton hand 'SHDC))))

;arg = 'shdc
(define (LongestSuit hand arg)
	(accumulate (lambda (x y)
			    (if (<= (Suitlength hand x) (Suitlength hand y))
				y
				x)) arg)) 


(define (Stoppers hand)
	(and (helper hand 's) 
	     (helper hand 'h) 
  	     (helper hand 'd) 
   	     (helper hand 'c)))

(define (helper hand x)
	(or (and (or (member? (word x 'A) hand)
	             (member? (word x 'K) hand))
	         (> (Suitlength hand x) 1))
	    (and (member? (word x 'Q) hand)
	         (> (Suitlength hand x) 2))))


(define (OPENBID hand)
      (cond ((and (< (Point hand) 13)
		  (< (Suitlength hand (LongestSuit hand 'shdc)) 7)) 'PASS)
            ((and (> (Point hand) 12)
		  (< (Point hand) 16)) (se 1 (LongestSuit hand 'shdc)))
    	    ((and (> (Point hand) 15)
		  (< (Point hand) 20) 	
		  (or (not (Stoppers hand)) 
	              (not (Balanced hand 'shdc)))) (se 1 (LongestSuit hand 'shdc)))
	    ((and (> (Point hand) 15)
                  (< (Point hand) 20)
                  (Stoppers hand)
		  (Balanced hand 'shdc)) (se 1 '(NO TRUMP))) 
	    ((and (>= (Point hand) 20)
		  (or (not (Stoppers hand))
                      (not (Balanced hand 'shdc)))) (se 2 (LongestSuit hand 'shdc)))
	    ((and (>= (Point hand) 20) 
	          (Stoppers hand)
                  (Balanced hand 'shdc)) (se 2 '(NO TRUMP)))
	    ((and (> (Point hand) 6)
		  (< (Point hand) 13)
		  (> (Suitlength hand (LongestSuit hand 'shdc)) 6)
 	    ) (se 3 (LongestSuit hand 'shdc)))
            (#t 'PASS)))