Programar un torneo de ajedrez

8

Introducción

Ahora mismo estoy participando en un torneo de ajedrez. Me inspiré en el calendario del torneo. En este momento, estoy en una competencia con otros tres jugadores. Eso significa que con nosotros cuatro, estamos jugando 3 rondas. El horario es el siguiente:

Round 1: 1-4 3-2
Round 2: 3-4 2-1
Round 3: 1-3 4-2

Esto también se conoce como Round Robin . Además, este es un horario válido . Decimos que un horario es válido cuando cumple las siguientes condiciones:

  • Cada jugador juega una vez contra otro jugador.
  • 1-2significa que el jugador 1tiene blanco . Cada jugador tiene o ( N / 2 - 0.5 ) o ( N / 2 + 0.5 ) veces blanco, siendo N la cantidad de rondas.

Por ejemplo, en el ejemplo anterior, hay 3 rondas. Entonces N = 3. Como puede ver, la cantidad de rondas es igual a la cantidad de jugadores - 1 . Un jugador tiene

  • N / 2 - 0.5 = 1 vez blanco, o
  • N / 2 + 0.5 = 2 veces blanco.

En el ejemplo anterior:

  • el jugador 1tiene 2 veces blanco,
  • el jugador 2tiene 1 vez blanco,
  • el jugador 3tiene 2 veces blanco,
  • el jugador 4tiene 1 vez blanco.

La tarea

Dado un incluso número entero> 1 que representa la cantidad de jugadores en la competición, la salida del programa de torneos.

Casos de prueba:

Entrada = 4, eso significa N = 3

Input:     Output:
4          1-4 3-2
           3-4 2-1
           1-3 4-2

Entrada = 10, eso significa N = 9

Input:     Output:
10         1-10  2-9  3-8  4-7  5-6
           10-6  7-5  8-4  9-3  1-2
           2-10  3-1  4-9  5-8  6-7
           10-7  8-6  9-5  1-4  2-3
           3-10  4-2  5-1  6-9  7-8
           10-8  9-7  1-6  2-5  3-4
           4-10  5-3  6-2  7-1  8-9
           10-9  1-8  2-7  3-6  4-5
           5-10  6-4  7-3  8-2  9-1

Entrada = 12, eso significa N = 11

Input:     Output:
12         1-14    2-13   3-12   4-11   5-10   6-9    7-8
           14-8    9-7    10-6   11-5   12-4   13-3   1-2
           2-14    3-1    4-13   5-12   6-11   7-10   8-9
           14-9    10-8   11-7   12-6   13-5   1-4    2-3
           3-14    4-2    5-1    6-13   7-12   8-11   9-10
           14-10   11-9   12-8   13-7   1-6    2-5    3-4
           4-14    5-3    6-2    7-1    8-13   9-12   10-11
           14-11   12-10  13-9   1-8    2-7    3-6    4-5
           5-14    6-4    7-3    8-2    9-1    10-13  11-12
           14-12   13-11  1-10   2-9    3-8    4-7    5-6
           6-14    7-5    8-4    9-3    10-2   11-1   12-13
           14-13   1-12   2-11   3-10   4-9    5-8    6-7
           7-14    8-6    9-5    10-4   11-3   12-2   13-1

Por supuesto, los espacios en blanco adicionales que utilicé entre los números son opcionales pero no necesarios. Puede enviarlo de la forma que desee, siempre que sea legible.

Nota: Los ejemplos anteriores no son solo las únicas salidas válidas. Ciertamente hay salidas más válidas.

Este es el , por lo que gana el envío con la menor cantidad de bytes.

Adnan
fuente
2
Creo que la validez está subespecificada. En particular, ¿no debería requerir que el número de rondas sea uno menos que el número de jugadores?
Peter Taylor
1
@PeterTaylor Sí, olvidé mencionar eso. Lo he editado en la pregunta
Adnan
¿Los jugadores tienen que estar numerados del 1 al N, o pueden estar numerados del 0 al N-1?
Level River St el
@steveverrill Lo que mejor se adapte a ti.
Adnan
¿Tiene que separar las rondas en las salidas o es 1-4 3-2 3-4 2-1 1-3 4-2para n=4una salida válida?
randomra

Respuestas:

3

Python 2, 200 186 Bytes


n=input()
t=range(2,n+1)
for k in t:
 s=[1]+t
 c=[[s[x],s[-x-1]] for x in range(n/2)]
 if k%2:c[0].reverse()
 t=t[-1:]+t[:-1]
 print"\t".join(["-".join([str(y) for y in x]) for x in c])

Salida de ejemplo:

$ python chess.py
4
1-4     2-3
3-1     4-2
1-2     3-4

$ python chess.py
10
1-10    2-9     3-8     4-7     5-6
9-1     10-8    2-7     3-6     4-5
1-8     9-7     10-6    2-5     3-4
7-1     8-6     9-5     10-4    2-3
1-6     7-5     8-4     9-3     10-2
5-1     6-4     7-3     8-2     9-10
1-4     5-3     6-2     7-10    8-9
3-1     4-2     5-10    6-9     7-8
1-2     3-10    4-9     5-8     6-7

$ python chess.py
14
1-14    2-13    3-12    4-11    5-10    6-9     7-8
13-1    14-12   2-11    3-10    4-9     5-8     6-7
1-12    13-11   14-10   2-9     3-8     4-7     5-6
11-1    12-10   13-9    14-8    2-7     3-6     4-5
1-10    11-9    12-8    13-7    14-6    2-5     3-4
9-1     10-8    11-7    12-6    13-5    14-4    2-3
1-8     9-7     10-6    11-5    12-4    13-3    14-2
7-1     8-6     9-5     10-4    11-3    12-2    13-14
1-6     7-5     8-4     9-3     10-2    11-14   12-13
5-1     6-4     7-3     8-2     9-14    10-13   11-12
1-4     5-3     6-2     7-14    8-13    9-12    10-11
3-1     4-2     5-14    6-13    7-12    8-11    9-10
1-2     3-14    4-13    5-12    6-11    7-10    8-9

O 135 Bytes , utilizando una salida menos bonita (pero aún legible):

...
print c

Lo que produce algo como:

$ python chess.py
4
[[1, 4], [2, 3]]
[[3, 1], [4, 2]]
[[1, 2], [3, 4]]
madmax1
fuente
La respuesta menos bonita también es una presentación válida. Así que esto es 135 bytes :)
Adnan
Te votaría si agregaras una explicación humana de tu algoritmo.
Level River St el