/0011.rkt

http://github.com/samdphillips/euler · Racket · 95 lines · 28 code · 4 blank · 63 comment · 0 complexity · b7913ca6291a22e780fc7c94bff17173 MD5 · raw file

  1. #lang racket/base
  2. #|
  3. In the 20×20 grid below, four numbers along a diagonal
  4. line have been marked in red.
  5. 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  6. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  7. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  8. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  9. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  10. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  11. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  12. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  13. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  14. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  15. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  16. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  17. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  18. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  19. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  20. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  21. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  22. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  23. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  24. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
  25. The product of these numbers is 26 × 63 × 78 × 14 = 1788696.
  26. What is the greatest product of four adjacent numbers in any
  27. direction (up, down, left, right, or diagonally) in the
  28. 20×20 grid?
  29. |#
  30. (define the-grid
  31. (vector 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  32. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  33. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  34. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  35. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  36. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  37. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  38. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  39. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  40. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  41. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  42. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  43. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  44. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  45. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  46. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  47. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  48. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  49. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  50. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48))
  51. (define (pos->index x y)
  52. (and (< y 20)
  53. (< x 20)
  54. (+ y (* 20 x))))
  55. (define (cell x y)
  56. (vector-ref the-grid (pos->index x y)))
  57. (define (row x y)
  58. (for/fold ([n 1]) ([y (in-range y (+ y 4))])
  59. (* n (cell x y))))
  60. (define (col x y)
  61. (for/fold ([n 1]) ([x (in-range x (+ x 4))])
  62. (* n (cell x y))))
  63. (define (diag-down x y)
  64. (for/fold ([n 1]) ([x (in-range x (+ x 4))]
  65. [y (in-range y (+ y 4))])
  66. (* n (cell x y))))
  67. (define (diag-up x y)
  68. (for/fold ([n 1]) ([x (in-range x (- x 4) -1)]
  69. [y (in-range y (+ y 4))])
  70. (* n (cell x y))))
  71. (define (max-range f xmin xmax ymin ymax)
  72. (for*/fold ([v 0]) ([x (in-range xmin xmax)]
  73. [y (in-range ymin ymax)])
  74. (max v (f x y))))
  75. (define (solve)
  76. (max (max-range row 0 20 0 17)
  77. (max-range col 0 17 0 20)
  78. (max-range diag-down 0 17 0 17)
  79. (max-range diag-up 3 20 0 17)))