Giter VIP home page Giter VIP logo

c-sharp's Introduction

The Algorithms Official Website


This is a static Next.js site providing a searchable library of all the algorithms in The Algorithms. All the data about the algorithms gets scraped directly from the git repositories.

Translating the website

You can help us translate the TheAlgorithms website using Weblate here. There you can complete the translations for our current languages, or suggest something if you are unsure. Also feel free to add a new language. The current languages are:

Translation status by language

Getting Started

If you haven't installed it yet, install Node.js and yarn. Then, install all the dependencies:

yarn

After that, run the script that fetches all the algorithms from GitHub:

yarn fetch-algorithms

Finally, run the development server:

yarn dev

Open http://localhost:3000 with your browser to see the website.

Alternatively, you can also use the Ready-to-Code Gitpod and easily check how your deployment looks. It will automatically run the commands mentioned above on run.

Contributing

If you want to add a new feature or fix a bug, create a new branch or fork and commit there. Before opening a PR, be sure to

  • Run yarn lint and fix potential errors
  • Run yarn build to check if everything still builds successfully

Open the pull request against main. Vercel will automatically create a preview deployment, and the pull request will be squash merged after being reviewed by a member.

License

The source code of website itself (this repository) is licensed under MIT, while all the licenses for the code and explanations on the website can be found in the respective repositories.

Learn More

To learn more about Next.js, take a look at the following resources:

You can check out the Next.js GitHub repository - your feedback and contributions are welcome!

Powered by Vercel

c-sharp's People

Contributors

1fisedi avatar adelhaide22 avatar alexdvorak avatar algobytewise avatar christianbender avatar chuuddo avatar craftycoder07 avatar dideldev avatar doctorshacking avatar flamespirit919 avatar gmottajr avatar harshildarji avatar kalkwst avatar kolosovpetro avatar leefrost avatar maltejur avatar matthiasheinz avatar maxsit avatar najtmarr avatar oleksiihe avatar rhysma avatar richardvasquez avatar siriak avatar slorello89 avatar sureshrepos avatar tim-koehler avatar tosti007 avatar valdas3 avatar vincentdawn avatar walt280 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

c-sharp's Issues

Add search algorithms

Lets start with jump search algorithm and add more search problems to this repository.

There is an issue in DirectedWeightedGraph.RemoveVertex

The current implementation sets the value of the Vertices array to null at the index of the vertex to be removed, and decrements the Count member. This adds a null entry to the array and keeps the index of all other vertices the same. Since Count is decremented, the last element in the array will be overwritten when adding a new vertex.

I made a simple update to the test case to show that the index of the last vertex before the Remove operation will have the same index as a newly added vertex after the Remove operation (Assert.AreNotEqual). The test case fails. This will clearly have consequences since the index is used for all other operations.

[Test]
        public void GraphRemoveVertexTest_Success()
        {
            var graph = new DirectedWeightedGraph<char>(10);
            var vertexA = graph.AddVertex('A');
            var vertexB = graph.AddVertex('B');
            var vertexC = graph.AddVertex('C');
            graph.AddEdge(vertexB, vertexA, 5);
            graph.AddEdge(vertexC, vertexA, 5);
            var neighborsB = graph.GetNeighbors(vertexB).ToList();
            var neighborsC = graph.GetNeighbors(vertexC).ToList();

            graph.RemoveVertex(vertexA);

            var vertexD = graph.AddVertex('D');
            Assert.AreNotEqual(vertexC.Index, vertexD.Index);
            
            neighborsB.Should().HaveCount(1);
            neighborsB[0].Should().Be(vertexA);
            neighborsC.Should().HaveCount(1);
            neighborsC[0].Should().Be(vertexA);
            graph.GetNeighbors(vertexB).Should().HaveCount(0);
            graph.GetNeighbors(vertexC).Should().HaveCount(0);

        }

The implementation of InsertionSorter is wrong

The implementation of InsertionSorter is wrong. It's a copy of selection sort

Wikipedia example (InsersionSort)

