aboutsummaryrefslogtreecommitdiff
path: root/racket/leetcode/lc-415-add-strings.rkt
blob: e140155b3175ad6c6a31d977822d2f4d52be1f17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#lang racket

(define/contract (add-strings num1 num2)
  (-> string? string? string?)
  (define (char->integer c)
    ((compose string->number string) c))
  (define pad-length
    (add1 (apply max (map string-length (list num1 num2)))))
  (define (pad-with-zeroes n)
    (~a n
        #:align 'right
        #:min-width pad-length 
        #:pad-string "0"))
  (define (string-reverse s)
    ((compose list->string reverse string->list) s))
  (define raw-sum
    (for/fold ([sum-string ""]
               [carry 0]
               #:result sum-string)
              ([n1 (string-reverse (pad-with-zeroes num1))]
               [n2 (string-reverse (pad-with-zeroes num2))])
      (let* ([digit-sum (+ carry (char->integer n1) (char->integer n2))]
             [sum-place (number->string (modulo digit-sum 10))]
             [sum-carry (quotient digit-sum 10)])
        (values (string-append sum-place sum-string)
                sum-carry))))
  (cond [(equal? raw-sum "00") "0"]
        [else (string-trim raw-sum "0" #:repeat? #t #:right? #f)]))