# artemkorsakov's solution

## to Transpose in the Java Track

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

Given an input text output it transposed.

Roughly explained, the transpose of a matrix:

``````ABC
DEF
``````

is given by:

``````AD
BE
CF
``````

Rows become columns and columns become rows. See https://en.wikipedia.org/wiki/Transpose.

If the input has rows of different lengths, this is to be solved as follows:

• Pad to the left with spaces.
• Don't pad to the right.

Therefore, transposing this matrix:

``````ABC
DE
``````

results in:

``````AD
BE
C
``````

And transposing:

``````AB
DEF
``````

results in:

``````AD
BE
F
``````

In general, all characters from the input should also be present in the transposed output. That means that if a column in the input text contains only spaces on its bottom-most row(s), the corresponding output row should contain the spaces in its right-most column(s).

# Running the tests

You can run all the tests for an exercise by entering

``````\$ gradle test
``````

## Source

Reddit r/dailyprogrammer challenge #270 [Easy]. https://www.reddit.com/r/dailyprogrammer/comments/4msu2x/challenge_270_easy_transpose_the_input_text

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### TransposeTest.java

``````import org.junit.Ignore;
import org.junit.Test;
import org.junit.Before;

import static org.junit.Assert.assertEquals;

public class TransposeTest {
private Transpose transpose;

@Before
public void setup() {
transpose = new Transpose();
}

@Test
public void emptyString() {
String input = "";

String expected = "";

assertEquals(expected, transpose.transpose(input));
}

@Ignore("Remove to run test")
@Test
public void twoCharactersInARow() {
String input = "A1";

String expected = "A" +
"\n1";

assertEquals(expected, transpose.transpose(input));
}

@Ignore("Remove to run test")
@Test
public void twoCharactersInAColumn() {
String input = "A\n" +
"1";

String expected = "A1";

assertEquals(expected, transpose.transpose(input));
}

@Ignore("Remove to run test")
@Test
public void simple() {
String input = "ABC\n" +
"123";

String expected = "A1\n" +
"B2\n" +
"C3";

assertEquals(expected, transpose.transpose(input));
}

@Ignore("Remove to run test")
@Test
public void singleLine() {
String input = "Single line.";

String expected = "S\n" +
"i\n" +
"n\n" +
"g\n" +
"l\n" +
"e\n" +
" \n" +
"l\n" +
"i\n" +
"n\n" +
"e\n" +
".";

assertEquals(expected, transpose.transpose(input));
}

@Ignore("Remove to run test")
@Test
public void firstLineLongerThanSecondLine() {
String input = "The fourth line.\n" +
"The fifth line.";

String expected = "TT\n" +
"hh\n" +
"ee\n" +
"  \n" +
"ff\n" +
"oi\n" +
"uf\n" +
"rt\n" +
"th\n" +
"h \n" +
" l\n" +
"li\n" +
"in\n" +
"ne\n" +
"e.\n" +
".";

assertEquals(expected, transpose.transpose(input));
}

@Ignore("Remove to run test")
@Test
public void secondLineLongerThanFirstLine() {
String input = "The first line.\n" +
"The second line.";

String expected = "TT\n" +
"hh\n" +
"ee\n" +
"  \n" +
"fs\n" +
"ie\n" +
"rc\n" +
"so\n" +
"tn\n" +
" d\n" +
"l \n" +
"il\n" +
"ni\n" +
"en\n" +
".e\n" +
" .";

assertEquals(expected, transpose.transpose(input));
}

@Ignore("Remove to run test")
@Test
public void mixedLineLength() {
String input = "The longest line.\n" +
"A long line.\n" +
"A longer line.\n" +
"A line.";

String expected = "TAAA\n" +
"h   \n" +
"elll\n" +
" ooi\n" +
"lnnn\n" +
"ogge\n" +
"n e.\n" +
"glr\n" +
"ei \n" +
"snl\n" +
"tei\n" +
" .n\n" +
"l e\n" +
"i .\n" +
"n\n" +
"e\n" +
".";

assertEquals(expected, transpose.transpose(input));
}

@Ignore("Remove to run test")
@Test
public void square() {
String input = "HEART\n" +
"EMBER\n" +
"ABUSE\n" +
"RESIN\n" +
"TREND";

String expected = "HEART\n" +
"EMBER\n" +
"ABUSE\n" +
"RESIN\n" +
"TREND";

assertEquals(expected, transpose.transpose(input));
}

@Ignore("Remove to run test")
@Test
public void rectangle() {
String input = "FRACTURE\n" +
"OUTLINED\n" +
"BLOOMING\n" +
"SEPTETTE";

String expected = "FOBS\n" +
"RULE\n" +
"ATOP\n" +
"CLOT\n" +
"TIME\n" +
"UNIT\n" +
"RENT\n" +
"EDGE";

assertEquals(expected, transpose.transpose(input));
}

@Ignore("Remove to run test")
@Test
public void triangle() {
String input = "T\n" +
"EE\n" +
"AAA\n" +
"SSSS\n" +
"EEEEE\n" +
"RRRRRR";

String expected = "TEASER\n" +
" EASER\n" +
"  ASER\n" +
"   SER\n" +
"    ER\n" +
"     R";

assertEquals(expected, transpose.transpose(input));
}

}``````
``````import java.util.Arrays;

public class Transpose {
String transpose(String input) {
String[] rows = input.split("\n");
int max = Arrays.stream(rows).mapToInt(String::length).max().orElse(0);
String[] columns = new String[max];

int last = rows.length;
for (int i = 0; i < max; i++) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < last; j++) {
char cell = rows[j].length() > i ? rows[j].charAt(i) : ' ';
sb.append(cell);
}
columns[i] = sb.toString();
while (last > 0 && rows[last - 1].length() <= i + 1) {
last--;
}
}

return String.join("\n", columns);
}
}``````