-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
126 lines (113 loc) · 4.15 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
const fs = require('fs')
main()
function main(){
const jugadores = getJugadores()
if(jugadores.length%2 !== 0 || jugadores.length > 14){
console.log(`Se debe seleccionar una cantidad par de jugadores, y no se puede seleccionar más de 14 jugadores [seleccionados = ${jugadores.length}]`)
return
}
let mejorParidadEncontrada = 999999
for(let opcion = 0; opcion < Math.pow(2,14); opcion++){
if(!dejaIgualCantDeJugadoresEnCadaCuadro(opcion, jugadores.length/2)){
continue
}
const cuadros = getCuadros(jugadores, opcion)
const cuadroA = cuadros.cuadroA
const cuadroB = cuadros.cuadroB
if(!mismaCantidadDeAltosODiferenciaDe1(cuadroA, cuadroB)){
continue
}
const paridad = getParidadEntreCuadros(cuadroA, cuadroB)
if(paridad <= mejorParidadEncontrada){
imprimirOpcion(cuadroA, cuadroB, paridad)
mejorParidadEncontrada = paridad
}
}
}
function getParidadEntreCuadros(cuadroA, cuadroB){
const puntajeTotalCuadroA = getPuntajeTotalCuadro(cuadroA)
const puntajeTotalCuadroB = getPuntajeTotalCuadro(cuadroB)
return Math.abs(puntajeTotalCuadroA - puntajeTotalCuadroB)
}
function getPuntajeTotalCuadro(jugadores){
let ret = 0
for(let i = 0; i < jugadores.length; i++){
ret += getPuntajeTotalJugador(jugadores[i])
}
return ret
}
function getPuntajeTotalJugador(jugador){
return jugador.defensaPerimetral + jugador.defensaInterna + jugador.tiroExterior*1.25 + jugador.ataqueInterior*1.25 + jugador.contragolpe*1.25 + jugador.pase*1.25
}
function imprimirOpcion(cuadroA, cuadroB, paridad){
imprimirCuadro('Cuadro A', cuadroA)
imprimirCuadro('Cuadro B', cuadroB)
console.log(`Diferencia de puntaje: ${paridad}\n\n`)
}
function imprimirCuadro(nombreCuadro, jugadores){
console.log(`${nombreCuadro} (${getPuntajeTotalCuadro(jugadores)} pts)`)
console.log('--------------------')
for(let i = 0; i < jugadores.length; i++){
console.log(`${jugadores[i].nombre} (${getPuntajeTotalJugador(jugadores[i])} pts) ${jugadores[i].altura === 'alto' ? '[alto]' : ''}`)
}
console.log('')
}
function mismaCantidadDeAltosODiferenciaDe1(cuadroA, cuadroB){
let cantAltosCuadroA = 0
let cantAltosCuadroB = 0
for(let i = 0; i < cuadroA.length; i++){
if(cuadroA[i].altura === 'alto') cantAltosCuadroA++
if(cuadroB[i].altura === 'alto') cantAltosCuadroB++
}
return Math.abs(cantAltosCuadroA - cantAltosCuadroB) <= 1
}
function getCuadros(jugadores, opcion){
const opcionBinario = opcion.toString(2)
const cuadroA = []
const cuadroB = []
for(let i = 0; i < jugadores.length; i++){
if(opcionBinario[i] === '0'){
cuadroA.push(jugadores[i])
}else{
cuadroB.push(jugadores[i])
}
}
return {cuadroA, cuadroB}
}
function dejaIgualCantDeJugadoresEnCadaCuadro(opcion, cantJugadoresPorCuadro){
const opcionBinario = opcion.toString(2)
let cantCeros = 0
let cantUnos = 0
for(let i = 0; i < opcionBinario.length; i++){
if(opcionBinario[i] === '0') cantCeros++
else cantUnos++
}
return cantCeros === cantJugadoresPorCuadro && cantUnos === cantJugadoresPorCuadro
}
function getJugadores(){
try{
const data = fs.readFileSync('jugadores.txt', 'utf8')
const lineas = data.split('\n')
const ret = []
for(let i = 0; i < lineas.length; i++){
if(!lineas[i].endsWith('@')){
continue;
}
lineas[i] = lineas[i].substring(0, lineas[i].length-1)
const vecJugador = lineas[i].split(',')
ret.push({
nombre: vecJugador[0],
defensaPerimetral: Number(vecJugador[1]),
defensaInterna: Number(vecJugador[2]),
tiroExterior: Number(vecJugador[3]),
ataqueInterior: Number(vecJugador[4]),
contragolpe: Number(vecJugador[5]),
pase: Number(vecJugador[6]),
altura: vecJugador[7],
})
}
return ret
}catch(e){
console.log('Error: ', e.stack)
}
}