i ← 1
while i < length(A)
j ← i
while j > 0 and A[j-1] > A[j]
swap A[j] and A[j-1]
j ← j - 1
end while
i ← i + 1
end while

currently InsertionSorter is equal to SelectionSorter

Factorial.cs

The Algorithms.Numeric.Factorial.Calculate function takes an int as input and returns a long; the function will overflow with an input greater than 20. Calculate should take a BigInteger as input and return one as output.

Additionally, the function checks input for less than zero. I would recommend putting input error checking outside of the Calculate function, in the ap[plications code (not the library), so that iterative functions that call it don't take the performance hit. In this case I would merely state it in the comment.

I have made the change in my test environment and it appears the change only breaks the Maclaurin.cs file; the fix for this appears to be to perform explicit type conversion on the return result.

I can submit the corrections if desired.

Addition of QueueBasedStack

I have gone through repo and noticed there is StackBasedQueue but not QueueBasedStack.It is possible to implement stack using queue but Pop operation time complexity is O(n).But for completeness if it is okay I can add QueueBasedStack with a pull request.

public class QueueBasedStack<T>
    {
        private readonly Queue<T> queue;

        public QueueBasedStack() => queue = new Queue<T>();

        /// <summary>
        ///     Clears the stack
        /// </summary>
        public void Clear() => queue.Clear();

        public bool IsEmpty() => queue.Count == 0;

        /// <summary>
        ///     Adds an item on top of the stack
        /// </summary>
        /// <param name="item">Item to be added on top of stack</param>
        public void Push(T item) => queue.Enqueue(item);

        /// <summary>
        ///     Removes an item from  top of the stack and returns it 
        /// </summary>
        /// <returns>item on top of stack</returns>
        /// <exception cref="InvalidOperationException">Throw if stack is empty</exception>
        public T Pop()
        {
            if(IsEmpty())
            {
                throw new InvalidOperationException("The stack contains no items.");
            }
            for (int i = 0; i < queue.Count - 1; i++)
            {
                queue.Enqueue(queue.Dequeue());
            }
            return queue.Dequeue();
        }

        /// <summary>
        ///     return an item from the top of the stack without removing it
        /// </summary>
        /// <returns>item on top of the stack</returns>
        /// <exception cref="InvalidOperationException">Throw if stack is empty</exception>
        public T Peek()
        {
            if(IsEmpty())
            {
                throw new InvalidOperationException("The stack contains no items.");
            }
            for (int i = 0; i < queue.Count - 1; i++)
            {
                queue.Enqueue(queue.Dequeue());
            }
            var item = queue.Peek();
            queue.Enqueue(queue.Dequeue());
            return item;

        }

        /// <summary>
        ///     returns the count of items on the stack
        /// </summary>
        /// <returns>number of items on the stack</returns>
        public int Length() => queue.Count;

    }

Add more data structures

Feel free to propose and/or implement new data structures, I will add them to the list below :)
List of data structures that would be great to see in this repo:
Basic:

  • Sorted List

Heaps:

  • Fibonacci heap
  • Pairing heap

Trees:

  • Scapegoat tree
  • Finger tree
  • Van Emde-Boas tree
  • Suffix trie
  • B-tree
  • B+ tree
  • Interval tree
  • Red-Black tree
  • AVL-tree
  • Splay-tree
  • Merkle tree
  • R-tree
  • KD-tree
  • Hash array mapped trie
  • Ball tree

Probabilistic:

  • Quotient filter

Other:

  • Rope
  • Skip list
  • Zipper
  • Disjoint set
  • Work Stealing Queue
  • Inverted index
  • Gap buffer
  • Nested sets
  • Half-Edge data structure
  • Unrolled linked list

Update packages

As a part of migration to .NET 8 in #425, we need to update to the latest major versions of the libraries we use:

  • coverlet.collector to 6.*
  • FluentAssertions to 6.*
  • Microsoft.NET.Test.Sdk to 17.*
  • NUnit to 4.*

Feel free to grab and update one of them!

Add something cool

