Tracks
/
Go
Go
/
Ejercicios
/
Tablero de ajedrez
Tablero de ajedrez

Tablero de ajedrez

Ejercicio de aprendizaje

Introducción

En Go, puedes iterar sobre un slice usando for y un índice, o puedes usar range. range también te permite iterar sobre un map.

Cada iteración devuelve dos valores: el índice/clave y una copia del elemento en ese índice/clave.

Iterar sobre un slice

Pan comido: los bucles sobre un slice están ordenados como se espera.

xi := []int{10, 20, 30}
for i, x := range xi {
  fmt.Println(i, x)
}
// outputs:
// 0, 10
// 1, 20
// 2, 30

Iterar sobre un map

Iterar sobre un map plantea un nuevo problema. Ahora el orden es aleatorio.

hash := map[int]int{9: 10, 99: 20, 999: 30}
for k, v := range hash {
  fmt.Println(k, v)
}
// outputs, for example:
// 99 20
// 999 30
// 9 10
Note

Puede parecer que la salida anterior es incorrecta, ya que uno esperaría que el primer par clave/valor en la declaración del map 9 10 sea el primero en imprimirse y no el último. Sin embargo, los maps no tienen orden por naturaleza, no hay un primer o último par clave/valor. Por eso, al iterar sobre las entradas de un map, el orden en que se visitarán las entradas será aleatorio y no seguirá ningún patrón específico. Esto significa que la salida anterior es posible, pero podría diferir de lo que obtengas si intentas ejecutar esto tú mismo. Para obtener más información, consulta Especificación del lenguaje Go: cláusula range.

Iteración omitiendo clave o valor

En Go, una variable no utilizada generará un error en tiempo de compilación. A veces solo necesitas el valor, como en el primer ejemplo:

xi := []int{10, 20, 30}
for i, x := range xi {
  fmt.Println(x)
}
// Go build failed: i declared but not used

Puedes reemplazar la i con _, lo que le dice al compilador que no usamos ese valor:

xi := []int{10, 20, 30}
for _, x := range xi {
  fmt.Println(x)
}
// outputs:
// 10
// 20
// 30

Si solo quieres imprimir el índice, puedes reemplazar la x con _, o simplemente omitir la declaración:

xi := []int{10, 20, 30}
// for i, _ := range xi {
for i := range xi {
  fmt.Println(i)
}
// outputs:
// 0
// 1
// 2

Definición de tipos

Una definición de tipo crea un tipo nuevo con nombre, distinto de cualquier otro tipo, incluso de uno con el mismo tipo subyacente.

type File []bool

Aquí, File se refiere a una sola columna vertical de un tablero de ajedrez, que normalmente se etiqueta de la A a la H. Cada casilla de esta columna se representa con un valor Boolean que marca si está ocupada o no. Ahora que File está definido, podemos usarlo dentro de otras definiciones:

type Chessboard map[string]File

board := Chessboard{
    "A": File{true, false, true},
    "B": File{false, true, false},
}

Chessboard asigna identificadores de columna a valores File. Cada File es un slice de Boolean que representa las casillas de una columna del tablero. Sin estas definiciones de tipo, board sería un map[string][]bool, lo que haría más difícil entender qué estamos representando.

Instrucciones

Como aficionado al ajedrez, te gustaría escribir tu propia versión del juego. Sí, puede que ya existan muchas implementaciones de ajedrez disponibles en línea, ¡pero la tuya será única!

Cada casilla del tablero de ajedrez se identifica con un par letra-número:

  • Las hileras horizontales de casillas, llamadas filas, están numeradas del 1 al 8.
  • Las columnas verticales de casillas, llamadas columnas, están etiquetadas de la A a la H.
   A B C D E F G H
 8 # _ _ _ # _ _ # 8
 7 _ _ _ _ _ _ _ _ 7
 6 _ _ _ _ # _ _ # 6
 5 _ # _ _ _ _ _ # 5
 4 _ _ _ _ _ _ # # 4
 3 # _ # _ _ _ _ # 3
 2 _ _ _ _ _ _ _ # 2
 1 # _ _ _ _ _ _ # 1
   A B C D E F G H

1. Dado un tablero de ajedrez y una columna, cuenta cuántas casillas están ocupadas

Implementa la función CountInFile(board Chessboard, file string) int. Debe contar el número total de casillas ocupadas recorriendo un mapa. Devuelve un número entero. Devuelve un conteo de cero (0) si la columna dada no se puede encontrar en el mapa.

CountInFile(board, "A")
// => 3

2. Dado un tablero de ajedrez y una fila, cuenta cuántas casillas están ocupadas

Implementa la función CountInRank(board Chessboard, rank int) int. Debe contar el número total de casillas ocupadas recorriendo la fila dada. Devuelve un número entero. Devuelve un conteo de cero (0) si la fila dada no es válida (no está entre 1 y 8, inclusive).

CountInRank(board, 2)
// => 1

3. Cuenta cuántas casillas hay en el tablero de ajedrez dado

Implementa la función CountAll(board Chessboard) int. Debe contar cuántas casillas hay en el tablero de ajedrez y devuelve un número entero. Como no necesitas comprobar el contenido de las casillas, considera usar range omitiendo tanto index como value.

CountAll(board)
// => 64

4. Cuenta cuántas casillas están ocupadas en el tablero de ajedrez dado

Implementa la función CountOccupied(board Chessboard) int. Debe contar cuántas casillas están ocupadas en el tablero de ajedrez. Devuelve un número entero.

CountOccupied(board)
// => 15
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Go Exercism

¿Todo listo para empezar Tablero de ajedrez?

Regístrate en Exercism para aprender y dominar Go con 34 conceptos166 ejercicios y mentoría humana real, todo gratis.