Add some arithmetic fuctions
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 26 Apr 2017 11:42:53 +0000 (13:42 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 26 Apr 2017 11:42:53 +0000 (13:42 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
exercices/arithmetic.lsp [new file with mode: 0755]
exercices/lists.lsp

diff --git a/exercices/arithmetic.lsp b/exercices/arithmetic.lsp
new file mode 100755 (executable)
index 0000000..85f3f01
--- /dev/null
@@ -0,0 +1,30 @@
+#!/usr/bin/env newlisp
+
+(define (Puissance P N)
+  (cond
+    ((= N 0) 1)
+    ((= N 1) P)
+    ((< N 0) (div 1 (Puissance P (- N))))
+    ((* P (Puissance P (- N 1))))))
+(println (Puissance 5 5))
+
+; https://fr.wikipedia.org/wiki/Algorithme_d%27Euclide
+(define (pgcd N P) 
+  (cond
+    ((< N P) (pgcd P N))
+    ((= N P) N)
+    ((= P 0) N)
+    ((pgcd (- N P) P))))
+(println (pgcd 12 4))
+(println (pgcd 25 5))
+(println (pgcd 21 7))
+
+; https://fr.wikipedia.org/wiki/Coefficient_binomial
+(define (comb N P) 
+  (cond
+    ((= P 0) 1)
+    ((= N P) 1)
+    ((+ (comb (- 1 N) P) (comb (- 1 N) (- 1 P))))))
+;(println (comb 5 4))
+
+(exit)
index 1930b1ca3a6e1b18cdf0300b80c11b6bec5a0299..39114ad8d0ba3f786f287ec5e8c015209ff50add 100755 (executable)
@@ -7,6 +7,7 @@
   (if (null? L) nil
     (if (= (first L) E) true
       (mem E (rest L)))))
   (if (null? L) nil
     (if (= (first L) E) true
       (mem E (rest L)))))
+(println "mem rt bool")
 (println (mem 9 L))
 
 (define (boolmemrec E L)
 (println (mem 9 L))
 
 (define (boolmemrec E L)
     ((null? L) nil)
     ((= (first L) E) true)
     ((mem E (rest L)))))
     ((null? L) nil)
     ((= (first L) E) true)
     ((mem E (rest L)))))
+(println "mem rec rt bool")
 (println (boolmemrec 10 L))
 
 (define (mem E L) ;la function mem a 2 arguments
   (if (null? L) nil
     (if (= (first L) E) L
       (mem E (rest L)))))
 (println (boolmemrec 10 L))
 
 (define (mem E L) ;la function mem a 2 arguments
   (if (null? L) nil
     (if (= (first L) E) L
       (mem E (rest L)))))
+(println "mem rt list")
 (println (mem 3 L))
 
 (define (mem E L)
 (println (mem 3 L))
 
 (define (mem E L)
@@ -27,6 +30,7 @@
     ((null? L) nil)
     ((= (first L) E) L)
     ((mem E (rest L)))))
     ((null? L) nil)
     ((= (first L) E) L)
     ((mem E (rest L)))))
+(println "mem rec rt list")
 (println (mem 9 L))
 (println (member 9 L))
 (println (mem 8 L))
 (println (mem 9 L))
 (println (member 9 L))
 (println (mem 8 L))
@@ -35,6 +39,7 @@
 (define (concatene L1 L2)
   (if (null? L1) L2
     (cons (first L1) (concatene (rest L1) L2))))
 (define (concatene L1 L2)
   (if (null? L1) L2
     (cons (first L1) (concatene (rest L1) L2))))
+(println "concatene/append")
 (setq C (concatene L M))
 (println C)
 (println (append L M))
 (setq C (concatene L M))
 (println C)
 (println (append L M))
@@ -47,6 +52,7 @@
       ((= x (first L)) 0)
       ((+ 1 (rang x (rest L)))))
     nil))
       ((= x (first L)) 0)
       ((+ 1 (rang x (rest L)))))
     nil))
+(println "rang/find")
 (println (rang 4 L))
 (println (find 4 L))
 (println (rang 0 L))
 (println (rang 4 L))
 (println (find 4 L))
 (println (rang 0 L))
     ((null? L) '())
     ((= n 0) '())
     ((cons (first L) (tete (- n 1) (rest L))))))
     ((null? L) '())
     ((= n 0) '())
     ((cons (first L) (tete (- n 1) (rest L))))))
