82 lines
2.3 KiB
JavaScript
82 lines
2.3 KiB
JavaScript
|
const fs = require('fs')
|
||
|
const readline = require('readline');
|
||
|
const rl = readline.createInterface({input: process.stdin, output: process.stdout});
|
||
|
|
||
|
const MY_PLAYER_NUMBER = 1
|
||
|
|
||
|
function move(moves) {
|
||
|
let record = {'moves': moves}
|
||
|
console.error(JSON.stringify(record))
|
||
|
console.log(JSON.stringify(record))
|
||
|
}
|
||
|
|
||
|
function find_max_with_key(array, key) {
|
||
|
return array.reduce((item1, item2) => {
|
||
|
let val1 = item1[key];
|
||
|
let val2 = item2[key];
|
||
|
return (val1 > val2 ? item1 : item2);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function find_min_with_key(array, key) {
|
||
|
return array.reduce((item1, item2) => {
|
||
|
let val1 = item1[key];
|
||
|
let val2 = item2[key];
|
||
|
return (val1 < val2 ? item1 : item2);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* De main code van de bot
|
||
|
*/
|
||
|
function run_bot(state) {
|
||
|
// Maak een lijst van mijn eigen planeten
|
||
|
let my_planets = state["planets"].filter((planet) => {
|
||
|
return planet['owner'] === MY_PLAYER_NUMBER
|
||
|
})
|
||
|
|
||
|
// Maak een lijst van de planeten van de tegenstander
|
||
|
let other_planets = state["planets"].filter((planet) => {
|
||
|
return planet['owner'] !== MY_PLAYER_NUMBER
|
||
|
})
|
||
|
|
||
|
if (my_planets.length === 0 || other_planets.length === 0) {
|
||
|
// Als er al een speler dood is moet ik niets meer doen
|
||
|
move([])
|
||
|
} else {
|
||
|
// Stuur alle schepen behalve 1 van mijn planeet met meeste schepen
|
||
|
// naar die van de andere speler met zijn minste schepen
|
||
|
let planet = find_max_with_key(my_planets, 'ship_count');
|
||
|
let dest = find_min_with_key(other_planets, 'ship_count');
|
||
|
|
||
|
if (planet !== undefined && dest !== undefined) {
|
||
|
move([{
|
||
|
'origin': planet['name'],
|
||
|
'destination': dest['name'],
|
||
|
'ship_count': planet['ship_count'] - 1
|
||
|
}])
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
function main() {
|
||
|
// Je kunt als 2de argument een file meegeven. De bot gaat deze dan gebruiken als input voor de ronde
|
||
|
if (process.argv.length > 2) {
|
||
|
try {
|
||
|
const data = fs.readFileSync(process.argv[2], 'utf8')
|
||
|
run_bot(JSON.parse(data))
|
||
|
} catch (err) {
|
||
|
console.error(err)
|
||
|
}
|
||
|
} else {
|
||
|
// Anders gaan we stdin lezen
|
||
|
rl.on('line', (data) => {
|
||
|
run_bot(JSON.parse(data))
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
let _ = main();
|
||
|
|