Skip to content

Instantly share code, notes, and snippets.

@kevin-lee
Last active October 13, 2019 12:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kevin-lee/14cc669240ab49a8249d0607b76cbfef to your computer and use it in GitHub Desktop.
Save kevin-lee/14cc669240ab49a8249d0607b76cbfef to your computer and use it in GitHub Desktop.
Fill 2D collection to draw X shape / Multiplication table

Drawing X shape in 2D collection

Common Error Type

case class Error(message: String)

Mutable Solution

def xShapeMutable(length: Int): Either[Error, String] =
  if (length < 3) {
    Left(Error(s"The length must be greater than or equal to 3. (length: $length)"))
  } else {
    val array = Array.fill(length, length)(" ")
    0 until length map { x =>
      array(x)(x) = "*"
      array(x)(length - x - 1) = "*"
    }
    Right(
      array.map(_.mkString)
           .mkString("\n")
    )
  }
xShapeMutable(5) match {
  case Right(result) => println(s"Result:\n$result")
  case Left(error) => println(error)
}
Result:
*   *
 * *
  *
 * *
*   *
xShapeMutable(2) match {
  case Right(result) => println(s"Result:\n$result")
  case Left(error) => println(error)
}
Error(The length must be greater than or equal to 3. (length: 2))

Immutable Solution

def xShape(length: Int): Either[Error, String] =
  if (length < 3)
    Left(Error(s"The length must be greater than or equal to 3. (length: $length)"))
  else
    Right(
      Vector.tabulate(length, length) { (x, y) =>
        if (x == y) "*"
        else if (y == (length - x - 1)) "*"
        else " "
      }.map(_.mkString).mkString("\n")
    )
xShape(5) match {
  case Right(result) => println(s"Result:\n$result")
  case Left(error) => println(error)
}
Result:
*   *
 * *
  *
 * *
*   *
xShape(2) match {
  case Right(result) => println(s"Result:\n$result")
  case Left(error) => println(error)
}
Error(The length must be greater than or equal to 3. (length: 2))

Multiplication Table

Using maps

/* Multiplication Table using map */
println(
  2 to 9 map (x => 1 to 9 map (y => s"$x x $y = ${x * y}") mkString("\n")) mkString("\n\n")
)

Result:

2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18

3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27

4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36

5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45

6 x 1 = 6
6 x 2 = 12
6 x 3 = 18
6 x 4 = 24
6 x 5 = 30
6 x 6 = 36
6 x 7 = 42
6 x 8 = 48
6 x 9 = 54

7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63

8 x 1 = 8
8 x 2 = 16
8 x 3 = 24
8 x 4 = 32
8 x 5 = 40
8 x 6 = 48
8 x 7 = 56
8 x 8 = 64
8 x 9 = 72

9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81

Using for-comprehension

/* Multiplication Table using for-comprehension */
val multiplicationTable = (for {
    x <- 2 to 9
    y <- 1 to 9
    xy = x * y
  } yield s"$x x $y = $xy").sliding(9, 9) // sliding(9: take 9 elems, 9: previous index + 9)

println(
  multiplicationTable
        .map(_.mkString("\n"))
        .mkString("\n\n")
)

Result:

2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18

3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27

4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36

5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45

6 x 1 = 6
6 x 2 = 12
6 x 3 = 18
6 x 4 = 24
6 x 5 = 30
6 x 6 = 36
6 x 7 = 42
6 x 8 = 48
6 x 9 = 54

7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63

8 x 1 = 8
8 x 2 = 16
8 x 3 = 24
8 x 4 = 32
8 x 5 = 40
8 x 6 = 48
8 x 7 = 56
8 x 8 = 64
8 x 9 = 72

9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment