2.rkt 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #lang racket
  2. (require "../lib/obj.rkt")
  3. (define (get-lines fp)
  4. (let loop ((lines '()))
  5. (define l (read-line fp))
  6. (if (eof-object? l)
  7. (reverse lines)
  8. (loop (cons l lines)))))
  9. (define fp (open-input-file "input"))
  10. (define lines (get-lines fp))
  11. (define (strip-head s)
  12. (string-trim (cadr (string-split s ":"))))
  13. (set! lines (map strip-head lines))
  14. (define make-card (obj-maker 'win-nums 'nums))
  15. (define (parse-card s)
  16. (define lst (string-split s "|"))
  17. (define win-nums (map string->number (string-split (car lst))))
  18. (define nums (map string->number (string-split (cadr lst))))
  19. (make-card win-nums nums))
  20. (define cards (map parse-card lines))
  21. (define card-count (make-vector (length cards) 1))
  22. (define (win-count card)
  23. (length (filter (lambda (x) (member x (card 'win-nums))) (card 'nums))))
  24. (define card-vec (list->vector cards))
  25. (let loop ((i 0))
  26. (if (>= i (vector-length card-count))
  27. (void)
  28. (let ()
  29. (define win-cnt (win-count (vector-ref card-vec i)))
  30. (let loop ((j (+ i 1)))
  31. (if (or (>= j (vector-length card-count))
  32. (>= j (+ 1 i win-cnt)))
  33. (void)
  34. (let ()
  35. (vector-set! card-count j (+ (vector-ref card-count i)
  36. (vector-ref card-count j)))
  37. (loop (+ 1 j)))))
  38. (loop (+ 1 i)))))
  39. (apply + (vector->list card-count))