Ho cercato dappertutto, inclusi gli archivi Stack Overflow, per una risposta su come farlo, ho provato a far girare il mio, ma sono venuto a mancare, così ho deciso di pubblicare la mia richiesta qui.Come posso generare un programma di torneo in Ruby?
Ho bisogno di prendere un numero arbitrario (pari) di elementi in un array e restituire con l'elemento abbinato a un altro elemento nell'array. Ho bisogno che l'output del codice sia uguale all'esempio di output che ho incluso di seguito.
ingresso:
('A'..'H').to_a
uscita:
[[['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']]]
Tutte le idee?
Ecco cosa ho fatto finora. È un po 'sporco, e non sta tornando nell'ordine che mi serve.
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
L'uscita è vicino, ma non nel giusto ordine:
[[["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"]]]
si noterà che il mio codice mi riceve due D < - combinazioni> H (ultima linea e seconda riga) e quello non funzionerà.
mia comprensione delle esigenze del PO [FM]:
- Dato
N
squadre (ad esempio, 8 squadre:A..H
). - Creare un programma di tornei, composto da
R
turni di gioco (7 nel nostro esempio) eG
giochi (28 a nostro esempio). - Dove ogni squadra gioca ogni altra squadra esattamente una volta.
- Dove ogni squadra gioca una volta per round.
- E (la parte più difficile), dove l' ordinamento dei giochi all'interno di un round funziona così:
- Il team di top-ranked (A) interpreta il basso squadra classificata (H) prima.
- Se un matchup candidato viene rifiutato per aver violato la regola no-repeat, messo il team di basso rango sul "back-bruciatore" e formano gli altri matchups prima. Quindi abbinare i team di back-burner utilizzando le stesse regole . (Ad esempio: nel Round 2, il primo matchup candidato,
A-H
, è respinto come una ripetizione, in modo da gara 1 sarà essereA-G
, eH
siederà nel dimenticatoio , per essere accoppiato conD
come ultima gioco a tutto tondo). - Quando si aggiunge squadre al back-bruciatore, aggiungerli alla parte anteriore di quella lista (vale a dire, conservare rango ordinamento sul back-bruciatore pure).
- Nota: il round 5 è il difficile. I primi 2 giochi sono semplici. Il 3 ° gioco sarebbe allora
E-H
; tuttavia, ciò crea uno scenario in cui il quarto gioco sarebbe una ripetizione (F-G
). Quindi l'algoritmo deve eseguire il backtrack , rifiutare l'abbinamentoE-H
e passare al numeroE-G
nel terzo gioco .
Esistono limiti di prestazioni? Quali matrici di dimensioni? Quando dici che deve essere lo stesso, questo include l'ordine? –
Sì, deve essere in questo ordine. (È necessario sostituire un processo esistente attualmente eseguito manualmente e il cliente è impostato nei loro modi.) – rwl4
Puoi spiegare qual è l'ordine? Non sono sicuro di poter indovinare lo schema. –