Недавно я столкнулся с вопросом:
Что если у нас есть организационная иерархия, как показано ниже:
"B" reports to "A" / Hence A is boss of B, C, D, E
"C" and "D" reports to "B" / B is the boss of C, D, E
"E" reports to "D" / D is the boss of E
"G" reports to "F" / separate hierarchy - F is the boss of G
Здесь отношение может быть косвенным, то есть "A" и "C" связаны как "C "сообщает" B ", а" B "сообщает" A ".
Теперь напишите функцию в q, которая принимает 2 аргумента в качестве входных данных и возвращает истину, если оба аргумента связаны или иначе возвращают ложь (например, «A» и «F» не связаны).
Из обоих аргументов любой из аргументов может быть подчиненным или начальным.
Ниже код работает нормально, когда первый аргумент является начальным, а второй подчиненным.
f:{[i1;i2]
d:(`A`B`D`F)!(`B;[`C`D];`E;`G);
if[i2 in except[ raze {d[x]}\[i1];`];:1b] / Condition when i1 is boss and i2 is subordinate
e:(value d)!key d; / dictionary to support if first arg is subordinate and second is boss
:$[i2 in except[raze {e[x]}\[i1];`];1b;0b];
}
PASS - f[`A;`E] /- output 1b --> 1st arg - boss, 2nd arg - subordinate
PASS - f[`G;`F] /- output 1b --> 1st arg - subordinate, 2nd arg - boss
PASS - f[`F;`A] /- output 0b --> as A and F are not related
FAIL - f[`C;`A] /- output 0b --> fails because dictionary e in function f does not have key `C but `C`D
Может кто-нибудь помочь, пожалуйстаЯ улучшил эту функцию так, чтобы:
1. Функция работала как для начальника, так и для подчиненного, как любая аргумент.
2. Оптимизация - Как можно удалить избыточное создание словаря e и если условие?