fork download
  1. ; three in a row
  2.  
  3. (define (unique eql? xs)
  4. (cond ((null? xs) '())
  5. ((null? (cdr xs)) xs)
  6. ((eql? (car xs) (cadr xs))
  7. (unique eql? (cdr xs)))
  8. (else (cons (car xs) (unique eql? (cdr xs))))))
  9.  
  10. (define (julian year month day)
  11. (let* ((a (quotient (- 14 month) 12))
  12. (y (+ year 4800 (- a)))
  13. (m (+ month (* 12 a) -3)))
  14. (+ day
  15. (quotient (+ (* 153 m) 2) 5)
  16. (* 365 y)
  17. (quotient y 4)
  18. (- (quotient y 100))
  19. (quotient y 400)
  20. (- 32045))))
  21.  
  22. (define sample-input '(
  23. ("01/11/2018" . "0003")
  24. ("01/12/2018" . "0003")
  25. ("01/13/2018" . "0004")
  26. ("01/13/2018" . "0003")))
  27.  
  28. (define (first-three-in-a-row xs)
  29. (and (pair? xs) (pair? (cdr xs)) (pair? (cddr xs))
  30. (= (+ (car xs) 1) (cadr xs))
  31. (= (+ (car xs) 2) (caddr xs))))
  32.  
  33. (define (cdrs xs)
  34. (do ((ys xs (cdr ys)) (yss (list) (cons (cdr ys) yss)))
  35. ((null? ys) (cons xs (reverse yss)))))
  36.  
  37. (define (signature x)
  38. (+ (* (string->number (cdr x)) 10000000)
  39. (julian (string->number (substring (car x) 6 10))
  40. (string->number (substring (car x) 0 2))
  41. (string->number (substring (car x) 3 5)))))
  42.  
  43. (define (three-in-a-row xs)
  44. (unique = (map (lambda (n) (quotient n 10000000))
  45. (map car (filter first-three-in-a-row
  46. (cdrs (unique = (sort (map signature xs) <))))))))
  47.  
  48. (display (three-in-a-row sample-input)) (newline)
Success #stdin #stdout 0.04s 8216KB
stdin
Standard input is empty
stdout
(3)