Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for [old] Find Enemy by Sim0000
"use strict";
const DIR = {'N':0, 'NE':2, 'E':3, 'SE':4, 'S':6, 'SW':8, 'W':9, 'NW':10};
const RDIR = ['F', 'F', 'R', 'R', 'R', 'B', 'B', 'B', 'L', 'L', 'L', 'F'];
function findEnemy(you, dir, enemy) {
let x0 = you[0].charCodeAt(0) - 65;
let y0 = Number(you[1]);
let x1 = enemy[0].charCodeAt(0) - 65;
let y1 = Number(enemy[1]);
let dx = Math.abs(x1 - x0)
/*
d is direction to enemy
N
NW | NE
\ b 0 1 /
a 2
W-9 3-E
8 4
/ 7 6 5 \
SW | SE
S
*/
let d, distance;
if(dx == 0) {
d = y1 < y0 ? 0 : 6;
distance = dx + Math.abs(y1 - y0);
} else {
/*
d can be determined by where is y1. if y1 < v0, d = 1
NE
+ v0
/|
/ |
/ |
/ |
+----+---- y0
x0\ |x1
\ |
\ |
\|
+ v1
SE
*/
let v0 = y0 - Math.floor((dx + 1 - x0 % 2) / 2);
let v1 = y0 + Math.floor((dx + x0 % 2) / 2);
d = y1 < v0 ? 1 : y1 == v0 ? 2 : y1 < v1 ? 3 : y1 == v1 ? 4 : 5;
if(x1 < x0) d = 12 - d;
distance = dx + (v0 <= y1 && y1 <= v1 ? 0 : y1 < v0 ? v0 - y1 : y1 - v1);
}
d -= DIR[dir];
if(d < 0) d += 12;
return [RDIR[d], distance];
}
var assert = require('assert');
if (!global.is_checking) {
assert.deepEqual(findEnemy('G5', 'N', 'G4'), ['F', 1], "N-1");
assert.deepEqual(findEnemy('G5', 'N', 'I4'), ['R', 2], "NE-2");
assert.deepEqual(findEnemy('G5', 'N', 'J6'), ['R', 3], "SE-3");
assert.deepEqual(findEnemy('G5', 'N', 'G9'), ['B', 4], "S-4");
assert.deepEqual(findEnemy('G5', 'N', 'B7'), ['L', 5], "SW-5");
assert.deepEqual(findEnemy('G5', 'N', 'A2'), ['L', 6], "NW-6");
assert.deepEqual(findEnemy('G3', 'NE', 'C5'), ['B', 4], "[watch your six!]");
assert.deepEqual(findEnemy('H3', 'SW', 'E2'), ['R', 3], "right");
assert.deepEqual(findEnemy('A4', 'S', 'M4'), ['L', 12], "true left");
console.log("You are good to go!");
}
March 1, 2017
Comments: