meo
This commit is contained in:
parent
5902a5b7e2
commit
fc14f5ee76
|
@ -0,0 +1,46 @@
|
|||
#lang racket
|
||||
|
||||
(require graph)
|
||||
|
||||
(struct conj [name] #:transparent)
|
||||
(struct requirement [name] #:transparent)
|
||||
(struct item [name] #:transparent)
|
||||
|
||||
(define (requirements->req-graph requirements)
|
||||
(define G (directed-graph '()))
|
||||
(for ([(req-name deps-any-of) (in-hash requirements)])
|
||||
(define d (requirement req-name))
|
||||
(add-vertex! G d)
|
||||
(for ([deps-all-of (in-list deps-any-of)])
|
||||
(define c (conj (gensym)))
|
||||
(add-directed-edge! G d c)
|
||||
(for ([dep (in-list (if (list? deps-all-of) deps-all-of (list deps-all-of)))])
|
||||
(add-directed-edge! G c (if (hash-has-key? requirements dep)
|
||||
(requirement dep)
|
||||
(item dep))))))
|
||||
G)
|
||||
|
||||
(define (attainable-list held requirements)
|
||||
(define G (requirements->req-graph requirements))
|
||||
(define-vertex-property G attainable?
|
||||
#:init (or (and (item? $v) (set-member? held (item-name $v)))
|
||||
(conj? $v)
|
||||
(and (requirement? $v) (empty? (get-neighbors G $v)))))
|
||||
(do-dfs G
|
||||
#:visit?: #t
|
||||
#:epilogue: (cond
|
||||
[(and (conj? $from) (not (attainable? $to)))
|
||||
(attainable?-set! $from #f)]
|
||||
[(and (requirement? $from) (attainable? $to))
|
||||
(attainable?-set! $from #t)]))
|
||||
(for/list ([v (in-vertices G)] #:when (and (requirement? v) (attainable? v)))
|
||||
(requirement-name v)))
|
||||
|
||||
(define requirements
|
||||
(hash "a" (list (list "apples" "bananas" "meows") (list "bananas") (list "c"))
|
||||
"b" '()
|
||||
"c" (list (list "apples" "meows"))))
|
||||
(define held (set "apples" "bananas" "clementines"))
|
||||
|
||||
(module+ main
|
||||
(displayln (attainable-list held requirements)))
|
Loading…
Reference in New Issue