I propose to add [algorithm/data structure] [name]. It helps to solve problems such as [...]. It's best described in book(s), on website(s): [...].

FactorialSequence.cs

FactorialSequence.cs uses var n = 0; as an initializer, which turns n into an int; it should be a BigInteger.

BigInteger includes a constant of 1, so there is no need to create a new one.

The code can also be simplified and optimized.

Refresh algorithms

I propose to update all algorithms to match coding standards. As a reference, please take a look at already refreshed algorithms. I will update this checklist as necessary. Feel free to make PRs and reference this issue there.

Encoders

  • Caesar
  • Hill
  • Vigenere

Data Compression

  • Huffman Encoding
  • Shannon-Fano Encoding

Numeric

  • Binary GCD
  • Euclidean GCD
  • Other
  • Fermat Prime Checker
  • Prime Finder
  • Sieve of Eratosthenes
  • Vowel Checker
  • Searches
  • A-Star
  • Binary
  • Linear

Sorts

  • Binary Insertion
  • Bogo
  • Bubble
  • Bucket
  • Cocktail
  • Cycle
  • Heap
  • Insertion
  • Merge
  • Pancake
  • Quick
  • Radix
  • Selection
  • Shell

String

  • Longest Consecutive Character
  • Palindrome Checker

Traversals

  • Tree Traversal

Dijkstra algorithm not implemented correctly.

Describe the bug
The Dijkstra algorithm is not well implemented because when it selects the the next node to visit, it does by choosing the cheapest adjacent node (to the current node) instead of the non visited node with the cheapest path from the starting node. This means that it will not visit some nodes (because it acts kind of like a greedy algorithm) and it will produce incorrect shortest paths.

To Reproduce

Taking DijkstraTest1_Success and modifying by adding 2 nodes:

var w = graph.AddVertex('W');
var z = graph.AddVertex('Z');

And adding 2 edges:

graph.AddEdge(a, w, 50);
graph.AddEdge(w, a, 50);

graph.AddEdge(w, z, 1);
graph.AddEdge(z, w, 1);

We get that the path from a to z is not found:

shortestPathList[5].Vertex.Should().Be(w);
shortestPathList[5].Distance.Should().Be(50);
shortestPathList[5].PreviousVertex.Should().Be(a);
shortestPathList[5].ToString().Should()
.Be($"Vertex: {w} - Distance: {50} - Previous: {a}");

shortestPathList[6].Vertex.Should().Be(z);
shortestPathList[6].Distance.Should().Be(51);
shortestPathList[6].PreviousVertex.Should().Be(w);
shortestPathList[6].ToString().Should()
.Be($"Vertex: {z} - Distance: {51} - Previous: {w}");

Expected shortestPathList[6].Distance to be 51.0, but found 1.7976931348623157E+308.

You can also make it find wrong paths if you cheat the greedy nature of the implementation.

Expected behavior

It should find a path from a to z.

Actual behavior
It doesnt.

Add more OEIS sequences

Feel free to propose and/or implement new sequences, I will add them to the list below :)
List of some interesting OEIS sequences that would be great to see in this repo (but you can implement any one from OEIS, not only from this list):

  • A000004 Zero
  • A000005 Number of Divisors of n
  • A000008 Number of ways of making change for n cents using coins of 1, 2, 5, 10 cents
  • A000010 Euler totient function of n

I created a "BitList" that can be add to the structures

It has more features than the BitArray structure, such as the add/remove one or more bits to an existing BitList, and is convertible to all native types and it has many more ctor.
I can send it to you to modify it as you want.

C# implementation of binary search does not run.

Describe the bug
Binary seach algorithm in C# does not run.

To Reproduce
Run provided C# code.

Error:

---- RESET ----
Could not execute because the specified command or file was not found.
Possible reasons for this include:
  * You misspelled a built-in dotnet command.
  * You intended to execute a .NET program, but dotnet-bin/Debug/net5.0/533c8da4-37af-497a-ad63-1458bee97c5d.dll does not exist.
  * You intended to run a global tool, but a dotnet-prefixed executable with this name could not be found on the PATH.
