aboutsummaryrefslogtreecommitdiff
path: root/racket/leetcode/lc-1496-path-crossing.rkt
blob: 9c1941d637520029f7a38d16b6b4090e72988e78 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#lang racket
(define/contract (is-path-crossing path)
  (-> string? boolean?)
  (for/fold ([current-x 0]
             [current-y 0]
             [trail (set '(0 0))]
             [check #false]
             #:result check)
            ([step (in-list (string->list path))]
             #:break check)
    (let*-values
        ([(new-x new-y)
          (case step
            [(#\N) (values current-x (add1 current-y))]
            [(#\S) (values current-x (sub1 current-y))]
            [(#\E) (values (add1 current-x) current-y)]
            [(#\W) (values (sub1 current-x) current-y)])]
         [(new-trail-point) (list new-x new-y)])
      (cond [(set-member? trail new-trail-point)
             (values void void void #true)]
            [else
             (values new-x
                     new-y
                     (set-add trail new-trail-point)
                     #false)]))))