Advertisement
dddilian

Ladybugs

Mar 22nd, 2020
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function solve(input) {
  2.     let length = Number(input.shift()); //взимаме дължината на полето, отрязвайки първия елемент от входящия масив
  3.     let bugIndexes = input.shift().split(' '); //правим си масив с индексите на калинките, отрязвайки и втория елемент, който сега се явява пръв, от входящия масив
  4.     let fieldArr = new Array(length); //полето с определената дължина. На него трябва да сложим калинките
  5.     fieldArr.fill(0); //пълним полето с нули на всеки индекс
  6.     let startIndex = 0;
  7.     let steps = 0;
  8.     let posoka = '';
  9.     //console.log(fieldArr)
  10.     for (let i = 0; i < bugIndexes.length; i++) { //обхождаме масива с позициите на калинките
  11.         let posIndex = bugIndexes[i]; //взимаме стойносттите на елементите от масива с позициите на калинките
  12.         fieldArr[posIndex] = 1; //и поставяме калинка на съответните места в масива с полето
  13.     }
  14.  
  15.     let movesArr = [];
  16.     //console.log(input)
  17.     for (let i = 0; i < input.length; i++) { //обхождаме масива, в който са останали инструкциите за вдижение на калинките
  18.         movesArr.push(input[i].split(' ')); //вкарваме ги в друг масив, в който всяка една инструкция от типа '0 right 1' е отделен масив с 3 елемента
  19.     }
  20.     //console.log(movesArr)
  21.  
  22.     for (let i = 0; i < movesArr.length; i++) { //ДВУМЕРЕН масив с инструкции под формата на масиви за движение на калинките
  23.         //не ги обхождаме с вложен цикъл, защото няма смисъл
  24.         startIndex = Number(movesArr[i][0]);
  25.         posoka = movesArr[i][1];
  26.         steps = Number(movesArr[i][2]);
  27.  
  28.         //console.log(fieldArr)
  29.         if (fieldArr[startIndex] != 1) { //ако ни дадат стартов индекс, на който няма калинка - нищо не се случва
  30.             continue;
  31.         } else if (startIndex < 0 || startIndex > fieldArr.length - 1) { //ако ни дадат стартов индекс, който е извън границите на масива с полето - нищо не се случва
  32.             continue;
  33.         } else {
  34.             if (posoka == 'right') { //right
  35.                 if (startIndex != fieldArr.length - 1) { //първо проверяваме дали позицията не е последната в масива след като ще калинката лети надясно
  36.                     //ако стартовата позиция не е последната в масива, влизаме надолу, за да търсим, дали може да кацне някъде
  37.                     if (fieldArr[startIndex + steps] == 0) { //ако позицията за кацане е свободна, калинката каца и освобождава предишната си позиция и всичко свършва тук
  38.                         fieldArr[startIndex + steps] = 1;
  39.                         fieldArr[startIndex] = 0;
  40.                     } else { //ако не е свободна позицията за кацане, калинката започва да търси свободна. Ако не намери - отлита завинаги.
  41.                         for (let k = startIndex + steps; k < fieldArr.length; k++) {
  42.                             if (k == fieldArr.length - 1 && fieldArr[fieldArr.length] != 0) { //ако сме стигнали края на масива и последната позиция е заета, калинката отлита и освобождава мястото си, цикъла приключва.
  43.                                 fieldArr[startIndex] = 0;
  44.                                 break;
  45.                             } else {
  46.                                 if (fieldArr[k] == 0) {
  47.                                     fieldArr[k] = 1;
  48.                                     fieldArr[startIndex] = 0;
  49.                                     break;
  50.                                 }
  51.                             }
  52.  
  53.                         }
  54.                     }
  55.                 } else { //калинката директно излита от масива и освобождава досегашното си място
  56.                     fieldArr[startIndex] = 0;
  57.                 }
  58.                 //край на логика за ДЯСНА посока
  59.  
  60.             } else { //left
  61.                 if (startIndex != 0) { //първо проверяваме дали позицията не е на първата 0-лева позиция на масива
  62.                     //ако стартовата позиция не е последната в масива, влизаме надолу, за да търсим, дали може да кацне някъде
  63.                     if (fieldArr[startIndex - steps] == 0) { //ако позицията за кацане е свободна, калинката каца и освобождава предишната си позиция и всичко свършва тук
  64.                         fieldArr[startIndex - steps] = 1;
  65.                         fieldArr[startIndex] = 0;
  66.                     } else { //ако не е свободна позицията за кацане, калинката почва да търси свободна. Ако не намери - отлита завинаги.
  67.                         for (let k = startIndex - steps; k >= 0; k--) {
  68.                             if (k == 0 && fieldArr[k] != 0) { //ако сме стигнали края (началото му) на масива и последната позиция е заета, калинката отлита и освобождава мястото си, цикъла приключва.
  69.                                 fieldArr[startIndex] = 0;
  70.                                 break;
  71.                             } else {
  72.                                 if (fieldArr[k] == 0) {
  73.                                     fieldArr[k] = 1;
  74.                                     fieldArr[startIndex] = 0;
  75.                                     break;
  76.                                 }
  77.                             }
  78.                         }
  79.                     }
  80.                 } else { //ако стартовия индекс на калинката е 0, тя директно излита от масива и освобождава досегашното си място
  81.                     fieldArr[startIndex] = 0;
  82.                 }
  83.             }
  84.         }
  85.     }
  86.     //console.log(fieldArr)
  87.     console.log(fieldArr.join(' '));
  88. }
  89.  
  90. solve([3, '0 1', '0 right 1', '2 right 1']);
  91. solve([3, '0 1 2', '0 right 1', '1 right 1', '2 right 1']);
  92. solve([5, '3', '3 left 2', '1 left -2']);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement