assistant.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. // Dados constantes
  2. const exerciseTheme = [ "Leitura e Escrita",
  3. "Manipulação de Entrada",
  4. "Lógica",
  5. "Matemática",
  6. "Condição",
  7. "Condição de Parada",
  8. "Laço",
  9. "Vetor"]
  10. const testCaseTypes = [ "Caso Geral",
  11. "Caso Limite",
  12. "Caso Nulo",
  13. "Caso Negativo",
  14. "Igualdade",
  15. "Tipo de Entrada"]
  16. // Aquisição de dados externos
  17. // Dados vindos do Avaliador Automático
  18. let exerciseType = [exerciseTheme[getRandomInt(0, exerciseTheme.length)],
  19. exerciseTheme[getRandomInt(0, exerciseTheme.length)]];
  20. let testCases = [ {tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)},
  21. {tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)},
  22. {tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)},
  23. {tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)},
  24. {tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)},
  25. {tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)}];
  26. let allIncorrect = true;
  27. // Dados vindos da base de dados associada ao aluno
  28. let types = [ {type: exerciseTheme[0], total: 1, errors: 0},
  29. {type: exerciseTheme[1], total: 3, errors: 0},
  30. {type: exerciseTheme[2], total: 2, errors: 0},
  31. {type: exerciseTheme[3], total: 1, errors: 0},
  32. {type: exerciseTheme[4], total: 2, errors: 0},
  33. {type: exerciseTheme[5], total: 9, errors: 2},
  34. {type: exerciseTheme[6], total: 4, errors: 0},
  35. {type: exerciseTheme[7], total: 1, errors: 0}];
  36. let tags = [{tag: testCaseTypes[0], total: 15, errors: 0},
  37. {tag: testCaseTypes[1], total: 8, errors: 1},
  38. {tag: testCaseTypes[2], total: 5, errors: 1},
  39. {tag: testCaseTypes[3], total: 6, errors: 0},
  40. {tag: testCaseTypes[4], total: 7, errors: 0},
  41. {tag: testCaseTypes[5], total: 4, errors: 0}];
  42. let lastErrorsPerType = []; // Fila com os últimos 50 erros
  43. for (let i = 0; i<50; i++){
  44. lastErrorsPerType.push(exerciseTheme[getRandomInt(0, exerciseTheme.length)])
  45. }
  46. let lastErrorsPerTag = []; // Fila com os últimos 50 erros
  47. for (let i = 0; i<50; i++){
  48. lastErrorsPerTag.push(testCaseTypes[getRandomInt(0,testCaseTypes.length)])
  49. }
  50. // Variáveis internas
  51. let incorrect = false;
  52. let sugestions = [];
  53. let performance = [];
  54. let wrongTags = [];
  55. let wrongTagsAux = [];
  56. let lastErrorsPerTypeGraph = {};
  57. let lastErrorsPerTagGraph = {};
  58. // Funções auxiliares
  59. // Função que retorna um valor inteiro aleatório a partir de um intervalo definido
  60. function getRandomInt(min, max) {
  61. min = Math.ceil(min);
  62. max = Math.floor(max);
  63. return Math.floor(Math.random() * (max - min)) + min;
  64. }
  65. // Função que encontra um objeto dentro de um array a partir do valor de uma de suas chaves
  66. function findObject(array,key,value) {
  67. for(let i = 0; i < array.length; i++) {
  68. if(array[i][key] === value) {
  69. return i
  70. }
  71. }
  72. }
  73. // Funções do agente
  74. // Função que analisa o exercício em relação às tags
  75. function updateTags(testCases,tags,lastErrorsPerTag) {
  76. for (var i = 0; i < testCases.length; i++) {
  77. for (var j = 0; j < tags.length; j++) {
  78. if (testCases[i].tag === tags[j].tag) {
  79. tags[j].total += 1;
  80. if (testCases[i].incorrect) {
  81. incorrect = true;
  82. tags[j].errors += 1;
  83. lastErrorsPerTag.push(testCases[i].tag);
  84. if (lastErrorsPerTag.length > 50) {
  85. lastErrorsPerTag.shift();
  86. }
  87. wrongTagsAux.push(testCases[i].tag);
  88. }
  89. }
  90. }
  91. }
  92. wrongTags = wrongTagsAux.filter((element, i) => wrongTagsAux.indexOf(element) === i)
  93. //wrongTags = [...new Set(wrongTagsAux)]; // CUIDADO com o set
  94. }
  95. // Função que analisa o exercício em relação aos types
  96. function updateTypes(exerciseType,types,lastErrorsPerType) {
  97. for (var i = 0; i < exerciseType.length; i++) {
  98. for (var j = 0; j < types.length; j++) {
  99. if (exerciseType[i] === types[j].type) {
  100. types[j].total += 1;
  101. if (incorrect) {
  102. types[j].errors += 1;
  103. lastErrorsPerType.push(exerciseType[i]);
  104. if (lastErrorsPerType.length > 50) {
  105. lastErrorsPerType.shift();
  106. }
  107. }
  108. }
  109. }
  110. }
  111. }
  112. // Função que contabiliza as ocorrências dentro das fila de últimos erros
  113. function lastErrors() {
  114. lastErrorsPerType.forEach((x) => lastErrorsPerTypeGraph[x] = (lastErrorsPerTypeGraph[x] || 0)+1);
  115. lastErrorsPerTag.forEach((x) => lastErrorsPerTagGraph[x] = (lastErrorsPerTagGraph[x] || 0)+1);
  116. }
  117. // Função que adiciona o desempenho à saída
  118. function addPerformance(exerciseType,wrongTags) {
  119. let performanceText = "Desempenho\n\n";
  120. performanceText += `Neste exercício relacionado a ${exerciseType} você `;
  121. if (incorrect) {
  122. performanceText += `errou os teste que envolvem ${wrongTags}.\n\n`;
  123. }
  124. else {
  125. performanceText += `acertou todos os teste.\n\n`;
  126. }
  127. for (let i = 0; i < exerciseType.length; i++) {
  128. let obj = findObject(types,"type",exerciseType[i]);
  129. performanceText += `Seu desempenho em exercícios com ${exerciseType[i]} é de ${(100*(1-types[obj].errors/types[obj].total)).toFixed(2)}% de sucesso\n\n`;
  130. }
  131. if (incorrect) {
  132. for (let i = 0; i < wrongTags.length; i++) {
  133. let obj = findObject(tags,"tag",wrongTags[i]);
  134. performanceText += `Seu desempenho em testes de ${wrongTags[i]} é de ${(100*(1-tags[obj].errors/tags[obj].total)).toFixed(2)}% de sucesso\n\n`;
  135. performanceText += `Dos seus últimos 50 erros ${(100*(lastErrorsPerTagGraph[wrongTags[i]]/lastErrorsPerTag.length)).toFixed(2)}% foram em testes de ${wrongTags[i]}\n\n`;
  136. }
  137. }
  138. console.log(performanceText);
  139. }
  140. // Função que adiciona a sugestão à saída
  141. function addSugestion(wrongTypes,wrongTags) {
  142. let sugestionText = "Sugestões\n\n";
  143. if (incorrect) {
  144. sugestionText += `Levantar quais são os Casos Limites do problema a ser resolvido é fundamental para se avaliar o funcionamento adequado do programa desenvolvido, pois ao se testá-los podem ser encontrados erros que não são observados nos Casos Gerais.\n\n`;
  145. sugestionText += `[Explicação de Casos Limites]\n\n`;
  146. sugestionText += `[Exemplo de Casos Limites e Casos Gerais]\n\n`;
  147. sugestionText += `[Material ou link sobre Casos Limites]\n\n\n`;
  148. sugestionText += `O conceito de Laço é muito importante na programação, pois com ele ….\n\n`;
  149. sugestionText += `[Explicação sobre Laços]\n\n`;
  150. sugestionText += `[Exemplo do uso de Laços no iVProg]\n\n`;
  151. sugestionText += `[Material ou link sobre Laços]\n\n`;
  152. }
  153. else {
  154. sugestionText += `Parabéns!!! Seu exercício não apresentou erros.\n\n`;
  155. }
  156. console.log(sugestionText);
  157. }
  158. // Exibição dos valores recebidos
  159. console.log("\nAntes da Execução\n");
  160. console.table(exerciseType);
  161. console.table(testCases);
  162. console.table(types);
  163. console.table(tags);
  164. //console.table(lastErrorsPerType);
  165. //console.table(lastErrorsPerTag);
  166. console.log("*****************************************************************\n");
  167. // Execução do agente
  168. updateTags(testCases,tags,lastErrorsPerTag);
  169. updateTypes(exerciseType,types,lastErrorsPerType);
  170. lastErrors();
  171. addPerformance(exerciseType,wrongTags);
  172. addSugestion(exerciseType,wrongTags);
  173. console.log("*****************************************************************\n");
  174. // Reescrita do dados na base de dados associada ao aluno
  175. console.log("Após Execução\n");
  176. console.table(types);
  177. console.table(tags);
  178. console.table(lastErrorsPerTypeGraph);
  179. console.table(lastErrorsPerTagGraph);
  180. //console.table(lastErrorsPerType);
  181. //console.table(lastErrorsPerTag);
  182. console.log("\n");