# artemkorsakov's solution

## to Matrix in the C# Track

Published at Apr 21 2019 · 0 comments
Instructions
Test suite
Solution

#### Note:

This exercise has changed since this solution was written.

Given a string representing a matrix of numbers, return the rows and columns of that matrix.

So given a string with embedded newlines like:

``````9 8 7
5 3 2
6 6 7
``````

representing this matrix:

``````    1  2  3
|---------
1 | 9  8  7
2 | 5  3  2
3 | 6  6  7
``````

your code should be able to spit out:

• A list of the rows, reading each row left-to-right while moving top-to-bottom across the rows,
• A list of the columns, reading each column top-to-bottom while moving from left-to-right.

The rows for our example matrix:

• 9, 8, 7
• 5, 3, 2
• 6, 6, 7

And its columns:

• 9, 5, 6
• 8, 3, 6
• 7, 2, 7

## Running the tests

To run the tests, run the command `dotnet test` from within the exercise directory.

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. Once none of the tests are skipped and they are all passing, you can submit your solution using `exercism submit Matrix.cs`

## Further information

For more detailed information about the C# track, including how to get help if you're having trouble, please visit the exercism.io C# language page.

## Source

Warmup to the `saddle-points` warmup. http://jumpstartlab.com

### MatrixTest.cs

``````// This file was auto-generated based on version 1.1.0 of the canonical data.

using Xunit;

public class MatrixTest
{
[Fact]
public void Extract_row_from_one_number_matrix()
{
var sut = new Matrix("1");
Assert.Equal(new[] { 1 }, sut.Row(1));
}

[Fact(Skip = "Remove to run test")]
public void Can_extract_row()
{
var sut = new Matrix("1 2\n3 4");
Assert.Equal(new[] { 3, 4 }, sut.Row(2));
}

[Fact(Skip = "Remove to run test")]
public void Extract_row_where_numbers_have_different_widths()
{
var sut = new Matrix("1 2\n10 20");
Assert.Equal(new[] { 10, 20 }, sut.Row(2));
}

[Fact(Skip = "Remove to run test")]
public void Can_extract_row_from_non_square_matrix()
{
var sut = new Matrix("1 2 3\n4 5 6\n7 8 9\n8 7 6");
Assert.Equal(new[] { 7, 8, 9 }, sut.Row(3));
}

[Fact(Skip = "Remove to run test")]
public void Extract_column_from_one_number_matrix()
{
var sut = new Matrix("1");
Assert.Equal(new[] { 1 }, sut.Column(1));
}

[Fact(Skip = "Remove to run test")]
public void Can_extract_column()
{
var sut = new Matrix("1 2 3\n4 5 6\n7 8 9");
Assert.Equal(new[] { 3, 6, 9 }, sut.Column(3));
}

[Fact(Skip = "Remove to run test")]
public void Can_extract_column_from_non_square_matrix()
{
var sut = new Matrix("1 2 3\n4 5 6\n7 8 9\n8 7 6");
Assert.Equal(new[] { 3, 6, 9, 6 }, sut.Column(3));
}

[Fact(Skip = "Remove to run test")]
public void Extract_column_where_numbers_have_different_widths()
{
var sut = new Matrix("89 1903 3\n18 3 1\n9 4 800");
Assert.Equal(new[] { 1903, 3, 4 }, sut.Column(2));
}
}``````
``````﻿using System;
using System.Linq;

public class Matrix
{
private int[][] rows;
private int[][] columns;

public Matrix(string input)
{
var tmpRows = input.Split("\n");
rows = new int[tmpRows.Length][];
for (int i = 0; i < tmpRows.Length; i++)
{
rows[i] = tmpRows[i].Split(" ").Select(n => int.Parse(n)).ToArray();
if (i > 0 && rows[i].Length != rows[i - 1].Length)
{
throw new ArgumentException("Invalid matrix: a matrix must be a rectangle");
}
}
columns = new int[rows[0].Length][];
for (int i = 0; i < rows[0].Length; i++)
{
columns[i] = new int[rows.Length];
for (int j = 0; j < rows.Length; j++)
{
columns[i][j] = rows[j][i];
}
}
}

public int Rows => rows.Length;

public int Cols => columns.Length;

public int[] Row(int row) => rows[row - 1];

public int[] Column(int col) => columns[col - 1];
}``````