d20
parent
5090ded0bc
commit
bbfca5f2a4
@ -0,0 +1,50 @@
|
||||
#lang br/quicklang
|
||||
(require "../helper.rkt")
|
||||
(provide read-syntax (rename-out [#%mb #%module-begin]) ★ ★★)
|
||||
|
||||
(define (read-syntax path port)
|
||||
(define str (let* ([str (port->string port)]
|
||||
[str (string-replace str "," " ")]
|
||||
[str (string-replace str "<" "(")]
|
||||
[str (string-replace str ">" ")")])
|
||||
str))
|
||||
(strip-context #`(module mod "main.rkt"
|
||||
#,@(for/list ([line (in-lines (open-input-string str))])
|
||||
(for/list ([datum (in-port read (open-input-string line))])
|
||||
datum)))))
|
||||
|
||||
(define-macro (#%mb (STARS) (p= PNUMS v= VNUMS a= ANUMS) ...)
|
||||
#`(#%module-begin
|
||||
(time (STARS (particle 'PNUMS 'VNUMS 'ANUMS) ...))))
|
||||
|
||||
(struct particle (pos vel acc) #:transparent)
|
||||
|
||||
(define (do-tick p)
|
||||
(define next-vel (map + (particle-vel p) (particle-acc p)))
|
||||
(define next-pos (map + (particle-pos p) next-vel))
|
||||
(particle next-pos next-vel (particle-acc p)))
|
||||
|
||||
(define (dist p) (apply + (map abs (particle-pos p))))
|
||||
|
||||
(define (remove-collisions particles)
|
||||
(define (find-duplicate-particle ps) (check-duplicates ps #:key particle-pos))
|
||||
(for/fold ([ps particles]
|
||||
[dup (find-duplicate-particle particles)]
|
||||
#:result ps)
|
||||
([i (in-naturals)]
|
||||
#:break (not dup))
|
||||
(values (filter-not (λ (p) (andmap = (particle-pos dup) (particle-pos p))) ps)
|
||||
(find-duplicate-particle ps))))
|
||||
|
||||
(define (closest particles #:collisions [collisions? #f])
|
||||
(for/fold ([particles particles]
|
||||
#:result (if collisions?
|
||||
(length particles)
|
||||
(argmin cdr (for/list ([(p pidx) (in-indexed particles)])
|
||||
(cons pidx (dist p))))))
|
||||
([i (in-range 1000)])
|
||||
((if collisions? remove-collisions values) (map do-tick particles))))
|
||||
|
||||
(define (★ . particles) (closest particles))
|
||||
|
||||
(define (★★ . particles) (closest particles #:collisions #t))
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,3 @@
|
||||
#lang reader "main.rkt" ★ ; 0
|
||||
p=< 3,0,0>, v=< 2,0,0>, a=<-1,0,0>
|
||||
p=< 4,0,0>, v=< 0,0,0>, a=<-2,0,0>
|
@ -0,0 +1,5 @@
|
||||
#lang reader "main.rkt" ★★
|
||||
p=<-6,0,0>, v=< 3,0,0>, a=< 0,0,0>
|
||||
p=<-4,0,0>, v=< 2,0,0>, a=< 0,0,0> ; -6 -5 -4 -3 -2 -1 0 1 2 3
|
||||
p=<-2,0,0>, v=< 1,0,0>, a=< 0,0,0> ; (0) (1) (2) (3)
|
||||
p=< 3,0,0>, v=<-1,0,0>, a=< 0,0,0>
|
Reference in New Issue