This should cover most of the remaining linting errors. After this, I expect fewer than ten linting errors.
		
			
				
	
	
		
			93 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
| ;;; series.el --- Hosting common series of numbers -*- lexical-binding: t -*-
 | |
| 
 | |
| ;; Author: William Carroll <wpcarro@gmail.com>
 | |
| ;; Version: 0.0.1
 | |
| ;; URL: https://git.wpcarro.dev/wpcarro/briefcase
 | |
| ;; Package-Requires: ((emacs "24"))
 | |
| 
 | |
| ;;; Commentary:
 | |
| ;; Encoding number series as I learn about them.
 | |
| ;;
 | |
| ;; These are the following series I'm interested in supporting:
 | |
| ;; - Fibonacci
 | |
| ;; - Catalan numbers
 | |
| ;; - Figurate number series
 | |
| ;;   - Triangular
 | |
| ;;   - Square
 | |
| ;;   - Pentagonal
 | |
| ;;   - Hexagonal
 | |
| ;;   - Lazy-caterer
 | |
| ;; - Magic square
 | |
| ;; - Look-and-say
 | |
| 
 | |
| ;;; Code:
 | |
| 
 | |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | |
| ;; Dependencies
 | |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | |
| 
 | |
| (require 'number)
 | |
| 
 | |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | |
| ;; Library
 | |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | |
| 
 | |
| (defun series-range (beg end)
 | |
|   "Create a list of numbers from `BEG' to `END'.
 | |
| This is an inclusive number range."
 | |
|   (if (< end beg)
 | |
|       (list-reverse
 | |
|        (number-sequence end beg))
 | |
|     (number-sequence beg end)))
 | |
| 
 | |
| (defun series-fibonacci-number (i)
 | |
|   "Return the number in the fibonacci series at `I'."
 | |
|   (cond
 | |
|    ((= 0 i) 0)
 | |
|    ((= 1 i) 1)
 | |
|    (t (+ (series-fibonacci-number (- i 1))
 | |
|          (series-fibonacci-number (- i 2))))))
 | |
| 
 | |
| (defun series-fibonacci (n)
 | |
|   "Return the first `N' numbers of the fibonaccci series starting at zero."
 | |
|   (if (= 0 n)
 | |
|       '()
 | |
|     (list-reverse
 | |
|      (list-cons (series-fibonacci-number (number-dec n))
 | |
|                 (list-reverse
 | |
|                  (series-fibonacci (number-dec n)))))))
 | |
| 
 | |
| ;; TODO: Consider memoization.
 | |
| (defun series-triangular-number (i)
 | |
|   "Return the number in the triangular series at `I'."
 | |
|   (if (= 0 i)
 | |
|       0
 | |
|     (+ i (series-triangular-number (number-dec i)))))
 | |
| 
 | |
| ;; TODO: Improve performance.
 | |
| ;; TODO: Consider creating a stream protocol with `stream/next' and implement
 | |
| ;; this using that.
 | |
| (defun series-triangular (n)
 | |
|   "Return the first `N' numbers of a triangular series starting at 0."
 | |
|   (if (= 0 n)
 | |
|       '()
 | |
|     (list-reverse
 | |
|      (list-cons (series-triangular-number (number-dec n))
 | |
|                 (list-reverse
 | |
|                  (series-triangular (number-dec n)))))))
 | |
| 
 | |
| (defun series-catalan-number (i)
 | |
|   "Return the catalan number in the series at `I'."
 | |
|   (if (= 0 i)
 | |
|       1
 | |
|     (/ (number-factorial (* 2 i))
 | |
|        (* (number-factorial (number-inc i))
 | |
|           (number-factorial i)))))
 | |
| 
 | |
| (defun series-catalan (n)
 | |
|   "Return the first `N' numbers in a catalan series."
 | |
|   (->> (series-range 0 (number-dec n))
 | |
|        (list-map #'series-catalan-number)))
 | |
| 
 | |
| (provide 'series)
 | |
| ;;; series.el ends here
 |