Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions exercises/alain.camanes/01_01-min_3/descr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Écrire une fonction `min3 a b c` qui, étant donnés trois arguments `a`, `b` et `c`, renvoie la valeur du plus petit des trois.

`min3 : 'a -> 'a -> 'a`
7 changes: 7 additions & 0 deletions exercises/alain.camanes/01_01-min_3/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"learnocaml_version": "1",
"kind": "exercise",
"stars": 0,
"title": "Exercice 1: Minimum 3",
"short_description": "Où l'on détermine le minimum de 3 éléments"
}
Empty file.
4 changes: 4 additions & 0 deletions exercises/alain.camanes/01_01-min_3/solution.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
let min3 a b c =
let (aa, bb) =
if a < b then (a,b) else (b,a) in
if aa < c then aa else c
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_01-min_3/template.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let min3 a b c = failwith "Put your code here"
25 changes: 25 additions & 0 deletions exercises/alain.camanes/01_01-min_3/test.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
open Test_lib
open Report

let exercise_1 =
Section ([ Text "Function: ";
Code "min3";
Text " with multiple tested input types." ],
test_function_3_against_solution
[%ty: int -> int -> int -> int]
"min3"
~gen:5 [] @
test_function_3_against_solution
[%ty: char -> char -> char -> char]
"min3"
~gen:5 [] @
test_function_3_against_solution
[%ty: float -> float -> float -> float]
"min3"
~gen:5 []
)

let () =
set_result @@
ast_sanity_check code_ast @@ fun () ->
[exercise_1]
2 changes: 2 additions & 0 deletions exercises/alain.camanes/01_02-norm/descr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Écrire une fonction `norm : float -> float -> float` telle que `norm x y` calcule la norme euclidienne du vecteur de coordonnées (`x`, `y`).

7 changes: 7 additions & 0 deletions exercises/alain.camanes/01_02-norm/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"learnocaml_version": "1",
"kind": "exercise",
"stars": 0,
"title": "Exercice 2: Norme d'un vecteur",
"short_description": "Où l'on implémente la norme euclidienne"
}
Empty file.
Empty file.
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_02-norm/solution.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let norm x y = sqrt (x *. x +. y *. y)
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_02-norm/template.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let norm x y = failwith "Your answer"
12 changes: 12 additions & 0 deletions exercises/alain.camanes/01_02-norm/test.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
open Test_lib
open Report

let test () =
test_function_2_against_solution
[%ty: float -> float -> float]
"norm"
~gen:10
[]

let () =
set_result (ast_sanity_check code_ast test)
4 changes: 4 additions & 0 deletions exercises/alain.camanes/01_03-increase/descr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Ecrire une fonction `increase_between_0_1 : (int -> 'a) -> bool`
telle que `increase_between_0_1 f` renvoie `true` si et seulement
si $f (0) \leq f (1)$.

7 changes: 7 additions & 0 deletions exercises/alain.camanes/01_03-increase/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"learnocaml_version": "1",
"kind": "exercise",
"stars": 0,
"title": "Exercice 3: Test de croissance",
"short_description": "Où l'on écrit une fonction qui teste la croissance d'une fonction"
}
Empty file.
Empty file.
2 changes: 2 additions & 0 deletions exercises/alain.camanes/01_03-increase/solution.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
let increase_between_0_1 f =
f 0 <= f 1
2 changes: 2 additions & 0 deletions exercises/alain.camanes/01_03-increase/template.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
let increase_between_0_1 f =
failwith "Put our answer here."
25 changes: 25 additions & 0 deletions exercises/alain.camanes/01_03-increase/test.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
open Test_lib
open Report

let inform what =
Message (what, Informative)

let test () =
inform [
Text "I first check with ";
Code "fun x -> x";
Text "and then with";
Code "fun x -> -x";
]
::
test_function_1_against_solution
[%ty: (int -> int) -> bool]
"increase_between_0_1"
~gen:0
[
(fun x -> x);
(fun x -> -x)
]

let () =
set_result (ast_sanity_check code_ast test)
4 changes: 4 additions & 0 deletions exercises/alain.camanes/01_04-divides/descr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Ecrire une fonction `divides : int -> int -> bool`
telle que `divides n k` renvoie `true` si et seulement si
`k` divise `n`.

7 changes: 7 additions & 0 deletions exercises/alain.camanes/01_04-divides/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"learnocaml_version": "1",
"kind": "exercise",
"stars": 0,
"title": "Exercice 4: Divisibilité",
"short_description": "Où l'on détermine si un nombre en divise un autre"
}
Empty file.
Empty file.
2 changes: 2 additions & 0 deletions exercises/alain.camanes/01_04-divides/solution.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
let divides n k =
n mod k = 0
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_04-divides/template.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let divides n k = failwith "Put your answer here."
17 changes: 17 additions & 0 deletions exercises/alain.camanes/01_04-divides/test.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
open Test_lib
open Report

