PasteRack.org
Paste # 11996
2015-12-02 18:01:44

Fork as a new paste.

Paste viewed 565 times.


Embed:

AoC, 2

  1. #lang racket
  2. (define (foldl-small-sides f str)
  3.   (foldl + 0
  4.          (map
  5.           (lambda (p)
  6.             (let
  7.                 ([side-l (sort (map string->number (string-split p "x")) <)]
  8.                  [perimeter (lambda (s) (* 2 (apply + (take s 2))))]
  9.                  [area (lambda (s) (apply * (take s 2)))]
  10.                  [volume (lambda (s) (apply * s))])
  11.               (f side-l perimeter area volume)))
  12.           (string-split str "\n"))))
  13.  
  14. (define (elf-paper str)
  15.   (foldl-small-sides
  16.    (lambda (side-l perimeter area volume)
  17.      (+ (area side-l)
  18.         (sequence-fold + 0 (sequence-map area (in-permutations side-l))))) str))
  19.  
  20. (define (elf-ribbon str)
  21.   (foldl-small-sides
  22.    (lambda (side-l perimeter area volume)
  23.      (+ (perimeter side-l)
  24.         (volume side-l))) str))
  25.  
  26. (display (elf-paper "2x3x4\n1x1x10")) (newline)
  27. (display (elf-ribbon "2x3x4\n1x1x10")) (newline)

=>

101

48