puzzle-01.scm 981 B

12345678910111213141516171819202122232425262728293031323334
  1. (import
  2. (except (rnrs base) let-values map error)
  3. (only (guile) lambda* λ command-line)
  4. (srfi srfi-1)
  5. (fileio))
  6. (define find-number
  7. (λ (numbers)
  8. (let iter ([factors-outer numbers] [factors-inner numbers] [rest-numbers numbers])
  9. (cond
  10. [(null? factors-outer) (error "tried all combinations")]
  11. [(null? factors-inner)
  12. ;; can now discard the first number
  13. (iter (cdr factors-outer) rest-numbers (cdr rest-numbers))]
  14. [else
  15. (let ([fac1 (car factors-outer)] [fac2 (car factors-inner)])
  16. (cond
  17. [(= (+ fac1 fac2) 2020) (* fac1 fac2)]
  18. [else
  19. (iter factors-outer (cdr factors-inner) rest-numbers)]))]))))
  20. (define main
  21. (λ (cmd-line-args)
  22. (let* ([lines (get-lines-from-file (cadr cmd-line-args))]
  23. [numbers (map string->number lines)])
  24. (find-number numbers))))
  25. (simple-format (current-output-port)
  26. "~a\n"
  27. (main (command-line)))