Skip to content

Instantly share code, notes, and snippets.

@rdivyanshu
Last active November 16, 2020 03:23
Show Gist options
  • Save rdivyanshu/a6ac8095e9e1cf6be2fbfc559838b130 to your computer and use it in GitHub Desktop.
Save rdivyanshu/a6ac8095e9e1cf6be2fbfc559838b130 to your computer and use it in GitHub Desktop.
Puzzle

Five chess fanatics always manage to fit in a round-robin before their train reaches Waterloo. Yesterday there were no ties in the final order (2 points for win, 1 for draw, 0 for loss). Alapin won his game against the only person who took a game off Bird. Catalan was the only person to lose a game against the financier, who was the only person to lose a game to Dunst. Alapin finished below the ghost-writer. The interpreter scored only 1 point total. The journalist fared worse than the hairdresser. As for Evans, you can work that out for yourself. What is each person’s score and occupation?

#lang rosette/safe
(require rosette/lib/angelic)
(define-syntax-rule (define-select vals x ...)
(begin (define x vals) ...))
(define-select (choose* 1 2 3 4 5)
alapin bird catalan dunst evan)
(define-select (choose* 1 2 3 4 5)
financier ghostwriter interpreter journalist hairdresser)
(define-select (choose* 0 1 2)
alapin-bird alapin-catalan alapin-dunst alapin-evan
bird-catalan bird-dunst bird-evan
catalan-dunst catalan-evan
dunst-evan)
(define-syntax-rule (define-complimentary a b)
(begin (define a (- 2 b))))
(define-complimentary bird-alapin alapin-bird)
(define-complimentary catalan-alapin alapin-catalan)
(define-complimentary catalan-bird bird-catalan)
(define-complimentary dunst-alapin alapin-dunst)
(define-complimentary dunst-bird bird-dunst)
(define-complimentary dunst-catalan catalan-dunst)
(define-complimentary evan-alapin alapin-evan)
(define-complimentary evan-bird bird-evan)
(define-complimentary evan-catalan catalan-evan)
(define-complimentary evan-dunst dunst-evan)
(define self -1)
(define alapin-list (list self alapin-bird alapin-catalan alapin-dunst alapin-evan))
(define bird-list (list bird-alapin self bird-catalan bird-dunst bird-evan))
(define catalan-list (list catalan-alapin catalan-bird self catalan-dunst catalan-evan))
(define dunst-list (list dunst-alapin dunst-bird dunst-catalan self dunst-evan))
(define evan-list (list evan-alapin evan-bird evan-catalan evan-dunst self))
(define (get-result-list person)
(cadr (assoc person (list (list alapin alapin-list)
(list bird bird-list)
(list catalan catalan-list)
(list dunst dunst-list)
(list evan evan-list)))))
(define (won-over person)
(let ([lst (get-result-list person)])
(map cdr (filter (lambda (p) (= (car p) 2))
(map cons lst (list alapin bird catalan dunst evan))))))
(define (lost-to person)
(let ([lst (get-result-list person)])
(map cdr (filter (lambda (p) (= (car p) 0))
(map cons lst (list alapin bird catalan dunst evan))))))
(define (score person)
(foldl + 0 (filter positive? (get-result-list person))))
(define solution
(solve
(begin
(assert (distinct? alapin bird catalan dunst evan))
(assert (distinct? financier ghostwriter interpreter journalist hairdresser))
(assert (distinct? (score alapin) (score bird) (score catalan) (score dunst) (score evan)))
(assert (= (length (lost-to bird)) 1))
(assert (= (list-ref alapin-list (- (car (lost-to bird)) 1)) 2))
(assert (not (= catalan financier)))
(assert (not (= financier dunst)))
(assert (not (= alapin ghostwriter)))
(assert (= (length (won-over financier)) 1))
(assert (= (car (won-over financier)) catalan))
(assert (= (length (won-over dunst)) 1))
(assert (= (car (won-over dunst)) financier))
(assert (< (score alapin) (score ghostwriter)))
(assert (= 0 (length (filter (lambda (x) (and (< x (score ghostwriter))
(< (score alapin) x)))
(map score (list alapin bird catalan dunst evan))))))
(assert (= (score interpreter) 1))
(assert (< (score journalist) (score hairdresser))))))
(define person (list (list 'alapin alapin)
(list 'bird bird)
(list 'catalan catalan)
(list 'dunst dunst)
(list 'evan evan)))
(define profession (list (list financier 'financier)
(list ghostwriter 'ghostwriter)
(list interpreter 'interpreter)
(list journalist 'journalist)
(list hairdresser 'hairdresser)))
(for-each (lambda (x)
(display (car x))
(display " ")
(display (evaluate (cadr (assoc (cadr x) profession)) solution))
(display " ")
(display (evaluate (score (cadr x)) solution))
(displayln ""))
person)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment