racket/collects/games/paint-by-numbers/raw-problems/size-calculation.rkt
2010-04-27 16:50:15 -06:00

184 lines
4.1 KiB
Racket

#lang scheme
(require "raw-hattori.ss")
(define (num-possibilities size col)
(let* ([col-len (length col)]
[boxes (+ col-len 1)]
[balls (- size (+ (apply + col) col-len))])
(if (< balls 0)
0
(f boxes balls))))
(define (f boxes balls)
(/ (! (+ boxes balls -1))
(* (! (- boxes 1)) (! balls))))
(define (! n)
(cond
[(zero? n) 1]
[else (* n (! (- n 1)))]))
(define (badness rows cols)
(let ([col-count (length rows)]
[row-count (length cols)])
(+ (apply + (map (lambda (x) (num-possibilities row-count x)) rows))
(apply + (map (lambda (x) (num-possibilities col-count x)) cols)))))
(pretty-print
(sort
(let loop ([hattoris raw-hattori])
(cond
[(null? hattoris) empty]
[else (let* ([hattori (car hattoris)]
[name (car hattori)]
[rows (cadr hattori)]
[cols (caddr hattori)])
(let ([badness (badness rows cols)])
(cons (list name badness)
(loop (cdr hattoris)))))]))
(lambda (x y) (< (cadr x) (cadr y)))))
#|
;; result of previous expression
(("Hattori 81" 158)
("Hattori 1" 205)
("Hattori 3" 647)
("Hattori 82" 709)
("Hattori 4" 842)
("Hattori 124" 911)
("Hattori 126" 931)
("Hattori 116" 1242)
("Hattori 2" 1243)
("Hattori 9" 1260)
("Hattori 13" 1437)
("Hattori 6" 1490)
("Hattori 22" 1516)
("Hattori 7" 1671)
("Hattori 19" 1761)
("Hattori 11" 1774)
("Hattori 5" 1804)
("Hattori 98" 1844)
("Hattori 137" 1857)
("Hattori 99" 2089)
("Hattori 8" 2182)
("Hattori 44" 2452)
("Hattori 100" 2575)
("Hattori 38" 2635)
("Hattori 10" 2835)
("Hattori 92" 3010)
("Hattori 32" 3036)
("Hattori 131" 3080)
("Hattori 16" 3207)
("Hattori 56" 3732)
("Hattori 121" 3748)
("Hattori 48" 3867)
("Hattori 118" 3898)
("Hattori 61" 3989)
("Hattori 17" 4121)
("Hattori 28" 4177)
("Hattori 35" 4414)
("Hattori 58" 4449)
("Hattori 18" 4562)
("Hattori 46" 4620)
("Hattori 133" 4634)
("Hattori 84" 4666)
("Hattori 96" 4668)
("Hattori 12" 4709)
("Hattori 102" 5006)
("Hattori 86" 5031)
("Hattori 30" 5133)
("Hattori 87" 5133)
("Hattori 14" 5495)
("Hattori 130" 5502)
("Hattori 42" 5650)
("Hattori 45" 5763)
("Hattori 54" 5947)
("Hattori 43" 5991)
("Hattori 41" 6140)
("Hattori 23" 6169)
("Hattori 136" 6295)
("Hattori 26" 6510)
("Hattori 62" 6614)
("Hattori 53" 6675)
("Hattori 31" 6866)
("Hattori 63" 6876)
("Hattori 57" 7182)
("Hattori 29" 7318)
("Hattori 50" 7325)
("Hattori 135" 7595)
("Hattori 104" 7941)
("Hattori 20" 8126)
("Hattori 103" 8126)
("Hattori 34" 8324)
("Hattori 60" 8330)
("Hattori 55" 8375)
("Hattori 67" 8549)
("Hattori 27" 8637)
("Hattori 127" 8648)
("Hattori 15" 8674)
("Hattori 33" 8729)
("Hattori 95" 8732)
("Hattori 39" 8855)
("Hattori 24" 9051)
("Hattori 132" 9371)
("Hattori 51" 9450)
("Hattori 37" 9582)
("Hattori 125" 9648)
("Hattori 83" 9698)
("Hattori 70" 9937)
("Hattori 25" 9942)
("Hattori 120" 10033)
("Hattori 68" 10110)
("Hattori 85" 10517)
("Hattori 65" 10556)
("Hattori 74" 10901)
("Hattori 90" 10913)
("Hattori 21" 11220)
("Hattori 59" 11255)
("Hattori 64" 11317)
("Hattori 89" 11323)
("Hattori 112" 11355)
("Hattori 77" 11627)
("Hattori 73" 11705)
("Hattori 139" 11806)
("Hattori 75" 11989)
("Hattori 49" 12203)
("Hattori 101" 12500)
("Hattori 71" 12522)
("Hattori 47" 12626)
("Hattori 52" 12646)
("Hattori 66" 12762)
("Hattori 72" 12942)
("Hattori 88" 13166)
("Hattori 79" 13223)
("Hattori 107" 13368)
("Hattori 40" 13558)
("Hattori 94" 13567)
("Hattori 106" 15177)
("Hattori 80" 15306)
("Hattori 113" 15776)
("Hattori 93" 16352)
("Hattori 91" 17856)
("Hattori 69" 18918)
("Hattori 105" 19069)
("Hattori 78" 19968)
("Hattori 97" 20828)
("Hattori 117" 21432)
("Hattori 134" 22118)
("Hattori 76" 24896)
("Hattori 36" 25351)
("Hattori 129" 27863)
("Hattori 138" 36306)
("Hattori 114" 46788)
("Hattori 128" 60393)
("Hattori 119" 64012)
("Hattori 111" 106611)
("Hattori 123" 110847)
("Hattori 108" 288996)
("Hattori 115" 330042)
("Hattori 109" 469815)
("Hattori 110" 516937)
("Hattori 122" 5784954))
|#