Exited with code 1

https://the-algorithms.com/algorithm/binary-search?lang=c-sharp

Recommend adding a CountOfDivisors function to Algorithms.Numeric

Recommend adding a BigInteger CountOfDivisors(BigInteger n) function to Algorithms.Numeric.

Also recommend modifying DivisorsCountSequence.cs to use that function. Current algorithm of DivisorsCountSequence.cs is O(n) for each n, when it should be O(sqrt(n)).

Suggestion of a dynamics hierarchical layout to invite more .NET community engagement

The GO uses dynamic hierarchical layout. Perhaps C-Sharp can gradually migrate that into this layout.
Why: the community can quickly has a top overview, which algorithms have been selected and the text associated with it for community refinement and further contribution


Algorithms

Data Compression
Data Compression Module

is a set of steps for packing data into a smaller space, while allowing for the original data to be seen again. Compression is a two-way process: a compression algorithm can be used to make a data package smaller, but it can also be run the other way, to decompress the package into its original form. Data compression is useful in computing to save disk space, or to reduce the bandwidth used when sending data (e.g., over the internet). : https://simple.wikipedia.org/wiki/Data_compression


Data Compression Algorithms:
Burrows-Wheeler transform
Burrows–Wheeler transform (BWT)

rearranges a character string into runs of similar characters. This is useful for compression, since it tends to be easy to compress a string that has runs of repeated characters.
For more info


Huffman Compressor
Shannon-Fano Compressor

Repository file structure and code style is not conventional

This repo contains a bunch of good algorithms and data structures. Unfortunately, in my opinion, they are not organized well (I mean naming conventions and folder structure). Naming and structure don't conform to the best practices that are used in C# projects. I would like to volunteer and get this work done in my free time if owners don't mind. I hope that will give this repo a fresh look.

Implement a common BlockCipherPadding Interface

We currently have four algorithms that implement block cipher padding. These implementations essentially share the same functions: AddPadding, RemovePadding and GetPaddingCount.

I am also planning to add three more padding algorithms that are essentially block cipher paddings.

Having a common interface would help maintain uniformity among all these algorithms.

Looking forward to your thoughts on this.

expanding CONTRIBUTING.md

I just got started with contributing to this repo and it took me a while to figure out the basics of NUnit, codecov etc. I think it might be a good idea to give a short explanation in CONTRIBUTING.md to give new contributers in the future a head-start.

I thought something along the following lines: Please implement tests, put the test in a separate file in the algorithms-test folder, name the test-class correspondingly, we use NUnit for tests (link), a basic test can be implemented so&so, the test can be locally run so&so, we use codecov which checks that each conditional branch gets tested, please try to implement tests for the different branches of each public method.

It might also be good to add something about coding style, for example suggest a code formatter that can be locally used, but I myself don't know about that part.

If this sounds like a good idea then I would get started on a draft.

Astar overrides cost of tiles next to the starting point

Describe the bug
When setting the initial values of tiles next to the starting point they're not assigned an open state which often leads to them being overriden other nearby tiles.

This is the code that initiates the costs at the starting point

// Add connecting nodes if traversable
                if (node.Traversable)
                {
                    // Calculate the Costs
                    node.CurrentCost = from.CurrentCost + from.DistanceTo(node) * node.TraversalCostMultiplier;
                    node.EstimatedCost = from.CurrentCost + node.DistanceTo(to);
                    // Enqueue
                    open.Enqueue(node);
                }

And this is the code that iteratively sets the costs

  // Adds a previously not "seen" node into the Queue
                if (connected.State == NodeState.Unconsidered)
                {
                    connected.Parent = current;
                    connected.CurrentCost =
                        current.CurrentCost + current.DistanceTo(connected) * connected.TraversalCostMultiplier;
                    connected.EstimatedCost = connected.CurrentCost + connected.DistanceTo(to);
                    connected.State = NodeState.Open;
                    queue.Enqueue(connected);
                }
                else if (current != connected)
                {
                    // Updating the cost of the node if the current way is cheaper than the previous
                    var newCCost = current.CurrentCost + current.DistanceTo(connected);
                    var newTCost = newCCost + current.EstimatedCost;
                    if (newTCost < connected.TotalCost)
                    {
                        connected.Parent = current;
                        connected.CurrentCost = newCCost;
                    }
                }

