fork download
  1. ; roomba
  2.  
  3. (define (split n xs)
  4. (let loop ((n n) (xs xs) (zs '()))
  5. (if (or (zero? n) (null? xs))
  6. (values (reverse zs) xs)
  7. (loop (- n 1) (cdr xs) (cons (car xs) zs)))))
  8.  
  9. (define (split-while pred? xs)
  10. (let loop ((xs xs) (ys '()))
  11. (if (or (null? xs) (not (pred? (car xs))))
  12. (values (reverse ys) xs)
  13. (loop (cdr xs) (cons (car xs) ys)))))
  14.  
  15. (define (digits n . args)
  16. (let ((b (if (null? args) 10 (car args))))
  17. (let loop ((n n) (d '()))
  18. (if (zero? n) d
  19. (loop (quotient n b)
  20. (cons (modulo n b) d))))))
  21.  
  22. (define (get-command cs)
  23. (call-with-values
  24. (lambda () (split 1 cs))
  25. (lambda (dir rest)
  26. (call-with-values
  27. (lambda () (split-while char-numeric? rest))
  28. (lambda (digits rest)
  29. (values (car dir) (string->number (apply string digits)) rest))))))
  30.  
  31. (define (roomba x y str)
  32. (let loop ((x x) (y y) (cs (string->list str)))
  33. (if (null? cs) (values x y)
  34. (call-with-values
  35. (lambda () (get-command cs))
  36. (lambda (dir steps rest)
  37. (case dir
  38. ((#\N #\n) (loop x (+ y steps) rest))
  39. ((#\E #\e) (loop (+ x steps) y rest))
  40. ((#\S #\s) (loop x (- y steps) rest))
  41. ((#\W #\w) (loop (- x steps) y rest))))))))
  42.  
  43. (call-with-values
  44. (lambda () (roomba 0 0 "N3E5S2W6"))
  45. (lambda (x y) (display x) (newline)
  46. (display y) (newline)))
  47.  
  48. (call-with-values
  49. (lambda () (roomba 17 -3 "W4S19W33N17E37N2"))
  50. (lambda (x y) (display x) (newline)
  51. (display y) (newline)))
Success #stdin #stdout 0.01s 42848KB
stdin
Standard input is empty
stdout
-1
1
17
-3