2908.rkt 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #lang racket
  2. (define/contract (minimum-sum nums)
  3. (-> (listof exact-integer?) exact-integer?)
  4. (let ([nums_size (length nums)])
  5. (if (< nums_size 3)
  6. -1
  7. (let _go ([m 153] [f nums] [s (cdr nums)] [t (cddr nums)])
  8. ;(printf "m(~a) f(~a) s(~a) t(~a)\n" m f s t)
  9. (if (< (length f) 3)
  10. (if (= m 153) -1 m)
  11. (if (< (length s) 2)
  12. (_go m (cdr f) (cddr f) (cdddr f))
  13. (if (pair? t)
  14. (let* ([fv (car f)] [sv (car s)] [tv (car t)])
  15. (if (and (< fv sv) (> sv tv))
  16. (_go (min (+ fv sv tv) m) f s (cdr t))
  17. (_go m f s (cdr t))
  18. )
  19. )
  20. (_go m f (cdr s) (cddr s))
  21. )
  22. )
  23. )
  24. )
  25. )
  26. )
  27. )
  28. (define (main)
  29. (define (r nums exp)
  30. (printf
  31. "(minimum-sum ~a) = ~a | Exp: ~a\n"
  32. nums (minimum-sum nums) exp
  33. )
  34. )
  35. (r '(8 6 1 5 3) 9)
  36. (r '(5 4 8 7 10 2) 13)
  37. (r '(6 5 4 3 4 5) -1)
  38. (r '(49 50 48) 147)
  39. )
  40. (main)