The solution is a one line fix, altough it also might make more sense to move both of those code snipets into a sningle function

node.State = NodeState.Open;
i was considering doing a pull request however i do not have the time to write tests for this to fit in wth the guidelnes(since astar does not have any to begin with)

To Reproduce
There's no tests so it's rather difficult as i've only discovered it myself when using the code as part of a bigger project

Expected behavior
The iterative code that sets the costs does NOT override costs of tiles if the cost is higher - which it does as seen in the snipped above UNLESS the tile is unconsidered at which point it assumes the cost is 0 and overrides the cost without checking. The issue here is that all initial tiles start out as unconsidered rather than as open.

Actual behavior
In scenarios where one of the corner nodes is evaluated first
image

Improve Stack array based algorithms

I propose to refactor Stack ArrayBasedStack. I was reading some C# algorithms and not understand the reason for use a iteration in line 48 of ArrayBasedStack.cs . I believe this syntax is more readable:

public ArrayBasedStack(T[] items)
{
    stack = items;
    top = items.Length - 1;
}

If this refactoring makes sense, I can make this change :)

BitArray could be using way less memory

I was very surprised to see that BitArray uses bool[] as an underlying type. If you didn't know, the bool type in C# actually allocates an entire byte of memory because that is the minimum addressable size used by the CLR. You waste 7 bits for every bool. See https://stackoverflow.com/questions/2308034/primitive-boolean-size-in-c-sharp/2308052

I see @LorenzoLotti was the original contributor so I'm tagging them.

A maximum performance gain would be to use byte[], int[], or long[] as the underlying data type and then use bitwise operations to get the bit value you actually want.

This improvement seems minor compared to the effort to implement, but could maximize memory usage for very large data sets.

Fix BlowfishEncoder or BlowfishEncoderTests

BlowfishEncoder tests fail from time to time for no apparent reason. See test log below for more details:

Failed BlowfishEncoder_Decryption_ShouldWorkCorrectly [105 ms]
  Error Message:
   Expected result to be 
