This shows you the differences between two versions of the page.
|
dss:laboratoare:01 [2019/06/15 14:18] razvan.nitu1305 [Exercises] |
dss:laboratoare:01 [2019/08/14 15:07] (current) razvan.nitu1305 [Unittests] |
||
|---|---|---|---|
| Line 148: | Line 148: | ||
| int x = b[1]; // equivalent to `int x = 0;` | int x = b[1]; // equivalent to `int x = 0;` | ||
| a[2] = 3; | a[2] = 3; | ||
| - | int y = b[2]; // equivalent to `int y = 3;` | + | int y = b[1]; // equivalent to `int y = 3;` |
| } | } | ||
| </code> | </code> | ||
| Line 418: | Line 418: | ||
| <code D> | <code D> | ||
| import std.algorithm : group; | import std.algorithm : group; | ||
| - | import std.range : chain, retro, front, retro; | + | import std.range : chain, dropOne, front, retro; |
| [1, 2].chain([3, 4]).retro; // 4, 3, 2, 1 | [1, 2].chain([3, 4]).retro; // 4, 3, 2, 1 | ||
| - | [1, 1, 2, 2, 2].group.dropOne.front; // (2, 3) | + | [1, 1, 2, 2, 2].group.dropOne.front; // (2, 3) |
| + | |||
| + | front(dropOne(group([1, 1, 2, 2, 2]))); | ||
| </code> | </code> | ||
| Line 521: | Line 523: | ||
| <code D> | <code D> | ||
| - | class Sum | + | struct Sum |
| { | { | ||
| int add(int x, int y) { return x + y; } | int add(int x, int y) { return x + y; } | ||
| Line 527: | Line 529: | ||
| unittest | unittest | ||
| { | { | ||
| - | Sum sum = new Sum; | + | Sum sum; |
| assert(sum.add(3,4) == 7); | assert(sum.add(3,4) == 7); | ||
| assert(sum.add(-2,0) == -2); | assert(sum.add(-2,0) == -2); | ||
| Line 604: | Line 606: | ||
| ===== Exercises ===== | ===== Exercises ===== | ||
| + | |||
| + | The exercises for ''lab-01'' are located in this [[https://github.com/RazvanN7/D-Summer-School/tree/master/lab-01|repo]]. | ||
| ==== 1. C to D ==== | ==== 1. C to D ==== | ||
| - | Go to this [[https://github.com/TheAlgorithms/C/tree/master/searching|link]]. You fill find there a series of searching algorithms, each implemented in its own file. | + | Go to this [[https://github.com/TheAlgorithms/C/tree/master/searching|link]]. You will find a series of searching algorithms, each implemented in C in its own file. |
| - Choose one algorithm and port it to D with minimum modifications. | - Choose one algorithm and port it to D with minimum modifications. | ||
| - | - Update the code using D specific features to optimize the code (fewer lines of code, increase in expressiveness). | + | - Update the code using D specific features to improve the code (fewer lines of code, increase in expressiveness etc.). |
| ==== 2. Array Median Element ==== | ==== 2. Array Median Element ==== | ||
| Line 622: | Line 626: | ||
| ==== 3. The standard library ==== | ==== 3. The standard library ==== | ||
| - | D has a standard library called [[https://dlang.org/phobos/|phobos]]. Implement exercise 2 using functions from the [[https://dlang.org/phobos/std_algorithm.html|std.algorithm]] package | + | D has a standard library called [[https://dlang.org/phobos/|phobos]]. Implement exercise 2 using functions from the [[https://dlang.org/phobos/std_algorithm.html|std.algorithm]] package. Use UFCS for an increase in expressiveness. |
| + | |||
| + | ==== 4. Majority Element ==== | ||
| + | |||
| + | Find the [[https://leetcode.com/problems/majority-element/|majority element]] in a string array using builtin associative arrays. | ||
| + | |||
| + | **[Bonus]** Implement a version with **O(n)** time complexity and **O(1)** space complexity | ||
| + | |||
| + | ==== 5. Struct vs. Class ==== | ||
| + | |||
| + | Navigate to the ''5-struct-class'' directory. You will find 2 files implementing the same program. One uses a **struct** as a data container, while the other uses a **class**. | ||
| + | |||
| + | - Compile both files and measure the run time of each program. How do you explain the differences? | ||
| + | - In both situations, print the value of the field **a0** after the loop ends. How do you explain the differences? | ||
| + | |||
| + | ==== 6. Voldemort types ==== | ||
| + | |||
| + | Navigate to the ''6-voldemort'' directory. Inspect the source file **voldermort.d**. The declaration of **struct Result** is declared as **private** (nobody has access to it, except the members of the current file). Move the declaration of the **struct Result** inside the **fun** function. Compile the code. Does it compile? Why? Fix the issue. | ||
| + | |||
| + | ==== 7. Sanitization & Unittesting ==== | ||
| + | |||
| + | Navigate to the ''7 - BinarySearch'' directory. Inspect the source file **binarySearch.d**. As the name implies, a binarySearch algorithm is implemented on integers. Compile and run the file. | ||
| + | |||
| + | - Write a unittest function that tests some corner cases. Are there any bugs in the algorithm implementation? If yes, fix them. | ||
| + | - The **binarySearch** function may be called with invalid data (for example: l = -1, r = -2). Write an **in** contract that halts the code execution in the case of invalid input (invalid values for **l** and **r**, the array is not sorted etc.) | ||
| + | - Rewrite the **binarySearch** algorithm to make use of slices. | ||