+(println "tete/slice")
 (println (tete 3 L))
 (println (slice L 0 3))
 (println (0 3 L))
 
 (println (tete 3 L))
 (println (slice L 0 3))
 (println (0 3 L))
 
-(define (inter L1 L2) 
+(define (intersectL L1 L2) 
   (cond
     ((null? L1) '())
   (cond
     ((null? L1) '())
-    ((member (first L1) L2) (cons (first L1) (inter (rest L1) L2)))
-    ((inter (rest L1) L2))))
-(println (inter L M))
+    ((member (first L1) L2) (cons (first L1) (intersectL (rest L1) L2)))
+    ((intersectL (rest L1) L2))))
+(println "intersectL/intersect")
+(println (intersectL L M))
 (println (intersect L M))
 
 (setq N '(1 9 3))
 (println (intersect L M))
 
 (setq N '(1 9 3))
@@ -78,6 +86,7 @@
     ((null? L2) nil)
     ((= (first L1) (first L2)) (inclu (rest L1) (rest L2))) 
     ((inclu L1 (rest L2)))))
     ((null? L2) nil)
     ((= (first L1) (first L2)) (inclu (rest L1) (rest L2))) 
     ((inclu L1 (rest L2)))))
+(println "inclu")
 (println (inclu N L))
 (println (inclu L M))
 ;did not found a newlisp builtin equivalent function
 (println (inclu N L))
 (println (inclu L M))
 ;did not found a newlisp builtin equivalent function
     ((null? L1) L2)
     ((member (first L1) L2) (unionE (rest L1) L2))
     ((cons (first L1) (unionE (rest L1) L2)))))
     ((null? L1) L2)
     ((member (first L1) L2) (unionE (rest L1) L2))
     ((cons (first L1) (unionE (rest L1) L2)))))
+(println "unionE/union")
 (println (unionE L M))
 (println (unionE N L))
 (println (unionE L M))
 (println (unionE N L))
+(println (union N L))
 
 ;(trace true)
 
 
 ;(trace true)
 
     ((null? L) 0) 
     ((atom? L) 0) 
     ((max (+ 1 (prof (first L))) (prof (rest L))))))
     ((null? L) 0) 
     ((atom? L) 0) 
     ((max (+ 1 (prof (first L))) (prof (rest L))))))
+(println "prof")
 (println (prof L))
 (println (prof T))
 
 (println (prof L))
 (println (prof T))
 
     ((null? L) nil)
     ((atom? L) (list L)) ;FIXME: the "casting" is not working properly
     ((append (aplatir (first L)) (aplatir (rest L))))))
     ((null? L) nil)
     ((atom? L) (list L)) ;FIXME: the "casting" is not working properly
     ((append (aplatir (first L)) (aplatir (rest L))))))
+(println "aplatir/flat")
 ;(println (aplatir T))
 (println (flat T))
 
 ;(println (aplatir T))
 (println (flat T))
 
     ((null? L) '())
     ((member (first L) (rest L)) (elim (rest L)))
     ((cons (first L) (elim (rest L))))))
     ((null? L) '())
     ((member (first L) (rest L)) (elim (rest L)))
     ((cons (first L) (elim (rest L))))))
+(println "elim/unique")
 (println (elim C))
 (println (unique C))
 
 (println (elim C))
 (println (unique C))
 
   (cond
     ((null? L) '())
     ((append (reverseL (rest L)) (list (first L))))))
   (cond
     ((null? L) '())
     ((append (reverseL (rest L)) (list (first L))))))
+(println "reverseL/reverse")
 (println (reverseL L))
 (println (reverse L))
 
 (println (reverseL L))
 (println (reverse L))
 
     ((null? L) '())
     ((>= (first L) n) (list< n (rest L)))
     ((cons (first L) (list< n (rest L))))))
     ((null? L) '())
     ((>= (first L) n) (list< n (rest L)))
     ((cons (first L) (list< n (rest L))))))
+(println "list<")
 (println (list< 5 L))
 (println (list< 5 C))
 
 (println (list< 5 L))
 (println (list< 5 C))
 
     ((null? L) '())
     ((< (first L) n) (list>= n (rest L)))
     ((cons (first L) (list>= n (rest L))))))
     ((null? L) '())
     ((< (first L) n) (list>= n (rest L)))
     ((cons (first L) (list>= n (rest L))))))
+(println "list>=")
 (println (list>= 5 C))
 
 (exit)
 (println (list>= 5 C))
 
 (exit)