"123456abcd1325[36](https://github.com/TheAlgorithms/C-Sharp/actions/runs/7259358644/job/19776334635#step:6:37)", but 
"1c0dfbe8468a4240" differs near "c0d" (index 1).
  Stack Trace:
     at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message)
   at FluentAssertions.Execution.TestFrameworkProvider.Throw(String message)
   at FluentAssertions.Execution.DefaultAssertionStrategy.HandleFailure(String message)
   at FluentAssertions.Execution.AssertionScope.FailWith(Func`1 failReasonFunc)
   at FluentAssertions.Primitives.StringEqualityValidator.ValidateAgainstMismatch()
   at FluentAssertions.Primitives.StringAssertions.Be(String expected, String because, Object[] becauseArgs)
   at Algorithms.Tests.Encoders.BlowfishEncoderTests.BlowfishEncoder_Decryption_ShouldWorkCorrectly() in /home/runner/work/C-Sharp/C-Sharp/Algorithms.Tests/Encoders/BlowfishEncoderTests.cs:line 42


Failed!  - Failed:     1, Passed:  81[39](https://github.com/TheAlgorithms/C-Sharp/actions/runs/7259358644/job/19776334635#step:6:40), Skipped:     0, Total:  81[40](https://github.com/TheAlgorithms/C-Sharp/actions/runs/7259358644/job/19776334635#step:6:41), Duration: 1 m 11 s - Algorithms.Tests.dll (net6.0)

BinomialCoefficient.cs

Algorithms.Numeric.BinomialCoefficient.Calculate is significantly limited by the inputs being int and the return value being long.; all should be BigInteger.

It can easily be optimized by not doing the extra calculations of factorial divided by factorial.

Error handling should be outside of this function for performance reasons, particularly sequences. Error exception references n when the inputs are num and k.

My test environment doesn't show this change breaking anything.

Contribution Request: Organizing And Adding Dynamic Programming Problems

I've noticed that there are some dynamic programming problems scattered throughout this repository. I believe it would greatly benefit the community if we could gather all these problems under a dedicated 'Dynamic Programming' folder for easier accessibility, especially given how frequently dynamic programming questions come up in interviews.

Here are a couple of reasons why this would be a valuable addition:

Interview Preparation: Dynamic programming is a key topic in technical interviews, and having these problems grouped together would be a valuable resource for users preparing for interviews.
Improved Visibility: Currently, dynamic programming problems are a bit hard to spot within the repository. Grouping all of them under one folder will make them much more visible.

I can start organizing them under Problems -> Dynamic Programming folder.

Initial suggestions for Dynamic Programming problems as follows:
NEW PROBLEMS

  1. Find factorial of a given number (Also available in sequences)
  2. Find nth number in a Fibonacci series (Also available in sequences)

REORGANIZING PROBLEMS TO ABOVE MENTIONED FOLDER

  1. Problems -> Dynamic Coin Change
  2. Strings -> Levenshtein Distance

Please let me know if you're open to this suggestion and if you have any specific preferences.

Migrate to .NET 8

I propose to migrate to .NET 8 to use the latest features of .NET ecosystem.
I think we can do it in a few PRs to make them smaller and easier to review. One would just update .NET version and CI scripts and following would update NuGet packages and codebase.
Feel free to comment if you want to do it.

  • SDK and build scripts
  • File-scoped namespaces
  • Implicit usings
  • Nullable (if it's not enabled)
  • Update dependencies

Addition of the A* graph search algorithm

I propose adding the A* algorithm, a widely used graph traversal and path search method in computer science. A* is valued for its completeness, optimality, and efficiency, but it has a practical limitation in its memory usage (O(b^d)). Despite this, it often outperforms other algorithms, except in cases where graph pre-processing or memory-bounded approaches are applicable. This algorithm was introduced by Peter Hart, Nils Nilsson, and Bertram Raphael at Stanford Research Institute in 1968. It's an extension of Dijkstra's algorithm, using heuristics to guide its search. Unlike Dijkstra's, A* focuses on finding the shortest path from a specific source to a defined goal, rather than generating the entire shortest-path tree. This distinction is a necessary trade-off for employing a specific-goal-directed heuristic. I would love to implement this algorithm and provide detailed documentation, since I just studied this algorithm in my Algorithms and Data Structures course at university.
It's best described in book(s), on website(s):

Replace System.Drawing.Common

We need to replace System.Drawing.Common with something else because it's Windows-only since version 6.

I propose to use SkiaSharp instead. It's one of the alternatives to System.Drawing.Common Microsoft recommends here. Compared to other alternatives, it looks more popular and better maintained.

I'm not familiar with the interface SkiaSharp provides, but I assume it's different from what System.Drawing.Common has. Nevertheless, we use only the most basic drawing features in the repository, so it should be not too difficult to migrate.

This update is a part of #425.

Add more algorithms

Feel free to propose and/or implement new algorithms, I will add them to the list below :)
List of algorithms that would be great to see in this repo:

  • Jump search
  • Z-block substring search
  • Homogeneous linear equations elimination algorithm
  • MinHash
  • FAME algorithm
  • Chlamtac-Jain P-squared algorithm
  • Welford's algorithm
  • Kahn Topological Sort (Graph Algorithms)
  • Coin Change Dynamic (Problems)
  • Priority Queue, Based on Heapsort with maintained Heap property via Floyd's Algorithm (Data Structures)

Replace NUnit with xUnit testing framework

From my perspective, NUnit has a lack of features to write unit tests with complex data on input. xUnit has attributes like MemberData, ClassData e.t.c. to make this task easier. Also, this framework provides a wider range of assertions and a more flexible way to create data generators for testing.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.