-(define (count-scores-for-progs progs)
- (map (lambda (prog)
- (count-scores-for-name scores (prog-name prog)))
- progs))
-
-(define (count-scores-for-name scores name)
- (let loop ((score 0)
- (remaining-scores scores))
- (if (null? remaining-scores)
- score
- (loop
- (let ((this-score (car remaining-scores)))
- (cond
- ((eq? (caar this-score) name)
- (loop (+ score (cadar this-score)) (cdr remaining-scores)))
- ((eq? (caadr this-score) name)
- (loop (+ score (cadadr this-score)) (cdr remaining-scores)))))))))
+(define (challenge hill-dir challenger-file)
+ (let* ((spec (load-spec hill-dir))
+ (scores (load-scores hill-dir))
+ (challenger-prog (file->prog challenger-file))
+ (hill-progs (map file->prog (hill-files hill-dir))))
+ (if (memq (prog-name challenger-prog) (map prog-name hill-progs))
+ (print "Challenger already on hill!")
+ (let ((new-scores (append (score-challenger-matches spec challenger-prog hill-progs)
+ scores)))
+ (save-scores new-scores hill-dir)
+ (hill-add-file challenger-file (prog-name challenger-prog) hill-dir)))))
+