let test () =
test_function_2_against_solution
[%ty: int -> int -> bool]
"divides"
~gen:5
[ (5, 2);
(4, 2);
(9, 3);
(9, 5);
(0, 1)
]

let () =
set_result (ast_sanity_check code_ast test)
5 changes: 5 additions & 0 deletions exercises/alain.camanes/01_05-bissextile/descr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Une année est bissextile si elle est divisible par $4$, sauf si c'est une année séculaire, sauf tous les $400$ ans.

Écrire une fonction `bissextile` qui détermine si une année est bissextile.

`bissextile : int -> bool`
7 changes: 7 additions & 0 deletions exercises/alain.camanes/01_05-bissextile/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"learnocaml_version": "1",
"kind": "exercise",
"stars": 0,
"title": "Exercice 5: Années bissextiles",
"short_description": "Où l'on détermine si une année est bissextile"
}
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_05-bissextile/prelude.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Empty file.
3 changes: 3 additions & 0 deletions exercises/alain.camanes/01_05-bissextile/solution.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
let bissextile annee =
not ((annee mod 4 <> 0)
|| (annee mod 100 = 0 & annee mod 400 <> 0))
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_05-bissextile/template.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let bissextile annee = failwith "Put your code here"
15 changes: 15 additions & 0 deletions exercises/alain.camanes/01_05-bissextile/test.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
open Test_lib
open Report

let exercise_1 =
test_function_1_against_solution
[%ty: int -> bool]
"bissextile"
~sampler:(fun () -> (Random.int 3000))
~gen:12
[1998; 2000; 2011]

let () =
set_result @@
ast_sanity_check code_ast @@ fun () ->
exercise_1
3 changes: 3 additions & 0 deletions exercises/alain.camanes/01_06-implication/descr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Écrire une fonction booléenne `imply a b` qui, étant donnés deux booléens `a` et `b` renvoie la valeur booléenne de `a` $\Rightarrow$ `b`.

`imply : bool -> bool -> bool`
7 changes: 7 additions & 0 deletions exercises/alain.camanes/01_06-implication/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"learnocaml_version": "1",
"kind": "exercise",
"stars": 0,
"title": "Exercice 6: Implication",
"short_description": "Où l'on définit un connecteur logique"
}
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_06-implication/prelude.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Empty file.
2 changes: 2 additions & 0 deletions exercises/alain.camanes/01_06-implication/solution.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
let imply a b =
(not a) or b
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_06-implication/template.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let imply a b = failwith "Put your code here"
15 changes: 15 additions & 0 deletions exercises/alain.camanes/01_06-implication/test.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
open Test_lib
open Report


let exercise_1 =
test_function_2_against_solution
[%ty: bool -> bool -> bool]
"imply"
~gen:0
[(true, true); (true, false); (false, true); (false, false)]

let () =
set_result @@
ast_sanity_check code_ast @@ fun () ->
exercise_1
3 changes: 3 additions & 0 deletions exercises/alain.camanes/01_07-somme_entiers/descr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Écrire une fonction récursive `somme_entiers` qui prend en argument un entier `n` et renvoie la somme des entiers de $0$ à `n`.

`somme_entiers : int -> int`
7 changes: 7 additions & 0 deletions exercises/alain.camanes/01_07-somme_entiers/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"learnocaml_version": "1",
"kind": "exercise",
"stars": 0,
"title": "Exercice 7: Somme d'entiers consécutifs",
"short_description": "Où l'on calcule récursivement la somme des premiers entiers naturels"
}
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_07-somme_entiers/prelude.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Empty file.
6 changes: 6 additions & 0 deletions exercises/alain.camanes/01_07-somme_entiers/solution.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
let rec somme_entiers n =
if n < 0 then - (somme_entiers (-n)) else
match n with
| 0 -> 0
| _ -> n + somme_entiers (n - 1)

1 change: 1 addition & 0 deletions exercises/alain.camanes/01_07-somme_entiers/template.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let rec somme_entiers n = failwith "Put your code here"
14 changes: 14 additions & 0 deletions exercises/alain.camanes/01_07-somme_entiers/test.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
open Test_lib
open Report

let exercise_1 =
test_function_1_against_solution
[%ty: int -> int]
"somme_entiers"
~gen:10
[]

