Anyone up for a dissertation? Multi-stepping debugging is, eh, pushing it.
On Jan 19, 2011, at 2:43 PM, Doug Orleans wrote:
The following program was a puzzle in the 2011 MIT Mystery Hunt held last
weekend. (I'm not linking directly to the site because they posted a
solution and I don't want you to be tempted to look at the answer
prematurely...) I was disappointed that Dr Racket doesn't seem to have a
multi-threaded stepping debugger, at least not in a form that could easily
run this program-- correct me if I'm wrong.
I would be interested to hear what other ideas people have about solving this
puzzle, either automatically or by hand (or some combination). But, I
haven't solved it myself yet, so I may be avoiding reading replies for a
while...
--Doug
Efficiency
The Prince is quite proud of his competitive Katamari-rolling time record,
having mastered the art of multitasking.
All procedure calls are evaluated from left to right.
(define (send x)
(if (or (integer? x) (char? x))
(display x)
(send x))
(flush-output)
#t)
(define (sendc x)
(if (and (= x 0) ( x 26))
(send (integer-char (+ 65 x)))
(sendc x)))
(define a 2)
(define b '(11))
(define c 5)
(define d 30)
(define e 3)
(thread
(lambda ()
(set! a (* a (first a)))
(send a)
(set! c (lambda () (- b 4)))
(set! c (lambda () (- b 11)))
(set! d (rest d))
(sendc (/ 4 (+ (- c) c)))
(set! a (sqrt (+ c (* c c
(sendc b)
(set! b '(((24 12 15 (2))) 1 (5 1) 3 2 8 10 (9 1 (3)) ((3) (1)) 5 14 10))
(set! d '())
(sendc (length (append c b)))
(sendc (length (append a b c c c d)))
(set! d 2)
(map (lambda (x)
(set! c (first b))
(sendc x)
(set! b c)) a)
(send (* (+ 3 (first c)) 100 (- (sqrt a) 1)))
(set! a (+ a 1))
(set! e (- e 1))
))
(thread
(lambda ()
(set! a (list c))
(set! a (lambda (x) (if x (sendc x) x)))
(let loop ()
(set! b (c))
(if (a b)
(loop)
(set! d '(2 4 8 16 32
(set! c (first d))
(set! c (second d))
(set! b (- a (sqrt (first d
(set! a (list 14 (- (length b) 1) c))
(let loop ()
(set! d b)
(if (null? d)
(set! a (+ a 1))
(begin
(sendc (first d))
(set! b (rest d))
(loop
(set! e (- e 1))
))
(thread
(lambda ()
(set! b d)
(set! c (lambda () (/ b 2)))
(let loop ()
(set! d (- d 10))
(if (and (= d 0)
(= b 0)
( b 0))
(set! b #f)
(loop)))
(set! c (first d))
(set! a 0)
(sendc (length b))
(set! c (list (second b)))
(sendc (sqrt (+ 12 (length d
(send (+ (/ (foldl * 26 a)
(+ (length (append a b))
(* (length c) (length c
d))
(set! a (first b))
(sendc (/ 204 a))
(set! e (- e 1))
))
(let loop ()
(if ( e 0)
(loop)
(newline)))
_
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/users
_
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/dev