namekuseijin

1000 lockers problem

Apr 6th, 2012
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 1.00 KB | None | 0 0
  1. ; 1000 lockers problem
  2. ; as in http://www.reddit.com/r/dailyprogrammer/comments/ruiob/452012_challenge_36_easy/
  3. (define this-many-lockers 1000)
  4. (define locked #t)
  5. (define lockers (make-vector this-many-lockers locked))
  6.  
  7. (define (toggle! locker)
  8.   (let ((n (+ -1 locker))) ; because vectors are zero-based but lockers begin from 1
  9.     (vector-set! lockers n (not (vector-ref lockers n)))))
  10.  
  11. (define (open? locker) (not (vector-ref lockers (+ -1 locker))))
  12.  
  13. (define (multiples n upto)
  14.   (let f ((x 1))
  15.     (let ((m (* x n)))
  16.       (if (> m upto) `()
  17.           (cons m (f (+ 1 x)))))))
  18.  
  19. (let unleash ((student 1))
  20.   (if (> student this-many-lockers) 'gone
  21.       (begin
  22.         (for-each (lambda (x) (toggle! x)) (multiples student this-many-lockers))
  23.         (unleash (+ 1 student)))))
  24.  
  25. (define open-lockers
  26.   (let check ((l 1))
  27.     (if (> l this-many-lockers) `()
  28.         (if (open? l)
  29.             (cons l (check (+ 1 l)))
  30.             (check (+ 1 l))))))
  31.  
  32. (length open-lockers)
  33. open-lockers
Add Comment
Please, Sign In to add comment