diff --git a/Exercism.sln b/Exercism.sln index 9bfea21..93c3c2f 100644 --- a/Exercism.sln +++ b/Exercism.sln @@ -95,6 +95,18 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RationalNumbers", "csharp\r EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PerfectNumbers", "csharp\perfect-numbers\PerfectNumbers.csproj", "{C424BB3E-AADC-42A0-889E-BE1C5A53C2F3}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProteinTranslation", "csharp\protein-translation\ProteinTranslation.csproj", "{FCB4EC34-86A9-4E7A-BF83-AC618505ACE9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DifferenceOfSquares", "csharp\difference-of-squares\DifferenceOfSquares.csproj", "{022A3C14-C825-4797-B4C1-80CE4BB1AD4B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Triangle", "csharp\triangle\Triangle.csproj", "{53575277-DC47-4597-92FB-C3D28344B88F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Darts", "csharp\darts\Darts.csproj", "{4A6A7678-F939-4EBD-B50E-A68943F4016B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FlattenArray", "csharp\flatten-array\FlattenArray.csproj", "{4C529743-AE36-42E5-A63F-9054ABD2E80B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Proverb", "csharp\proverb\Proverb.csproj", "{CEC032AD-5DF7-4FDD-B389-764B96323A8E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -285,6 +297,30 @@ Global {C424BB3E-AADC-42A0-889E-BE1C5A53C2F3}.Debug|Any CPU.Build.0 = Debug|Any CPU {C424BB3E-AADC-42A0-889E-BE1C5A53C2F3}.Release|Any CPU.ActiveCfg = Release|Any CPU {C424BB3E-AADC-42A0-889E-BE1C5A53C2F3}.Release|Any CPU.Build.0 = Release|Any CPU + {FCB4EC34-86A9-4E7A-BF83-AC618505ACE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FCB4EC34-86A9-4E7A-BF83-AC618505ACE9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FCB4EC34-86A9-4E7A-BF83-AC618505ACE9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FCB4EC34-86A9-4E7A-BF83-AC618505ACE9}.Release|Any CPU.Build.0 = Release|Any CPU + {022A3C14-C825-4797-B4C1-80CE4BB1AD4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {022A3C14-C825-4797-B4C1-80CE4BB1AD4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {022A3C14-C825-4797-B4C1-80CE4BB1AD4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {022A3C14-C825-4797-B4C1-80CE4BB1AD4B}.Release|Any CPU.Build.0 = Release|Any CPU + {53575277-DC47-4597-92FB-C3D28344B88F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53575277-DC47-4597-92FB-C3D28344B88F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53575277-DC47-4597-92FB-C3D28344B88F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53575277-DC47-4597-92FB-C3D28344B88F}.Release|Any CPU.Build.0 = Release|Any CPU + {4A6A7678-F939-4EBD-B50E-A68943F4016B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A6A7678-F939-4EBD-B50E-A68943F4016B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A6A7678-F939-4EBD-B50E-A68943F4016B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A6A7678-F939-4EBD-B50E-A68943F4016B}.Release|Any CPU.Build.0 = Release|Any CPU + {4C529743-AE36-42E5-A63F-9054ABD2E80B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C529743-AE36-42E5-A63F-9054ABD2E80B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C529743-AE36-42E5-A63F-9054ABD2E80B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C529743-AE36-42E5-A63F-9054ABD2E80B}.Release|Any CPU.Build.0 = Release|Any CPU + {CEC032AD-5DF7-4FDD-B389-764B96323A8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CEC032AD-5DF7-4FDD-B389-764B96323A8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CEC032AD-5DF7-4FDD-B389-764B96323A8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CEC032AD-5DF7-4FDD-B389-764B96323A8E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/csharp/darts/.editorconfig b/csharp/darts/.editorconfig new file mode 100644 index 0000000..bad2b44 --- /dev/null +++ b/csharp/darts/.editorconfig @@ -0,0 +1,141 @@ +############################### +# Core EditorConfig Options # +############################### + +; This file is for unifying the coding style for different editors and IDEs. +; More information at: +; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017 +; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017 + +root = true + +[*] +indent_style = space + +[Darts.cs] +indent_size = 4 + +############################### +# .NET Coding Conventions # +############################### + +# Organize usings +dotnet_sort_system_directives_first = true +dotnet_separate_import_directive_groups = true + +# this. preferences +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = always:suggestion +dotnet_style_readonly_field = true:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion + +############################### +# Naming Conventions # +############################### + +# Style Definitions +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# Use PascalCase for constant fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.applicable_accessibilities = * +dotnet_naming_symbols.constant_fields.required_modifiers = const + +############################### +# C# Code Style Rules # +############################### + +# var preferences +csharp_style_var_for_built_in_types = true:none +csharp_style_var_when_type_is_apparent = true:none +csharp_style_var_elsewhere = true:none + +# Expression-bodied members +csharp_style_expression_bodied_methods = true:suggestion +csharp_style_expression_bodied_constructors = true:suggestion +csharp_style_expression_bodied_operators = true:suggestion +csharp_style_expression_bodied_properties = true:suggestion +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_accessors = true:suggestion + +# Pattern-matching preferences +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion + +# Null-checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# Expression-level preferences +csharp_prefer_braces = true:none +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +############################### +# C# Formatting Rules # +############################### + +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = false +csharp_new_line_before_members_in_anonymous_types = false +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = flush_left + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true diff --git a/csharp/darts/.exercism/config.json b/csharp/darts/.exercism/config.json new file mode 100644 index 0000000..9f082c7 --- /dev/null +++ b/csharp/darts/.exercism/config.json @@ -0,0 +1,25 @@ +{ + "blurb": "Write a function that returns the earned points in a single toss of a Darts game", + "authors": [ + "bmeverett" + ], + "contributors": [ + "ErikSchierboom", + "j2jensen", + "robkeim", + "sjwarner", + "wolf99" + ], + "files": { + "solution": [ + "Darts.cs" + ], + "test": [ + "DartsTests.cs" + ], + "example": [ + ".meta/Example.cs" + ] + }, + "source": "Inspired by an exercise created by a professor Della Paolera in Argentina" +} diff --git a/csharp/darts/.exercism/metadata.json b/csharp/darts/.exercism/metadata.json new file mode 100644 index 0000000..3958b18 --- /dev/null +++ b/csharp/darts/.exercism/metadata.json @@ -0,0 +1 @@ +{"track":"csharp","exercise":"darts","id":"ed58a1226c504827a927b77954158cad","url":"https://exercism.org/tracks/csharp/exercises/darts","handle":"benharri","is_requester":true,"auto_approve":false} \ No newline at end of file diff --git a/csharp/darts/Darts.cs b/csharp/darts/Darts.cs new file mode 100644 index 0000000..c72f7be --- /dev/null +++ b/csharp/darts/Darts.cs @@ -0,0 +1,13 @@ +using System; + +public static class Darts +{ + public static int Score(double x, double y) => + Math.Sqrt(x * x + y * y) switch + { + <= 1 => 10, + <= 5 => 5, + <= 10 => 1, + _ => 0 + }; +} diff --git a/csharp/darts/Darts.csproj b/csharp/darts/Darts.csproj new file mode 100644 index 0000000..bc1b5d6 --- /dev/null +++ b/csharp/darts/Darts.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + + + + + + + + + + diff --git a/csharp/darts/DartsTests.cs b/csharp/darts/DartsTests.cs new file mode 100644 index 0000000..18e80f1 --- /dev/null +++ b/csharp/darts/DartsTests.cs @@ -0,0 +1,82 @@ +using Xunit; + +public class DartsTests +{ + [Fact] + public void Missed_target() + { + Assert.Equal(0, Darts.Score(-9, 9)); + } + + [Fact] + public void On_the_outer_circle() + { + Assert.Equal(1, Darts.Score(0, 10)); + } + + [Fact] + public void On_the_middle_circle() + { + Assert.Equal(5, Darts.Score(-5, 0)); + } + + [Fact] + public void On_the_inner_circle() + { + Assert.Equal(10, Darts.Score(0, -1)); + } + + [Fact] + public void Exactly_on_centre() + { + Assert.Equal(10, Darts.Score(0, 0)); + } + + [Fact] + public void Near_the_centre() + { + Assert.Equal(10, Darts.Score(-0.1, -0.1)); + } + + [Fact] + public void Just_within_the_inner_circle() + { + Assert.Equal(10, Darts.Score(0.7, 0.7)); + } + + [Fact] + public void Just_outside_the_inner_circle() + { + Assert.Equal(5, Darts.Score(0.8, -0.8)); + } + + [Fact] + public void Just_within_the_middle_circle() + { + Assert.Equal(5, Darts.Score(-3.5, 3.5)); + } + + [Fact] + public void Just_outside_the_middle_circle() + { + Assert.Equal(1, Darts.Score(-3.6, -3.6)); + } + + [Fact] + public void Just_within_the_outer_circle() + { + Assert.Equal(1, Darts.Score(-7, 7)); + } + + [Fact] + public void Just_outside_the_outer_circle() + { + Assert.Equal(0, Darts.Score(7.1, -7.1)); + } + + [Fact] + public void Asymmetric_position_between_the_inner_and_middle_circles() + { + Assert.Equal(5, Darts.Score(0.5, -4)); + } +} \ No newline at end of file diff --git a/csharp/darts/HELP.md b/csharp/darts/HELP.md new file mode 100644 index 0000000..5febe8b --- /dev/null +++ b/csharp/darts/HELP.md @@ -0,0 +1,39 @@ +# Help + +## Running the tests + +You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test) +Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests). +See the [tests page](https://exercism.io/tracks/csharp/tests) for more information. + +## Skipped tests + +Initially, only the first test will be enabled. +This is to encourage you to solve the exercise one step at a time. +Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing. + +## Submitting your solution + +You can submit your solution using the `exercism submit Darts.cs` command. +This command will upload your solution to the Exercism website and print the solution page's URL. + +It's possible to submit an incomplete solution which allows you to: + +- See how others have completed the exercise +- Request help from a mentor + +## Need to get help? + +If you'd like help solving the exercise, check the following pages: + +- The [C# track's documentation](https://exercism.org/docs/tracks/csharp) +- [Exercism's support channel on gitter](https://gitter.im/exercism/support) +- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs) + +Should those resources not suffice, you could submit your (incomplete) solution to request mentoring. + +To get help if you're having trouble, you can use one of the following resources: + +- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track. +- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit. +- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions. \ No newline at end of file diff --git a/csharp/darts/README.md b/csharp/darts/README.md new file mode 100644 index 0000000..20322dd --- /dev/null +++ b/csharp/darts/README.md @@ -0,0 +1,40 @@ +# Darts + +Welcome to Darts on Exercism's C# Track. +If you need help running the tests or submitting your code, check out `HELP.md`. + +## Instructions + +Write a function that returns the earned points in a single toss of a Darts game. + +[Darts](https://en.wikipedia.org/wiki/Darts) is a game where players +throw darts to a [target](https://en.wikipedia.org/wiki/Darts#/media/File:Darts_in_a_dartboard.jpg). + +In our particular instance of the game, the target rewards with 4 different amounts of points, depending on where the dart lands: + +* If the dart lands outside the target, player earns no points (0 points). +* If the dart lands in the outer circle of the target, player earns 1 point. +* If the dart lands in the middle circle of the target, player earns 5 points. +* If the dart lands in the inner circle of the target, player earns 10 points. + +The outer circle has a radius of 10 units (This is equivalent to the total radius for the entire target), the middle circle a radius of 5 units, and the inner circle a radius of 1. Of course, they are all centered to the same point (That is, the circles are [concentric](http://mathworld.wolfram.com/ConcentricCircles.html)) defined by the coordinates (0, 0). + +Write a function that given a point in the target (defined by its `real` cartesian coordinates `x` and `y`), returns the correct amount earned by a dart landing in that point. + +## Source + +### Created by + +- @bmeverett + +### Contributed to by + +- @ErikSchierboom +- @j2jensen +- @robkeim +- @sjwarner +- @wolf99 + +### Based on + +Inspired by an exercise created by a professor Della Paolera in Argentina \ No newline at end of file diff --git a/csharp/difference-of-squares/.editorconfig b/csharp/difference-of-squares/.editorconfig new file mode 100644 index 0000000..5128725 --- /dev/null +++ b/csharp/difference-of-squares/.editorconfig @@ -0,0 +1,141 @@ +############################### +# Core EditorConfig Options # +############################### + +; This file is for unifying the coding style for different editors and IDEs. +; More information at: +; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017 +; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017 + +root = true + +[*] +indent_style = space + +[DifferenceOfSquares.cs] +indent_size = 4 + +############################### +# .NET Coding Conventions # +############################### + +# Organize usings +dotnet_sort_system_directives_first = true +dotnet_separate_import_directive_groups = true + +# this. preferences +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = always:suggestion +dotnet_style_readonly_field = true:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion + +############################### +# Naming Conventions # +############################### + +# Style Definitions +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# Use PascalCase for constant fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.applicable_accessibilities = * +dotnet_naming_symbols.constant_fields.required_modifiers = const + +############################### +# C# Code Style Rules # +############################### + +# var preferences +csharp_style_var_for_built_in_types = true:none +csharp_style_var_when_type_is_apparent = true:none +csharp_style_var_elsewhere = true:none + +# Expression-bodied members +csharp_style_expression_bodied_methods = true:suggestion +csharp_style_expression_bodied_constructors = true:suggestion +csharp_style_expression_bodied_operators = true:suggestion +csharp_style_expression_bodied_properties = true:suggestion +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_accessors = true:suggestion + +# Pattern-matching preferences +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion + +# Null-checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# Expression-level preferences +csharp_prefer_braces = true:none +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +############################### +# C# Formatting Rules # +############################### + +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = false +csharp_new_line_before_members_in_anonymous_types = false +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = flush_left + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true diff --git a/csharp/difference-of-squares/.exercism/config.json b/csharp/difference-of-squares/.exercism/config.json new file mode 100644 index 0000000..fb4a2ae --- /dev/null +++ b/csharp/difference-of-squares/.exercism/config.json @@ -0,0 +1,29 @@ +{ + "blurb": "Find the difference between the square of the sum and the sum of the squares of the first N natural numbers.", + "authors": [ + "mikecoop" + ], + "contributors": [ + "balazsbotond", + "ErikSchierboom", + "felix91gr", + "j2jensen", + "jwood803", + "kytrinyx", + "robkeim", + "wolf99" + ], + "files": { + "solution": [ + "DifferenceOfSquares.cs" + ], + "test": [ + "DifferenceOfSquaresTests.cs" + ], + "example": [ + ".meta/Example.cs" + ] + }, + "source": "Problem 6 at Project Euler", + "source_url": "http://projecteuler.net/problem=6" +} diff --git a/csharp/difference-of-squares/.exercism/metadata.json b/csharp/difference-of-squares/.exercism/metadata.json new file mode 100644 index 0000000..b7e0236 --- /dev/null +++ b/csharp/difference-of-squares/.exercism/metadata.json @@ -0,0 +1 @@ +{"track":"csharp","exercise":"difference-of-squares","id":"1b64bac5568349a7ab3fe1767ccee214","url":"https://exercism.org/tracks/csharp/exercises/difference-of-squares","handle":"benharri","is_requester":true,"auto_approve":false} \ No newline at end of file diff --git a/csharp/difference-of-squares/DifferenceOfSquares.cs b/csharp/difference-of-squares/DifferenceOfSquares.cs new file mode 100644 index 0000000..eff2a37 --- /dev/null +++ b/csharp/difference-of-squares/DifferenceOfSquares.cs @@ -0,0 +1,16 @@ +using System.Linq; + +public static class DifferenceOfSquares +{ + public static int CalculateSquareOfSum(int max) + { + var sum = Enumerable.Range(1, max).Sum(); + return sum * sum; + } + + public static int CalculateSumOfSquares(int max) => + Enumerable.Range(1, max).Sum(i => i * i); + + public static int CalculateDifferenceOfSquares(int max) => + CalculateSquareOfSum(max) - CalculateSumOfSquares(max); +} \ No newline at end of file diff --git a/csharp/difference-of-squares/DifferenceOfSquares.csproj b/csharp/difference-of-squares/DifferenceOfSquares.csproj new file mode 100644 index 0000000..bf6befb --- /dev/null +++ b/csharp/difference-of-squares/DifferenceOfSquares.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + + + + + + + + + + diff --git a/csharp/difference-of-squares/DifferenceOfSquaresTests.cs b/csharp/difference-of-squares/DifferenceOfSquaresTests.cs new file mode 100644 index 0000000..b964472 --- /dev/null +++ b/csharp/difference-of-squares/DifferenceOfSquaresTests.cs @@ -0,0 +1,58 @@ +using Xunit; + +public class DifferenceOfSquaresTests +{ + [Fact] + public void Square_of_sum_1() + { + Assert.Equal(1, DifferenceOfSquares.CalculateSquareOfSum(1)); + } + + [Fact] + public void Square_of_sum_5() + { + Assert.Equal(225, DifferenceOfSquares.CalculateSquareOfSum(5)); + } + + [Fact] + public void Square_of_sum_100() + { + Assert.Equal(25502500, DifferenceOfSquares.CalculateSquareOfSum(100)); + } + + [Fact] + public void Sum_of_squares_1() + { + Assert.Equal(1, DifferenceOfSquares.CalculateSumOfSquares(1)); + } + + [Fact] + public void Sum_of_squares_5() + { + Assert.Equal(55, DifferenceOfSquares.CalculateSumOfSquares(5)); + } + + [Fact] + public void Sum_of_squares_100() + { + Assert.Equal(338350, DifferenceOfSquares.CalculateSumOfSquares(100)); + } + + [Fact] + public void Difference_of_squares_1() + { + Assert.Equal(0, DifferenceOfSquares.CalculateDifferenceOfSquares(1)); + } + + [Fact] + public void Difference_of_squares_5() + { + Assert.Equal(170, DifferenceOfSquares.CalculateDifferenceOfSquares(5)); + } + + [Fact] + public void Difference_of_squares_100() + { + Assert.Equal(25164150, DifferenceOfSquares.CalculateDifferenceOfSquares(100)); + } +} \ No newline at end of file diff --git a/csharp/difference-of-squares/HELP.md b/csharp/difference-of-squares/HELP.md new file mode 100644 index 0000000..a13651c --- /dev/null +++ b/csharp/difference-of-squares/HELP.md @@ -0,0 +1,39 @@ +# Help + +## Running the tests + +You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test) +Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests). +See the [tests page](https://exercism.io/tracks/csharp/tests) for more information. + +## Skipped tests + +Initially, only the first test will be enabled. +This is to encourage you to solve the exercise one step at a time. +Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing. + +## Submitting your solution + +You can submit your solution using the `exercism submit DifferenceOfSquares.cs` command. +This command will upload your solution to the Exercism website and print the solution page's URL. + +It's possible to submit an incomplete solution which allows you to: + +- See how others have completed the exercise +- Request help from a mentor + +## Need to get help? + +If you'd like help solving the exercise, check the following pages: + +- The [C# track's documentation](https://exercism.org/docs/tracks/csharp) +- [Exercism's support channel on gitter](https://gitter.im/exercism/support) +- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs) + +Should those resources not suffice, you could submit your (incomplete) solution to request mentoring. + +To get help if you're having trouble, you can use one of the following resources: + +- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track. +- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit. +- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions. \ No newline at end of file diff --git a/csharp/difference-of-squares/README.md b/csharp/difference-of-squares/README.md new file mode 100644 index 0000000..dab7eac --- /dev/null +++ b/csharp/difference-of-squares/README.md @@ -0,0 +1,47 @@ +# Difference Of Squares + +Welcome to Difference Of Squares on Exercism's C# Track. +If you need help running the tests or submitting your code, check out `HELP.md`. + +## Instructions + +Find the difference between the square of the sum and the sum of the squares of the first N natural numbers. + +The square of the sum of the first ten natural numbers is +(1 + 2 + ... + 10)² = 55² = 3025. + +The sum of the squares of the first ten natural numbers is +1² + 2² + ... + 10² = 385. + +Hence the difference between the square of the sum of the first +ten natural numbers and the sum of the squares of the first ten +natural numbers is 3025 - 385 = 2640. + +You are not expected to discover an efficient solution to this yourself from +first principles; research is allowed, indeed, encouraged. Finding the best +algorithm for the problem is a key skill in software engineering. + +This exercise requires you to process a collection of data. You can simplify your code by using LINQ (Language Integrated Query). +For more information, see [this page] +(https://docs.microsoft.com/en-us/dotnet/articles/standard/using-linq). + +## Source + +### Created by + +- @mikecoop + +### Contributed to by + +- @balazsbotond +- @ErikSchierboom +- @felix91gr +- @j2jensen +- @jwood803 +- @kytrinyx +- @robkeim +- @wolf99 + +### Based on + +Problem 6 at Project Euler - http://projecteuler.net/problem=6 \ No newline at end of file diff --git a/csharp/flatten-array/.editorconfig b/csharp/flatten-array/.editorconfig new file mode 100644 index 0000000..72a68a3 --- /dev/null +++ b/csharp/flatten-array/.editorconfig @@ -0,0 +1,141 @@ +############################### +# Core EditorConfig Options # +############################### + +; This file is for unifying the coding style for different editors and IDEs. +; More information at: +; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017 +; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017 + +root = true + +[*] +indent_style = space + +[FlattenArray.cs] +indent_size = 4 + +############################### +# .NET Coding Conventions # +############################### + +# Organize usings +dotnet_sort_system_directives_first = true +dotnet_separate_import_directive_groups = true + +# this. preferences +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = always:suggestion +dotnet_style_readonly_field = true:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion + +############################### +# Naming Conventions # +############################### + +# Style Definitions +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# Use PascalCase for constant fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.applicable_accessibilities = * +dotnet_naming_symbols.constant_fields.required_modifiers = const + +############################### +# C# Code Style Rules # +############################### + +# var preferences +csharp_style_var_for_built_in_types = true:none +csharp_style_var_when_type_is_apparent = true:none +csharp_style_var_elsewhere = true:none + +# Expression-bodied members +csharp_style_expression_bodied_methods = true:suggestion +csharp_style_expression_bodied_constructors = true:suggestion +csharp_style_expression_bodied_operators = true:suggestion +csharp_style_expression_bodied_properties = true:suggestion +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_accessors = true:suggestion + +# Pattern-matching preferences +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion + +# Null-checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# Expression-level preferences +csharp_prefer_braces = true:none +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +############################### +# C# Formatting Rules # +############################### + +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = false +csharp_new_line_before_members_in_anonymous_types = false +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = flush_left + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true diff --git a/csharp/flatten-array/.exercism/config.json b/csharp/flatten-array/.exercism/config.json new file mode 100644 index 0000000..ea2834c --- /dev/null +++ b/csharp/flatten-array/.exercism/config.json @@ -0,0 +1,25 @@ +{ + "blurb": "Take a nested list and return a single list with all values except nil/null", + "authors": [ + "ErikSchierboom" + ], + "contributors": [ + "felix91gr", + "j2jensen", + "robkeim", + "wolf99" + ], + "files": { + "solution": [ + "FlattenArray.cs" + ], + "test": [ + "FlattenArrayTests.cs" + ], + "example": [ + ".meta/Example.cs" + ] + }, + "source": "Interview Question", + "source_url": "https://reference.wolfram.com/language/ref/Flatten.html" +} diff --git a/csharp/flatten-array/.exercism/metadata.json b/csharp/flatten-array/.exercism/metadata.json new file mode 100644 index 0000000..678822d --- /dev/null +++ b/csharp/flatten-array/.exercism/metadata.json @@ -0,0 +1 @@ +{"track":"csharp","exercise":"flatten-array","id":"f9c4a3fffbab4276bc9e1638983045a9","url":"https://exercism.org/tracks/csharp/exercises/flatten-array","handle":"benharri","is_requester":true,"auto_approve":false} \ No newline at end of file diff --git a/csharp/flatten-array/FlattenArray.cs b/csharp/flatten-array/FlattenArray.cs new file mode 100644 index 0000000..be2e83a --- /dev/null +++ b/csharp/flatten-array/FlattenArray.cs @@ -0,0 +1,17 @@ +using System.Collections; + +public static class FlattenArray +{ + public static IEnumerable Flatten(IEnumerable input) + { + foreach (var element in input) + { + if (element is null) continue; + if (element is IEnumerable) + foreach (var nestedElement in Flatten(element as IEnumerable)) + yield return nestedElement; + else + yield return element; + } + } +} \ No newline at end of file diff --git a/csharp/flatten-array/FlattenArray.csproj b/csharp/flatten-array/FlattenArray.csproj new file mode 100644 index 0000000..bf6befb --- /dev/null +++ b/csharp/flatten-array/FlattenArray.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + + + + + + + + + + diff --git a/csharp/flatten-array/FlattenArrayTests.cs b/csharp/flatten-array/FlattenArrayTests.cs new file mode 100644 index 0000000..ee5b9a8 --- /dev/null +++ b/csharp/flatten-array/FlattenArrayTests.cs @@ -0,0 +1,86 @@ +using Xunit; + +public class FlattenArrayTests +{ + [Fact] + public void No_nesting() + { + var array = new object[] + { + 0, + 1, + 2 + }; + var expected = new[] { 0, 1, 2 }; + Assert.Equal(expected, FlattenArray.Flatten(array)); + } + + [Fact] + public void Flattens_array_with_just_integers_present() + { + var array = new object[] + { + 1, + new object[] { 2, 3, 4, 5, 6, 7 }, + 8 + }; + var expected = new[] { 1, 2, 3, 4, 5, 6, 7, 8 }; + Assert.Equal(expected, FlattenArray.Flatten(array)); + } + + [Fact] + public void Number_5_level_nesting() + { + var array = new object[] + { + 0, + 2, + new object[] { new object[] { 2, 3 }, 8, 100, 4, new object[] { new object[] { new object[] { 50 } } } }, + -2 + }; + var expected = new[] { 0, 2, 2, 3, 8, 100, 4, 50, -2 }; + Assert.Equal(expected, FlattenArray.Flatten(array)); + } + + [Fact] + public void Number_6_level_nesting() + { + var array = new object[] + { + 1, + new object[] { 2, new object[] { new object[] { 3 } }, new object[] { 4, new object[] { new object[] { 5 } } }, 6, 7 }, + 8 + }; + var expected = new[] { 1, 2, 3, 4, 5, 6, 7, 8 }; + Assert.Equal(expected, FlattenArray.Flatten(array)); + } + + [Fact] + public void Number_6_level_nest_list_with_null_values() + { + var array = new object[] + { + 0, + 2, + new object[] { new object[] { 2, 3 }, 8, new object[] { new object[] { 100 } }, null, new object[] { new object[] { null } } }, + -2 + }; + var expected = new[] { 0, 2, 2, 3, 8, 100, -2 }; + Assert.Equal(expected, FlattenArray.Flatten(array)); + } + + [Fact] + public void All_values_in_nested_list_are_null() + { + var array = new object[] + { + null, + new object[] { new object[] { new object[] { null } } }, + null, + null, + new object[] { new object[] { null, null }, null }, + null + }; + Assert.Empty(FlattenArray.Flatten(array)); + } +} \ No newline at end of file diff --git a/csharp/flatten-array/HELP.md b/csharp/flatten-array/HELP.md new file mode 100644 index 0000000..41143d6 --- /dev/null +++ b/csharp/flatten-array/HELP.md @@ -0,0 +1,39 @@ +# Help + +## Running the tests + +You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test) +Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests). +See the [tests page](https://exercism.io/tracks/csharp/tests) for more information. + +## Skipped tests + +Initially, only the first test will be enabled. +This is to encourage you to solve the exercise one step at a time. +Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing. + +## Submitting your solution + +You can submit your solution using the `exercism submit FlattenArray.cs` command. +This command will upload your solution to the Exercism website and print the solution page's URL. + +It's possible to submit an incomplete solution which allows you to: + +- See how others have completed the exercise +- Request help from a mentor + +## Need to get help? + +If you'd like help solving the exercise, check the following pages: + +- The [C# track's documentation](https://exercism.org/docs/tracks/csharp) +- [Exercism's support channel on gitter](https://gitter.im/exercism/support) +- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs) + +Should those resources not suffice, you could submit your (incomplete) solution to request mentoring. + +To get help if you're having trouble, you can use one of the following resources: + +- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track. +- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit. +- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions. \ No newline at end of file diff --git a/csharp/flatten-array/README.md b/csharp/flatten-array/README.md new file mode 100644 index 0000000..4b7412f --- /dev/null +++ b/csharp/flatten-array/README.md @@ -0,0 +1,33 @@ +# Flatten Array + +Welcome to Flatten Array on Exercism's C# Track. +If you need help running the tests or submitting your code, check out `HELP.md`. + +## Instructions + +Take a nested list and return a single flattened list with all values except nil/null. + +The challenge is to write a function that accepts an arbitrarily-deep nested list-like structure and returns a flattened structure without any nil/null values. + +For Example + +input: [1,[2,3,null,4],[null],5] + +output: [1,2,3,4,5] + +## Source + +### Created by + +- @ErikSchierboom + +### Contributed to by + +- @felix91gr +- @j2jensen +- @robkeim +- @wolf99 + +### Based on + +Interview Question - https://reference.wolfram.com/language/ref/Flatten.html \ No newline at end of file diff --git a/csharp/protein-translation/.editorconfig b/csharp/protein-translation/.editorconfig new file mode 100644 index 0000000..8e51769 --- /dev/null +++ b/csharp/protein-translation/.editorconfig @@ -0,0 +1,141 @@ +############################### +# Core EditorConfig Options # +############################### + +; This file is for unifying the coding style for different editors and IDEs. +; More information at: +; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017 +; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017 + +root = true + +[*] +indent_style = space + +[ProteinTranslation.cs] +indent_size = 4 + +############################### +# .NET Coding Conventions # +############################### + +# Organize usings +dotnet_sort_system_directives_first = true +dotnet_separate_import_directive_groups = true + +# this. preferences +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = always:suggestion +dotnet_style_readonly_field = true:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion + +############################### +# Naming Conventions # +############################### + +# Style Definitions +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# Use PascalCase for constant fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.applicable_accessibilities = * +dotnet_naming_symbols.constant_fields.required_modifiers = const + +############################### +# C# Code Style Rules # +############################### + +# var preferences +csharp_style_var_for_built_in_types = true:none +csharp_style_var_when_type_is_apparent = true:none +csharp_style_var_elsewhere = true:none + +# Expression-bodied members +csharp_style_expression_bodied_methods = true:suggestion +csharp_style_expression_bodied_constructors = true:suggestion +csharp_style_expression_bodied_operators = true:suggestion +csharp_style_expression_bodied_properties = true:suggestion +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_accessors = true:suggestion + +# Pattern-matching preferences +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion + +# Null-checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# Expression-level preferences +csharp_prefer_braces = true:none +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +############################### +# C# Formatting Rules # +############################### + +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = false +csharp_new_line_before_members_in_anonymous_types = false +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = flush_left + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true diff --git a/csharp/protein-translation/.exercism/config.json b/csharp/protein-translation/.exercism/config.json new file mode 100644 index 0000000..6a79546 --- /dev/null +++ b/csharp/protein-translation/.exercism/config.json @@ -0,0 +1,23 @@ +{ + "blurb": "Translate RNA sequences into proteins.", + "authors": [ + "robkeim" + ], + "contributors": [ + "ErikSchierboom", + "j2jensen", + "wolf99" + ], + "files": { + "solution": [ + "ProteinTranslation.cs" + ], + "test": [ + "ProteinTranslationTests.cs" + ], + "example": [ + ".meta/Example.cs" + ] + }, + "source": "Tyler Long" +} diff --git a/csharp/protein-translation/.exercism/metadata.json b/csharp/protein-translation/.exercism/metadata.json new file mode 100644 index 0000000..a2b0636 --- /dev/null +++ b/csharp/protein-translation/.exercism/metadata.json @@ -0,0 +1 @@ +{"track":"csharp","exercise":"protein-translation","id":"998e522961fd47f9880d643ee8216abc","url":"https://exercism.org/tracks/csharp/exercises/protein-translation","handle":"benharri","is_requester":true,"auto_approve":false} \ No newline at end of file diff --git a/csharp/protein-translation/HELP.md b/csharp/protein-translation/HELP.md new file mode 100644 index 0000000..a3d7262 --- /dev/null +++ b/csharp/protein-translation/HELP.md @@ -0,0 +1,39 @@ +# Help + +## Running the tests + +You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test) +Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests). +See the [tests page](https://exercism.io/tracks/csharp/tests) for more information. + +## Skipped tests + +Initially, only the first test will be enabled. +This is to encourage you to solve the exercise one step at a time. +Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing. + +## Submitting your solution + +You can submit your solution using the `exercism submit ProteinTranslation.cs` command. +This command will upload your solution to the Exercism website and print the solution page's URL. + +It's possible to submit an incomplete solution which allows you to: + +- See how others have completed the exercise +- Request help from a mentor + +## Need to get help? + +If you'd like help solving the exercise, check the following pages: + +- The [C# track's documentation](https://exercism.org/docs/tracks/csharp) +- [Exercism's support channel on gitter](https://gitter.im/exercism/support) +- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs) + +Should those resources not suffice, you could submit your (incomplete) solution to request mentoring. + +To get help if you're having trouble, you can use one of the following resources: + +- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track. +- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit. +- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions. \ No newline at end of file diff --git a/csharp/protein-translation/ProteinTranslation.cs b/csharp/protein-translation/ProteinTranslation.cs new file mode 100644 index 0000000..911b6f5 --- /dev/null +++ b/csharp/protein-translation/ProteinTranslation.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +public static class ProteinTranslation +{ + public static string[] Proteins(string strand) => + strand.Chunk(3).Select(p => p switch + { + "AUG" => "Methionine", + "UUU" or "UUC" => "Phenylalanine", + "UUA" or "UUG" => "Leucine", + "UCU" or "UCC" or "UCA" or "UCG" => "Serine", + "UAU" or "UAC" => "Tyrosine", + "UGU" or "UGC" => "Cysteine", + "UGG" => "Tryptophan", + "UAA" or "UAG" or "UGA" => "", + _ => throw new ArgumentOutOfRangeException(nameof(strand)) + }).TakeWhile(p => p != "").ToArray(); + + public static IEnumerable Chunk(this string s, int chunkSize) => + Enumerable.Range(0, s.Length / chunkSize) + .Select(i => s.Substring(i * chunkSize, chunkSize)); +} diff --git a/csharp/protein-translation/ProteinTranslation.csproj b/csharp/protein-translation/ProteinTranslation.csproj new file mode 100644 index 0000000..832ffac --- /dev/null +++ b/csharp/protein-translation/ProteinTranslation.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + + + + + + + + + + diff --git a/csharp/protein-translation/ProteinTranslationTests.cs b/csharp/protein-translation/ProteinTranslationTests.cs new file mode 100644 index 0000000..bf6e248 --- /dev/null +++ b/csharp/protein-translation/ProteinTranslationTests.cs @@ -0,0 +1,142 @@ +using Xunit; + +public class ProteinTranslationTests +{ + [Fact] + public void Methionine_rna_sequence() + { + Assert.Equal(new[] { "Methionine" }, ProteinTranslation.Proteins("AUG")); + } + + [Fact] + public void Phenylalanine_rna_sequence_1() + { + Assert.Equal(new[] { "Phenylalanine" }, ProteinTranslation.Proteins("UUU")); + } + + [Fact] + public void Phenylalanine_rna_sequence_2() + { + Assert.Equal(new[] { "Phenylalanine" }, ProteinTranslation.Proteins("UUC")); + } + + [Fact] + public void Leucine_rna_sequence_1() + { + Assert.Equal(new[] { "Leucine" }, ProteinTranslation.Proteins("UUA")); + } + + [Fact] + public void Leucine_rna_sequence_2() + { + Assert.Equal(new[] { "Leucine" }, ProteinTranslation.Proteins("UUG")); + } + + [Fact] + public void Serine_rna_sequence_1() + { + Assert.Equal(new[] { "Serine" }, ProteinTranslation.Proteins("UCU")); + } + + [Fact] + public void Serine_rna_sequence_2() + { + Assert.Equal(new[] { "Serine" }, ProteinTranslation.Proteins("UCC")); + } + + [Fact] + public void Serine_rna_sequence_3() + { + Assert.Equal(new[] { "Serine" }, ProteinTranslation.Proteins("UCA")); + } + + [Fact] + public void Serine_rna_sequence_4() + { + Assert.Equal(new[] { "Serine" }, ProteinTranslation.Proteins("UCG")); + } + + [Fact] + public void Tyrosine_rna_sequence_1() + { + Assert.Equal(new[] { "Tyrosine" }, ProteinTranslation.Proteins("UAU")); + } + + [Fact] + public void Tyrosine_rna_sequence_2() + { + Assert.Equal(new[] { "Tyrosine" }, ProteinTranslation.Proteins("UAC")); + } + + [Fact] + public void Cysteine_rna_sequence_1() + { + Assert.Equal(new[] { "Cysteine" }, ProteinTranslation.Proteins("UGU")); + } + + [Fact] + public void Cysteine_rna_sequence_2() + { + Assert.Equal(new[] { "Cysteine" }, ProteinTranslation.Proteins("UGC")); + } + + [Fact] + public void Tryptophan_rna_sequence() + { + Assert.Equal(new[] { "Tryptophan" }, ProteinTranslation.Proteins("UGG")); + } + + [Fact] + public void Stop_codon_rna_sequence_1() + { + Assert.Empty(ProteinTranslation.Proteins("UAA")); + } + + [Fact] + public void Stop_codon_rna_sequence_2() + { + Assert.Empty(ProteinTranslation.Proteins("UAG")); + } + + [Fact] + public void Stop_codon_rna_sequence_3() + { + Assert.Empty(ProteinTranslation.Proteins("UGA")); + } + + [Fact] + public void Translate_rna_strand_into_correct_protein_list() + { + Assert.Equal(new[] { "Methionine", "Phenylalanine", "Tryptophan" }, ProteinTranslation.Proteins("AUGUUUUGG")); + } + + [Fact] + public void Translation_stops_if_stop_codon_at_beginning_of_sequence() + { + Assert.Empty(ProteinTranslation.Proteins("UAGUGG")); + } + + [Fact] + public void Translation_stops_if_stop_codon_at_end_of_two_codon_sequence() + { + Assert.Equal(new[] { "Tryptophan" }, ProteinTranslation.Proteins("UGGUAG")); + } + + [Fact] + public void Translation_stops_if_stop_codon_at_end_of_three_codon_sequence() + { + Assert.Equal(new[] { "Methionine", "Phenylalanine" }, ProteinTranslation.Proteins("AUGUUUUAA")); + } + + [Fact] + public void Translation_stops_if_stop_codon_in_middle_of_three_codon_sequence() + { + Assert.Equal(new[] { "Tryptophan" }, ProteinTranslation.Proteins("UGGUAGUGG")); + } + + [Fact] + public void Translation_stops_if_stop_codon_in_middle_of_six_codon_sequence() + { + Assert.Equal(new[] { "Tryptophan", "Cysteine", "Tyrosine" }, ProteinTranslation.Proteins("UGGUGUUAUUAAUGGUUU")); + } +} \ No newline at end of file diff --git a/csharp/protein-translation/README.md b/csharp/protein-translation/README.md new file mode 100644 index 0000000..0fd82ec --- /dev/null +++ b/csharp/protein-translation/README.md @@ -0,0 +1,63 @@ +# Protein Translation + +Welcome to Protein Translation on Exercism's C# Track. +If you need help running the tests or submitting your code, check out `HELP.md`. + +## Instructions + +Translate RNA sequences into proteins. + +RNA can be broken into three nucleotide sequences called codons, and then translated to a polypeptide like so: + +RNA: `"AUGUUUUCU"` => translates to + +Codons: `"AUG", "UUU", "UCU"` +=> which become a polypeptide with the following sequence => + +Protein: `"Methionine", "Phenylalanine", "Serine"` + +There are 64 codons which in turn correspond to 20 amino acids; however, all of the codon sequences and resulting amino acids are not important in this exercise. If it works for one codon, the program should work for all of them. +However, feel free to expand the list in the test suite to include them all. + +There are also three terminating codons (also known as 'STOP' codons); if any of these codons are encountered (by the ribosome), all translation ends and the protein is terminated. + +All subsequent codons after are ignored, like this: + +RNA: `"AUGUUUUCUUAAAUG"` => + +Codons: `"AUG", "UUU", "UCU", "UAA", "AUG"` => + +Protein: `"Methionine", "Phenylalanine", "Serine"` + +Note the stop codon `"UAA"` terminates the translation and the final methionine is not translated into the protein sequence. + +Below are the codons and resulting Amino Acids needed for the exercise. + +Codon | Protein +:--- | :--- +AUG | Methionine +UUU, UUC | Phenylalanine +UUA, UUG | Leucine +UCU, UCC, UCA, UCG | Serine +UAU, UAC | Tyrosine +UGU, UGC | Cysteine +UGG | Tryptophan +UAA, UAG, UGA | STOP + +Learn more about [protein translation on Wikipedia](http://en.wikipedia.org/wiki/Translation_(biology)) + +## Source + +### Created by + +- @robkeim + +### Contributed to by + +- @ErikSchierboom +- @j2jensen +- @wolf99 + +### Based on + +Tyler Long \ No newline at end of file diff --git a/csharp/proverb/.editorconfig b/csharp/proverb/.editorconfig new file mode 100644 index 0000000..38f993d --- /dev/null +++ b/csharp/proverb/.editorconfig @@ -0,0 +1,141 @@ +############################### +# Core EditorConfig Options # +############################### + +; This file is for unifying the coding style for different editors and IDEs. +; More information at: +; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017 +; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017 + +root = true + +[*] +indent_style = space + +[Proverb.cs] +indent_size = 4 + +############################### +# .NET Coding Conventions # +############################### + +# Organize usings +dotnet_sort_system_directives_first = true +dotnet_separate_import_directive_groups = true + +# this. preferences +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = always:suggestion +dotnet_style_readonly_field = true:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion + +############################### +# Naming Conventions # +############################### + +# Style Definitions +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# Use PascalCase for constant fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.applicable_accessibilities = * +dotnet_naming_symbols.constant_fields.required_modifiers = const + +############################### +# C# Code Style Rules # +############################### + +# var preferences +csharp_style_var_for_built_in_types = true:none +csharp_style_var_when_type_is_apparent = true:none +csharp_style_var_elsewhere = true:none + +# Expression-bodied members +csharp_style_expression_bodied_methods = true:suggestion +csharp_style_expression_bodied_constructors = true:suggestion +csharp_style_expression_bodied_operators = true:suggestion +csharp_style_expression_bodied_properties = true:suggestion +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_accessors = true:suggestion + +# Pattern-matching preferences +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion + +# Null-checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# Expression-level preferences +csharp_prefer_braces = true:none +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +############################### +# C# Formatting Rules # +############################### + +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = false +csharp_new_line_before_members_in_anonymous_types = false +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = flush_left + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true diff --git a/csharp/proverb/.exercism/config.json b/csharp/proverb/.exercism/config.json new file mode 100644 index 0000000..e26ef93 --- /dev/null +++ b/csharp/proverb/.exercism/config.json @@ -0,0 +1,26 @@ +{ + "blurb": "For want of a horseshoe nail, a kingdom was lost, or so the saying goes. Output the full text of this proverbial rhyme.", + "authors": [ + "ErikSchierboom" + ], + "contributors": [ + "j2jensen", + "jmbradnan", + "robkeim", + "ShamilS", + "wolf99" + ], + "files": { + "solution": [ + "Proverb.cs" + ], + "test": [ + "ProverbTests.cs" + ], + "example": [ + ".meta/Example.cs" + ] + }, + "source": "Wikipedia", + "source_url": "http://en.wikipedia.org/wiki/For_Want_of_a_Nail" +} diff --git a/csharp/proverb/.exercism/metadata.json b/csharp/proverb/.exercism/metadata.json new file mode 100644 index 0000000..1b42e26 --- /dev/null +++ b/csharp/proverb/.exercism/metadata.json @@ -0,0 +1 @@ +{"track":"csharp","exercise":"proverb","id":"2fb26d386d05442aaea34958e319d67c","url":"https://exercism.org/tracks/csharp/exercises/proverb","handle":"benharri","is_requester":true,"auto_approve":false} \ No newline at end of file diff --git a/csharp/proverb/HELP.md b/csharp/proverb/HELP.md new file mode 100644 index 0000000..78973dc --- /dev/null +++ b/csharp/proverb/HELP.md @@ -0,0 +1,39 @@ +# Help + +## Running the tests + +You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test) +Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests). +See the [tests page](https://exercism.io/tracks/csharp/tests) for more information. + +## Skipped tests + +Initially, only the first test will be enabled. +This is to encourage you to solve the exercise one step at a time. +Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing. + +## Submitting your solution + +You can submit your solution using the `exercism submit Proverb.cs` command. +This command will upload your solution to the Exercism website and print the solution page's URL. + +It's possible to submit an incomplete solution which allows you to: + +- See how others have completed the exercise +- Request help from a mentor + +## Need to get help? + +If you'd like help solving the exercise, check the following pages: + +- The [C# track's documentation](https://exercism.org/docs/tracks/csharp) +- [Exercism's support channel on gitter](https://gitter.im/exercism/support) +- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs) + +Should those resources not suffice, you could submit your (incomplete) solution to request mentoring. + +To get help if you're having trouble, you can use one of the following resources: + +- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track. +- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit. +- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions. \ No newline at end of file diff --git a/csharp/proverb/Proverb.cs b/csharp/proverb/Proverb.cs new file mode 100644 index 0000000..4622ff1 --- /dev/null +++ b/csharp/proverb/Proverb.cs @@ -0,0 +1,14 @@ +using System; + +public static class Proverb +{ + public static string[] Recite(string[] subjects) + { + if (subjects.Length == 0) return Array.Empty(); + var result = new string[subjects.Length]; + for (int i = 0; i < subjects.Length - 1; i++) + result[i] = $"For want of a {subjects[i]} the {subjects[i + 1]} was lost."; + result[subjects.Length - 1] = $"And all for the want of a {subjects[0]}."; + return result; + } +} \ No newline at end of file diff --git a/csharp/proverb/Proverb.csproj b/csharp/proverb/Proverb.csproj new file mode 100644 index 0000000..832ffac --- /dev/null +++ b/csharp/proverb/Proverb.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + + + + + + + + + + diff --git a/csharp/proverb/ProverbTests.cs b/csharp/proverb/ProverbTests.cs new file mode 100644 index 0000000..f34ec6d --- /dev/null +++ b/csharp/proverb/ProverbTests.cs @@ -0,0 +1,107 @@ +using System; +using Xunit; + +public class ProverbTests +{ + [Fact] + public void Zero_pieces() + { + var strings = Array.Empty(); + var expected = Array.Empty(); + Assert.Equal(expected, Proverb.Recite(strings)); + } + + [Fact] + public void One_piece() + { + var strings = new[] + { + "nail" + }; + var expected = new[] + { + "And all for the want of a nail." + }; + Assert.Equal(expected, Proverb.Recite(strings)); + } + + [Fact] + public void Two_pieces() + { + var strings = new[] + { + "nail", + "shoe" + }; + var expected = new[] + { + "For want of a nail the shoe was lost.", + "And all for the want of a nail." + }; + Assert.Equal(expected, Proverb.Recite(strings)); + } + + [Fact] + public void Three_pieces() + { + var strings = new[] + { + "nail", + "shoe", + "horse" + }; + var expected = new[] + { + "For want of a nail the shoe was lost.", + "For want of a shoe the horse was lost.", + "And all for the want of a nail." + }; + Assert.Equal(expected, Proverb.Recite(strings)); + } + + [Fact] + public void Full_proverb() + { + var strings = new[] + { + "nail", + "shoe", + "horse", + "rider", + "message", + "battle", + "kingdom" + }; + var expected = new[] + { + "For want of a nail the shoe was lost.", + "For want of a shoe the horse was lost.", + "For want of a horse the rider was lost.", + "For want of a rider the message was lost.", + "For want of a message the battle was lost.", + "For want of a battle the kingdom was lost.", + "And all for the want of a nail." + }; + Assert.Equal(expected, Proverb.Recite(strings)); + } + + [Fact] + public void Four_pieces_modernized() + { + var strings = new[] + { + "pin", + "gun", + "soldier", + "battle" + }; + var expected = new[] + { + "For want of a pin the gun was lost.", + "For want of a gun the soldier was lost.", + "For want of a soldier the battle was lost.", + "And all for the want of a pin." + }; + Assert.Equal(expected, Proverb.Recite(strings)); + } +} \ No newline at end of file diff --git a/csharp/proverb/README.md b/csharp/proverb/README.md new file mode 100644 index 0000000..9b781e5 --- /dev/null +++ b/csharp/proverb/README.md @@ -0,0 +1,42 @@ +# Proverb + +Welcome to Proverb on Exercism's C# Track. +If you need help running the tests or submitting your code, check out `HELP.md`. + +## Instructions + +For want of a horseshoe nail, a kingdom was lost, or so the saying goes. + +Given a list of inputs, generate the relevant proverb. For example, given the list `["nail", "shoe", "horse", "rider", "message", "battle", "kingdom"]`, you will output the full text of this proverbial rhyme: + +```text +For want of a nail the shoe was lost. +For want of a shoe the horse was lost. +For want of a horse the rider was lost. +For want of a rider the message was lost. +For want of a message the battle was lost. +For want of a battle the kingdom was lost. +And all for the want of a nail. +``` + +Note that the list of inputs may vary; your solution should be able to handle lists of arbitrary length and content. No line of the output text should be a static, unchanging string; all should vary according to the input given. + +Try to capture the structure of the song in your code, where you build up the song by composing its parts. + +## Source + +### Created by + +- @ErikSchierboom + +### Contributed to by + +- @j2jensen +- @jmbradnan +- @robkeim +- @ShamilS +- @wolf99 + +### Based on + +Wikipedia - http://en.wikipedia.org/wiki/For_Want_of_a_Nail \ No newline at end of file diff --git a/csharp/triangle/.editorconfig b/csharp/triangle/.editorconfig new file mode 100644 index 0000000..6d98253 --- /dev/null +++ b/csharp/triangle/.editorconfig @@ -0,0 +1,141 @@ +############################### +# Core EditorConfig Options # +############################### + +; This file is for unifying the coding style for different editors and IDEs. +; More information at: +; https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017 +; https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2017 + +root = true + +[*] +indent_style = space + +[Triangle.cs] +indent_size = 4 + +############################### +# .NET Coding Conventions # +############################### + +# Organize usings +dotnet_sort_system_directives_first = true +dotnet_separate_import_directive_groups = true + +# this. preferences +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = always:suggestion +dotnet_style_readonly_field = true:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion + +############################### +# Naming Conventions # +############################### + +# Style Definitions +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# Use PascalCase for constant fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.applicable_accessibilities = * +dotnet_naming_symbols.constant_fields.required_modifiers = const + +############################### +# C# Code Style Rules # +############################### + +# var preferences +csharp_style_var_for_built_in_types = true:none +csharp_style_var_when_type_is_apparent = true:none +csharp_style_var_elsewhere = true:none + +# Expression-bodied members +csharp_style_expression_bodied_methods = true:suggestion +csharp_style_expression_bodied_constructors = true:suggestion +csharp_style_expression_bodied_operators = true:suggestion +csharp_style_expression_bodied_properties = true:suggestion +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_accessors = true:suggestion + +# Pattern-matching preferences +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion + +# Null-checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# Expression-level preferences +csharp_prefer_braces = true:none +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +############################### +# C# Formatting Rules # +############################### + +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = false +csharp_new_line_before_members_in_anonymous_types = false +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = flush_left + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true diff --git a/csharp/triangle/.exercism/config.json b/csharp/triangle/.exercism/config.json new file mode 100644 index 0000000..adddd12 --- /dev/null +++ b/csharp/triangle/.exercism/config.json @@ -0,0 +1,28 @@ +{ + "blurb": "Determine if a triangle is equilateral, isosceles, or scalene.", + "authors": [ + "bressain" + ], + "contributors": [ + "bmeverett", + "ErikSchierboom", + "j2jensen", + "jwood803", + "robkeim", + "tushartyagi", + "wolf99" + ], + "files": { + "solution": [ + "Triangle.cs" + ], + "test": [ + "TriangleTests.cs" + ], + "example": [ + ".meta/Example.cs" + ] + }, + "source": "The Ruby Koans triangle project, parts 1 & 2", + "source_url": "http://rubykoans.com" +} diff --git a/csharp/triangle/.exercism/metadata.json b/csharp/triangle/.exercism/metadata.json new file mode 100644 index 0000000..6c87d13 --- /dev/null +++ b/csharp/triangle/.exercism/metadata.json @@ -0,0 +1 @@ +{"track":"csharp","exercise":"triangle","id":"03abff63966644beb3cfbb5c2417ccd6","url":"https://exercism.org/tracks/csharp/exercises/triangle","handle":"benharri","is_requester":true,"auto_approve":false} \ No newline at end of file diff --git a/csharp/triangle/HELP.md b/csharp/triangle/HELP.md new file mode 100644 index 0000000..30c41fd --- /dev/null +++ b/csharp/triangle/HELP.md @@ -0,0 +1,39 @@ +# Help + +## Running the tests + +You can run the tests by opening a command prompt in the exercise's directory, and then running the [`dotnet test` command](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test) +Alternatively, most IDE's have built-in support for running tests, including [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer), [Rider](https://www.jetbrains.com/help/rider/Unit_Testing_in_Solution.html) and [Visual Studio code](https://github.com/OmniSharp/omnisharp-vscode/wiki/How-to-run-and-debug-unit-tests). +See the [tests page](https://exercism.io/tracks/csharp/tests) for more information. + +## Skipped tests + +Initially, only the first test will be enabled. +This is to encourage you to solve the exercise one step at a time. +Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing. + +## Submitting your solution + +You can submit your solution using the `exercism submit Triangle.cs` command. +This command will upload your solution to the Exercism website and print the solution page's URL. + +It's possible to submit an incomplete solution which allows you to: + +- See how others have completed the exercise +- Request help from a mentor + +## Need to get help? + +If you'd like help solving the exercise, check the following pages: + +- The [C# track's documentation](https://exercism.org/docs/tracks/csharp) +- [Exercism's support channel on gitter](https://gitter.im/exercism/support) +- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs) + +Should those resources not suffice, you could submit your (incomplete) solution to request mentoring. + +To get help if you're having trouble, you can use one of the following resources: + +- [Gitter](https://gitter.im/exercism/xcsharp) is Exercism C# track's Gitter room; go here to get support and ask questions related to the C# track. +- [/r/csharp](https://www.reddit.com/r/csharp) is the C# subreddit. +- [StackOverflow](http://stackoverflow.com/questions/tagged/c%23) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions. \ No newline at end of file diff --git a/csharp/triangle/README.md b/csharp/triangle/README.md new file mode 100644 index 0000000..317c887 --- /dev/null +++ b/csharp/triangle/README.md @@ -0,0 +1,48 @@ +# Triangle + +Welcome to Triangle on Exercism's C# Track. +If you need help running the tests or submitting your code, check out `HELP.md`. + +## Instructions + +Determine if a triangle is equilateral, isosceles, or scalene. + +An _equilateral_ triangle has all three sides the same length. + +An _isosceles_ triangle has at least two sides the same length. (It is sometimes +specified as having exactly two sides the same length, but for the purposes of +this exercise we'll say at least two.) + +A _scalene_ triangle has all sides of different lengths. + +## Note + +For a shape to be a triangle at all, all sides have to be of length > 0, and +the sum of the lengths of any two sides must be greater than or equal to the +length of the third side. See [Triangle Inequality](https://en.wikipedia.org/wiki/Triangle_inequality). + +## Dig Deeper + +The case where the sum of the lengths of two sides _equals_ that of the +third is known as a _degenerate_ triangle - it has zero area and looks like +a single line. Feel free to add your own code/tests to check for degenerate triangles. + +## Source + +### Created by + +- @bressain + +### Contributed to by + +- @bmeverett +- @ErikSchierboom +- @j2jensen +- @jwood803 +- @robkeim +- @tushartyagi +- @wolf99 + +### Based on + +The Ruby Koans triangle project, parts 1 & 2 - http://rubykoans.com \ No newline at end of file diff --git a/csharp/triangle/Triangle.cs b/csharp/triangle/Triangle.cs new file mode 100644 index 0000000..0d0d0f5 --- /dev/null +++ b/csharp/triangle/Triangle.cs @@ -0,0 +1,18 @@ +public static class Triangle +{ + public static bool IsScalene(double side1, double side2, double side3) => + side1 != side2 && side2 != side3 && side1 != side3 + && !IsDegenerate(side1, side2, side3); + + public static bool IsIsosceles(double side1, double side2, double side3) => + (side1 == side2 || side2 == side3 || side1 == side3) + && !IsDegenerate(side1, side2, side3); + + public static bool IsEquilateral(double side1, double side2, double side3) => + side1 == side2 && side2 == side3 + && !IsDegenerate(side1, side2, side3); + + private static bool IsDegenerate(double side1, double side2, double side3) => + side1 == 0 || side2 == 0 || side3 == 0 + || (side1 >= side2 + side3) || (side2 >= side1 + side3) || (side3 >= side1 + side2); +} diff --git a/csharp/triangle/Triangle.csproj b/csharp/triangle/Triangle.csproj new file mode 100644 index 0000000..832ffac --- /dev/null +++ b/csharp/triangle/Triangle.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + + + + + + + + + + diff --git a/csharp/triangle/TriangleTests.cs b/csharp/triangle/TriangleTests.cs new file mode 100644 index 0000000..333bce8 --- /dev/null +++ b/csharp/triangle/TriangleTests.cs @@ -0,0 +1,118 @@ +using Xunit; + +public class TriangleTests +{ + [Fact] + public void Equilateral_triangle_all_sides_are_equal() + { + Assert.True(Triangle.IsEquilateral(2, 2, 2)); + } + + [Fact] + public void Equilateral_triangle_any_side_is_unequal() + { + Assert.False(Triangle.IsEquilateral(2, 3, 2)); + } + + [Fact] + public void Equilateral_triangle_no_sides_are_equal() + { + Assert.False(Triangle.IsEquilateral(5, 4, 6)); + } + + [Fact] + public void Equilateral_triangle_all_zero_sides_is_not_a_triangle() + { + Assert.False(Triangle.IsEquilateral(0, 0, 0)); + } + + [Fact] + public void Equilateral_triangle_sides_may_be_floats() + { + Assert.True(Triangle.IsEquilateral(0.5, 0.5, 0.5)); + } + + [Fact] + public void Isosceles_triangle_last_two_sides_are_equal() + { + Assert.True(Triangle.IsIsosceles(3, 4, 4)); + } + + [Fact] + public void Isosceles_triangle_first_two_sides_are_equal() + { + Assert.True(Triangle.IsIsosceles(4, 4, 3)); + } + + [Fact] + public void Isosceles_triangle_first_and_last_sides_are_equal() + { + Assert.True(Triangle.IsIsosceles(4, 3, 4)); + } + + [Fact] + public void Isosceles_triangle_equilateral_triangles_are_also_isosceles() + { + Assert.True(Triangle.IsIsosceles(4, 4, 4)); + } + + [Fact] + public void Isosceles_triangle_no_sides_are_equal() + { + Assert.False(Triangle.IsIsosceles(2, 3, 4)); + } + + [Fact] + public void Isosceles_triangle_first_triangle_inequality_violation() + { + Assert.False(Triangle.IsIsosceles(1, 1, 3)); + } + + [Fact] + public void Isosceles_triangle_second_triangle_inequality_violation() + { + Assert.False(Triangle.IsIsosceles(1, 3, 1)); + } + + [Fact] + public void Isosceles_triangle_third_triangle_inequality_violation() + { + Assert.False(Triangle.IsIsosceles(3, 1, 1)); + } + + [Fact] + public void Isosceles_triangle_sides_may_be_floats() + { + Assert.True(Triangle.IsIsosceles(0.5, 0.4, 0.5)); + } + + [Fact] + public void Scalene_triangle_no_sides_are_equal() + { + Assert.True(Triangle.IsScalene(5, 4, 6)); + } + + [Fact] + public void Scalene_triangle_all_sides_are_equal() + { + Assert.False(Triangle.IsScalene(4, 4, 4)); + } + + [Fact] + public void Scalene_triangle_two_sides_are_equal() + { + Assert.False(Triangle.IsScalene(4, 4, 3)); + } + + [Fact] + public void Scalene_triangle_may_not_violate_triangle_inequality() + { + Assert.False(Triangle.IsScalene(7, 3, 2)); + } + + [Fact] + public void Scalene_triangle_sides_may_be_floats() + { + Assert.True(Triangle.IsScalene(0.5, 0.4, 0.6)); + } +} \ No newline at end of file