Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
C#
Let's start our journey by visiting C#. It is not the most-used language as of today, but provides modern features, and is used widely in enterprise application development projects.
Checking the sample code
Let's see our sample puzzle solution in C#. It is a traditional, imperative programming style approach:
Looking at the syntax
What does the above code snippet reveal about C#?
using System;
C# provides an extensive standard library, that is split to several namespaces. Here we will use only the very basics, but we still need to reference them.class Solution
C# is object-oriented. Like in Java, we need to have a class to hold our code, even if we don't really use OOP.static void Main(string[] args)
Every executable program needs a Main method, which will be called, when the program is started.{
C# has curly braces to construct a code block, similarly to C and many other languages. Whitespaces are usually have no meaning.//...
Here we commented out the reading from input stream, and replaced it with a simple assignment.string m = "CG";
- C# has a static and strong type system.
m
is declared as a string and it cannot change its type in this program. - Also note, that semicolon
;
ends each statement.
- C# has a static and strong type system.
string[] c = new string[2] {"00", "0"};
We have a wide range of available data structures.c
is declared as an array (vector) holding 2 strings, and it is initialized with some string literals. Actually, there is also a shorter syntax for this line, but we are not codegolfing here... (Note: Codegolfing in C# is futile anyhow, as the language tends to be more verbose than others.)var b = "";
Didn't we forget here declaring the type? No, because of type inference, the compiler can deduce from the assignment, that b must be a string.foreach (char ch in m)
- we can simply iterate through the characters of a string.
foreach
is available for all iterable data structures. - Also note, that the curly braces
{
and}
can be omitted, because we use only a single statement within the loop.
- we can simply iterate through the characters of a string.
b += Convert.ToString((int)ch, 2).PadLeft(7, '0');
Several things are happening in this line, so let's go one by one:- We can concatenate strings with the
+
operator.+
is overloaded, meaning different things if operands are strings or integers. - There is a shortcut for the combination of an operator and an assignment (here:
+=
). - We can explicitly cast between compatible types:
(int)ch
simply gets the ascii code of the character. Convert
is a class in the standard library (remember theusing System;
line above?). ItsToString
method can be referenced by dot.
. In true OOP, even a simple string is an object.ToString()
returns a string, so we can immediately invoke thePadLeft()
method of the string class on the result.- While string literals use double quotes
"
, character literals are marked with single quotes'
.
- We can concatenate strings with the
string ans = c[b[0] - (int)'0'] + " 0";
the only new thing in this line is referencing an array's elements using square brackets[ ]
. Arrays are 0 indexed.for (int i = 1; i < b.Length; i++)
The typical C-style loop syntax. As a string is an object, we get its length by accessing itsLength
property, and not by a function call, as for examplestrlen()
would do it in C.if (b[i] == b[i - 1])
- The conditional statement is quite straight-forward, using a comparison operator
==
in the boolean expression. - The ternary operator
? :
could have been also used here, but I wanted to show the traditionalif
.
- The conditional statement is quite straight-forward, using a comparison operator
Console.WriteLine(ans);
Writing to the console. We will need this a lot on CodinGame! :smiley:
Other characteristics
While not directly visible from the above code snippet, there are some other important aspects of C# worth noting:
- C# is compiled to an intermediate representation, which will be run by a special virtual machine (Common Language Runtime). Such managed code provides lot of advantages, like preventing many types of coding bugs.
- Just-In-Time compilation improves performance. C# code still runs slightly slower than a native compiled code (such as C++ or Rust), but the disadvantage is not huge, and it is still much faster than an interpreted language (such as Python or PHP).
- C# is now cross-platform. Although developed by Microsoft, it is available not only for Windows. Also, it became an ECMA standard.
- C# uses garbage collection, so you don't have to bother too much about memory management.
- There are many advanced language features we could not address in this intro, such us generics, attributes, delegates, LINQ, etc.
Checking a different approach
C# is a multi-paradigm language. While its design is heavily OOP focused, you can use it in procedural or in functional style. As an illustration, let's revisit the Chuck Norris
puzzle in a quite different way!
(Contributed by Djoums):
- We can see the fluent interface in action here: Method calls can be chained to build a more complex query.
- A
Regex
(regular expression) is a very concise and efficient way for string manipulation. Its disadvantage is that the resulting code is hard to read/understand without checking the regex pattern. new string(...)
Constructors are overloaded. Here, we create a string by repeating a character by a specified amount.=>
A lambda expression is used to create an anonymous function that can be passed directly to a method as an argument.
For further study
Coming next...
After C#, let's check briefly another, quite similar language: Java!