Skip to content

Instantly share code, notes, and snippets.

@Yeboster
Created November 2, 2019 14:44
Show Gist options
  • Save Yeboster/6797095dfc11782241eec1caf98d2af9 to your computer and use it in GitHub Desktop.
Save Yeboster/6797095dfc11782241eec1caf98d2af9 to your computer and use it in GitHub Desktop.
Custom base and the rational value of the base into decimal value - scheme
(define find-char ; value: integer
(lambda (str chr) ; str: string; chr: char
(let ((last-pos (- (string-length str) 1)))
(let ((is-char? (char=? chr (string-ref str last-pos))))
(cond ((= (string-length str) 1) (if is-char? last-pos -1))
(is-char? last-pos)
(else (find-char (substring str 0 last-pos) chr)))))))
(define rep-sum
(lambda (base str exp-num)
(let ((base-value-to-int (lambda (char) (find-char base char))) (digit-value (lambda (num) (* num (expt (string-length base) exp-num)))))
(let ((fst-digit-value (digit-value (base-value-to-int (string-ref str 0)))))
(if (= (string-length str) 1)
fst-digit-value
(+ (rep-sum base (substring str 1) (- exp-num 1)) fst-digit-value))))))
(define string-remove-at
(lambda (str pos)
(string-append (substring str 0 pos) (substring str (+ pos 1)))))
(define rep->number-abs
(lambda (base str)
(let ((point-pos (find-char str #\.)))
(if (= -1 point-pos)
(rep-sum base str (- (string-length str) 1))
(rep-sum base (string-remove-at str point-pos) (- point-pos 1))))))
(define rep->number ; value: integer
(lambda (base str) ; base: string with chars ordered ; str: string
(let ((fst-char-is? (lambda (char) (char=? (string-ref str 0) char))))
(cond ((fst-char-is? #\+) (rep->number-abs base (string-remove-at str 0)))
((fst-char-is? #\-) (* -1 (rep->number-abs base (string-remove-at str 0))))
(else (rep->number-abs base str))))))
(rep->number "zu" "-uuzz") ; => -12
(rep->number "0123" "+21.1") ; => 9.25
(rep->number "01234" "-10.02") ; => 5.08
(rep->number "0123456789ABCDEF" "0.A") ; => 0.625
(rep->number "0123456789ABCDEF" "1CF.0") ; => 463
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment