From 26b362a416666dfb7b64f668d16921b8da6c6000 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Sat, 26 Dec 2020 19:47:41 -0800 Subject: [PATCH] day 16, part 2: csp solution --- 2020/16.rkt | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/2020/16.rkt b/2020/16.rkt index 138ea8c..6496142 100644 --- a/2020/16.rkt +++ b/2020/16.rkt @@ -56,9 +56,31 @@ (hash-update! col-preds k (λ (vs) (set-remove! vs predidx) vs)))) (loop))) -(check-equal? - (for*/product ([(colidx predidx) (in-hash assignment)] - [pred (in-value (list-ref predicates predidx))] - #:when (regexp-match "departure" (predicate-name pred))) - (list-ref (ticket->ints my-ticket) colidx)) - 426362917709) \ No newline at end of file +(define (test-assignment assignment) + (for*/product ([(colidx predidx) (in-dict assignment)] + [pred (in-value (list-ref predicates predidx))] + #:when (regexp-match "departure" (predicate-name pred))) + (list-ref (ticket->ints my-ticket) colidx))) + +(check-equal? (test-assignment assignment) 426362917709) + +;; CSP solution +(require csp) +(define col-pred-prob (make-csp)) +(define var-names (make-var-names "col" (range (length cols)))) +(add-vars! col-pred-prob var-names (range (length cols))) +(add-pairwise-constraint! col-pred-prob alldiff var-names) +(for ([(colvar colidx) (in-indexed var-names)]) + (add-constraint! col-pred-prob + (λ (predidx) (andmap (predicate-func (list-ref predicates predidx)) + (list-ref cols colidx))) (list colvar))) + +(define csp-assignment + (parameterize ([current-select-variable mrv-degree-hybrid] + [current-order-values shuffle] + [current-node-consistency #t]) + (for/list ([(col predidx) (in-dict (solve col-pred-prob))]) + (define colidx (string->number (car (regexp-match #px"\\d+" (~a col))))) + (cons colidx predidx)))) + +(check-equal? (test-assignment csp-assignment) 426362917709) \ No newline at end of file