fork(2) download
  1. ; two-part interview question
  2.  
  3.  
  4. (define (maximum-by lt? . xs)
  5. (let loop ((xs (cdr xs)) (current-max (car xs)))
  6. (cond ((null? xs) current-max)
  7. ((lt? current-max (car xs))
  8. (loop (cdr xs) (car xs)))
  9. (else (loop (cdr xs) current-max)))))
  10.  
  11. (define (first-unique xs)
  12. (let loop ((dict (list)) (xs xs) (idx 0))
  13. (cond ((null? xs)
  14. (car (apply maximum-by (lambda (x y) (> (cdr x) (cdr y)))
  15. (filter (lambda (x) (cdr x)) dict))))
  16. ((assoc (car xs) dict)
  17. (loop (alist! (car xs) #f dict) (cdr xs) (+ idx 1)))
  18. (else (loop (cons (cons (car xs) idx) dict) (cdr xs) (+ idx 1))))))
  19.  
  20. (define (alist! key val xs)
  21. (let loop ((xs xs) (seen (list)))
  22. (cond ((null? xs) seen)
  23. ((eq? (caar xs) key)
  24. (append (cons (cons key val) (cdr xs)) seen))
  25. (else (loop (cdr xs) (cons (car xs) seen))))))
  26.  
  27. (display (first-unique '(3 5 3 2 1))) (newline)
  28.  
  29. (define (first-even xs)
  30. (let loop ((evens (list)) (odds (list)) (xs xs) (idx 0))
  31. (cond ((null? xs)
  32. (car (apply maximum-by (lambda (x y) (> (cdr x) (cdr y)))
  33. (filter (lambda (x) (cdr x)) evens))))
  34. ((assoc (car xs) evens)
  35. (loop (alist-remove (car xs) evens)
  36. (cons (assoc (car xs) evens) odds)
  37. (cdr xs) (+ idx 1)))
  38. ((assoc (car xs) odds)
  39. (loop (cons (assoc (car xs) odds) evens)
  40. (alist-remove (car xs) odds)
  41. (cdr xs) (+ idx 1)))
  42. (else (loop evens (cons (cons (car xs) idx) odds) (cdr xs) (+ idx 1))))))
  43.  
  44. (define (alist-remove key xs)
  45. (let loop ((xs xs) (seen (list)))
  46. (cond ((null? xs) seen)
  47. ((eq? (caar xs) key)
  48. (append (cdr xs) seen))
  49. (else (loop (cdr xs) (cons (car xs) seen))))))
  50.  
  51. (display (first-even '(5 3 5 1 5 1 3))) (newline)
Success #stdin #stdout 0.04s 8744KB
stdin
Standard input is empty
stdout
5
3