let () =
set_result @@
ast_sanity_check code_ast @@ fun () ->
exercise_1
4 changes: 4 additions & 0 deletions exercises/alain.camanes/01_08-only_one/descr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Ecrire une fonction récursive `sum : int -> int -> int` telle que
`sum x y` calcule la somme de `x` et de `y` mais en
utilisant uniquement des additions et soustractions de `1`.

7 changes: 7 additions & 0 deletions exercises/alain.camanes/01_08-only_one/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"learnocaml_version": "1",
"kind": "exercise",
"stars": 0,
"title": "Exercice 8: Opérations élémentaires",
"short_description": "Où l'on décompose l'addition en incréments et décréments"
}
Empty file.
12 changes: 12 additions & 0 deletions exercises/alain.camanes/01_08-only_one/prepare.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
exception ForbiddenOperation of string

let check op kind = fun x y ->
if x <> 1 && y <> 1 then
let what = Printf.sprintf "%s of %d and %d" kind x y in
raise (ForbiddenOperation what)
else
op x y

let ( + ) = check ( + ) "an addition"

let ( - ) = check ( - ) "a substraction"
4 changes: 4 additions & 0 deletions exercises/alain.camanes/01_08-only_one/solution.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
let rec sum x y =
if x = 0 then y else
(if x < 0 then - (sum (-x) (-y))
else 1 + sum (x - 1) y)
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_08-only_one/template.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let rec sum x y = failwith "Your answer"
33 changes: 33 additions & 0 deletions exercises/alain.camanes/01_08-only_one/test.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
open Test_lib
open Report

let test () =
let test _ student expected =
match student, expected with
| Error (ForbiddenOperation what), _ ->
let msg =
Printf.sprintf
"You did %s while only additions and substractions to 1 are allowed."
what
in
[Message ([ Text msg ], Success 0)]
| Ok r1, Ok r2 ->
if r1 = r2 then
[Message ([Text "That's a correct addition."], Success 1)]
else
[Message ([Text "That's an incorrect addition."], Success 0)]
| _, Error exn ->
Printf.eprintf
"Unexpected exception: %s\n"
(Printexc.to_string exn);
[]
in
test_function_2_against_solution
[%ty: int -> int -> int]
"sum"
~gen:10
~test
[]

let () =
set_result (ast_sanity_check code_ast test)
5 changes: 5 additions & 0 deletions exercises/alain.camanes/01_09-puissance/descr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Écrire une fonction récursive `puissance x n` qui, étant donnés un entier `x` et un entier positif `n` renvoie $x^n$.

`puissance : int -> int -> int`

Vous ne chercherez pas à optimiser la complexité de votre fonction.
7 changes: 7 additions & 0 deletions exercises/alain.camanes/01_09-puissance/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"learnocaml_version": "1",
"kind": "exercise",
"stars": 0,
"title": "Exercice 9: Puissances entières",
"short_description": "Où l'on écrit une première fonction puissance naïve"
}
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_09-puissance/prelude.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Empty file.
4 changes: 4 additions & 0 deletions exercises/alain.camanes/01_09-puissance/solution.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
let rec puissance x n =
match n with
| 0 -> 1
| _ -> x * (puissance x (n-1))
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_09-puissance/template.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let rec puissance x n = failwith "Put your code here"
15 changes: 15 additions & 0 deletions exercises/alain.camanes/01_09-puissance/test.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
open Test_lib
open Report

let exercise_1 =
test_function_2_against_solution
[%ty: int -> int -> int]
"puissance"
~sampler:(fun () -> (Random.int 32, Random.int 12))
~gen:4
[(3,0)]

let () =
set_result @@
ast_sanity_check code_ast @@ fun () ->
exercise_1
3 changes: 3 additions & 0 deletions exercises/alain.camanes/01_10-pgcd/descr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Écrire une fonction récursive `pgcd` qui permet de calculer le plus grand commun diviseur de deux entiers.

`pgcd : int -> int -> int`
7 changes: 7 additions & 0 deletions exercises/alain.camanes/01_10-pgcd/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"learnocaml_version": "1",
"kind": "exercise",
"stars": 0,
"title": "Exercice 10: Algorithme d'Euclide",
"short_description": "Où l'on revient à un des premiers algorithmes décrits"
}
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_10-pgcd/prelude.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Empty file.
6 changes: 6 additions & 0 deletions exercises/alain.camanes/01_10-pgcd/solution.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
let rec pgcd a b =
if (a < 0 || b < 0) then pgcd (abs a) (abs b)
else
(if a > b then pgcd b a
else (if a = 0 then b
else pgcd a (b mod a)))
1 change: 1 addition & 0 deletions exercises/alain.camanes/01_10-pgcd/template.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let rec pgcd a b = failwith "Put your code here"
Loading