He estado buscando en todas partes, incluidos los archivos de Stack Overflow, para obtener una respuesta sobre cómo hacerlo, he intentado rodar la mía, pero han quedado cortos, así que decidí publicar mi solicitud aquí.¿Cómo puedo generar un calendario de torneos en Ruby?
Necesito tomar un número arbitrario (par) de elementos en una matriz y regresar con el elemento emparejado con otro elemento en la matriz. Necesito que la salida del código sea la misma que el ejemplo de salida que he incluido a continuación.
de entrada:
('A'..'H').to_a
Salida:
[[['A','H'], ['B','G'], ['C','F'], ['D','E']], [['A','G'], ['B','F'], ['C','E'], ['D','H']], [['A','F'], ['B','E'], ['C','D'], ['G','H']], [['A','E'], ['B','D'], ['C','H'], ['F','G']], [['A','D'], ['B','C'], ['E','G'], ['F','H']], [['A','C'], ['B','H'], ['D','G'], ['E','F']], [['A','B'], ['C','G'], ['D','F'], ['E','H']]]
¿Alguna idea?
Esto es lo que he hecho hasta ahora. Está un poco sucio y no regresa en el orden que necesito.
items = ('A'..'H').to_a combinations = [] 1.upto(7) do |index| curitems = items.dup combination = [] 1.upto(items.size/2) do |i| team1 = curitems.delete_at(0) team2 = curitems.delete_at(curitems.size - index) || curitems.delete_at(curitems.size - 1) combination << [team1, team2] end combinations << combination end pp combinations
La salida está cerca, pero no en el orden correcto:
[[["A", "H"], ["B", "G"], ["C", "F"], ["D", "E"]], [["A", "G"], ["B", "F"], ["C", "E"], ["D", "H"]], [["A", "F"], ["B", "E"], ["C", "D"], ["G", "H"]], [["A", "E"], ["B", "D"], ["C", "H"], ["F", "G"]], [["A", "D"], ["B", "C"], ["E", "G"], ["F", "H"]], [["A", "C"], ["B", "H"], ["D", "E"], ["F", "G"]], [["A", "B"], ["C", "G"], ["D", "H"], ["E", "F"]]]
Se dará cuenta de que mi código me consigue dos < D - combinaciones> H (última línea y de segunda línea) y eso no funcionará
Mi comprensión de los requisitos de la OP [FM]:
- Dado
N
equipos (por ejemplo, 8 equipos:A..H
). - Crear un calendario de torneos, que consiste en
R
rondas de juego (7 en nuestro ejemplo) yG
juegos (28 en nuestro ejemplo). - Donde cada equipo juega a cada otro equipo exactamente una vez.
- Donde cada equipo juega una vez en cada ronda.
- Y (la parte dura) donde el orden de los juegos dentro de una ronda funciona así:
- El equipo mejor clasificado (A) se reproduce el equipo de bajo clasificado (H) en primer lugar.
- Si un duelo candidato es rechazado por violar la norma de no repetición, poner el equipo de bajo clasificado en la "un segundo plano" y forman los otros duelos primero. Luego haga coincidir los equipos de back-burner con las mismas reglas . (Por ejemplo: en la Ronda 2, el primer partido candidato,
A-H
, se rechazaron como una repetición, por lo que el juego 1 se serA-G
yH
se sentará en un segundo plano , para ser emparejado conD
como el última juego en la ronda). - Al agregar equipos al back-quemador, agréguelos al principio de esa lista (es decir, conserve el orden de rango en el quemador de fondo también).
- Nota: Round 5 es el complicado. Los primeros 2 juegos de son sencillos. El tercer juego sería
E-H
; sin embargo, eso crea un escenario donde el 4to juego sería una repetición (F-G
). Por lo tanto, el algoritmo necesita retroceder, rechazarE-H
vincular y en su lugar ir porE-G
en el 3er juego.
¿Hay alguna restricción de rendimiento? ¿Qué tamaño de matrices? Cuando dice que tiene que ser el mismo, ¿esto incluye el orden? –
Sí, debe ser en ese orden. (Debe reemplazar un proceso existente que actualmente se realiza manualmente y el cliente se establece en sus formas). – rwl4
¿Podría explicarnos qué es el pedido? No estoy seguro de poder adivinar el patrón. –