Timkor

wordsInLineByDelimiters

Jan 19th, 2021 (edited)
846
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. let a = prompt("Введіть рядок"); //можна вводити будь-які літери, хоть китайські, в основі коду лежать символи
  2. let symbols1 = []; //роздільникиГрупа1? що буде в масиві? З назви не зрозуміло це. Вона не допомагає розуміти код.
  3. let symbols2 = [];
  4. let symbols3 = [];
  5. let symbols = []; // Тут будуть роздільники? Тоді можна іменувати delimiters або delimiterASCIICodes
  6. let allsymbols = []; // зручно та важливо дотримуватися camelCase, allSymbols. Хоча сама назва теж не допомагає
  7. let line = []; // далі розумію ви складаєте сюди ascii коди символів, назва для масиву lineASCIICodes може допомогти
  8. let x = 0;
  9. let y = 0;
  10. let z = 0;
  11. let n = 0;
  12. let k = 0;
  13. // Заповнюємо масив кодом символа
  14. for ( let i = 32; i <= 64; i++ ) {  // можна for ( let i = 0; i <= 32; i++ ) {symbol[i] = i + 32;}
  15.     symbols1[x] = i;
  16.     x++;
  17. }
  18. // Заповнюємо масив кодом символа
  19. for ( let i = 91; i <= 96; i++ ) {  
  20.     symbols2[y] = i;
  21.     y++;
  22. }
  23. // Заповнюємо масив кодом символа
  24. for ( let i = 123; i <= 127; i++ ) {  
  25.     symbols3[z] = i;
  26.     z++;
  27. }
  28. // Дабавляємо в всі символи в оди масив
  29. symbols = symbols1.concat(symbols2,symbols3);
  30.  
  31. // Створюємо масив у якому номер елементу буде відповідати його значенню(необхідно для подальшої умови)
  32. for (let i = 0; i < symbols.length; i++) {  
  33.     allsymbols[symbols[i]] = symbols[i];
  34. }
  35.  
  36. for ( let i = 0; i < a.length; i++ ) {  // перетворюємо рядок у масив у якому буде код ASCII кожного елемента рядка(для зручності)
  37.     line[n] = a.charCodeAt(i); // значення і та n збігаються. краще змінні, що використовуються у одному місці в коді,
  38.                                // створювати якомога ближче до цього місця
  39.     n++;
  40. }
  41. line.push(32);  // добавляємо в кінець масиву будь-який код ASCII символу(необхідно для умови)
  42. for ( let i = 0; i < line.length; i++ ) {
  43.     for ( let j = 0; j < symbols.length; j++ ) {
  44.         if ( line[i] !== allsymbols[line[i]] && line[i + 1] === symbols[j] ) { //алгоритм умови такий - якщо після букви йде символ то це слово // слід зауважити, що для останнього елементу і + 1 вийде за межі, js це дозволяє, а от java ні.)
  45.            k++; // така назва змінної не допомагає читати та писати код, краще wordCount
  46.         }
  47.     }
  48. }
  49. console.log("Кількість слів у рядку - " + k);
  50.  
  51. /*основний блок коду, який збільшує лічильник слів:*/
  52.  
  53. for ( let j = 0; j < symbols.length; j++ ) {
  54.         if ( line[i] !== allsymbols[line[i]] && line[i+1] === symbols[j] ) { //алгоритм умови такий - якщо після букви йде символ то це слово
  55.            k++; // така назва змінної не допомагає читати та писати код, краще wordCount
  56.         }
  57.     }
  58.  
  59. /* якщо записати псевдокодом то маємо*/
  60. біжимо (індексом і) по всіх символах строки (точніше ascii кодах цих символів складених до масиву line)
  61.     якщо поточний символ === не роздільник ТА наступний символ === роздільник
  62.         тоді слівЛічильник++
  63.  
  64. /*
  65. 1. для того щоб збагнути чи роздільник поточний символ ми користуємось "хитрим" масивом, де у всіх роздільників індекс дорівнює значенню line[i] !== allsymbols[line[i]]. Тобто по суті якщо значення елементу дорівнює індексу то це роздільник:
  66.  if (line[i] === allsymbols[line[i]] ) {console.log(line[i] + ' it is delimiter');}
  67.  
  68. 2. для того щоб збагнути чи роздільник наступний символ перебираємо у вкладеному циклі всі роздільники масиву symbols
  69. а чи можемо використати "хитрий" прийомчик і для наступного символу?
  70.  
  71. Нормально прокачалися з масивами, цікаво придумали з масивом де індекс дорівнює самому елементові, такий прийомчик ще знадобиться.
  72. За для розширення досвіду раджу почитати декілька останніх кодів рішення цієї ж задачи інших людей курса, а також рев'ю до
  73. них.
  74. https://codeshare.io/2KKPqP - тут ще одне.
  75. Також раджу спробувати використати функції (які є слідуючою темою для освоювання).
  76. */
  77.  
  78. /*
  79. Факультативно для шанувальників масивів бажаючих перейти у інші виміри:)
  80. я не кажу, що рішення з масивами роздільників symbols саме доречне, як і його назва що варто змінити , але якщо вже братися за подібне, то можна трохи оптимізувати так:
  81. створити масив ренжів
  82. let delimiterASCIIRanges = [[32, 64], [91, 96],[123, 127]]; /* це масив масивів, або двомірний масив, звертатися до
  83. його елементів треба так: спочатку вказуємо індекс підмасиву, а потім індекс елементу в цьому підмасиві.
  84. Двовимірні масиви називають матріцами, бо можна уявити їх так:
  85. let matrixArray = [
  86.  [3, 2, 6, 4, 15, 6],
  87.  [0, 9, 1, 42, 9],      // так, підмасиви можуть бути різної довжини
  88.  [12, 37, 1, 27]
  89. ];
  90. тоді звернення до елементу буде типу [по вертикалі][по горизонталі], тобто matrixArray[1][3] === 42
  91. длина масиву matrixArray.length === 3 (3 підмасива), а от длина підмасиву matrix.Array[2].length === 4 (елементи у другому підмассиві)
  92. масиви можуть мати скільки заводно вимірів, тобто у трохвимірному масиві адресація буде така [][][], бо то масив масивів масивів, і т.д.)
  93. Ну і ще, слова підмасиви не існує, або ж воно не часто зустрічається, і є тут лише для простоти розуміння.)_
  94. */
  95.  
  96.  
  97.  
  98.  
  99. // далі можете поміркувати самостійно як створити delimitersASCIICodes (ваш symbols) з delimiterASCIIRanges = [[32, 64], [91, 96],[123, 127]];
  100. // бо далі код
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116. for (let rangeIndex = 0, i = 0; rangeIndex < delimiterASCIIRanges; rangeIndex++) {
  117.     for (let code = delimiterASCIIRanges[rangeIndex][0]; code <= delimiterASCIIRanges[rangeIndex][1]; code++) {
  118.         delimitersASCIICodes[i++] = code;
  119. }
  120. /*можна позбутися індексу і, а просто пушити до delimitersASCIICodes: */
  121. delimitersASCIICodes.push(code); // теж саме  delimitersASCIICodes[i++] = code;
  122. // Гарного коду.
Advertisement
Add Comment
Please, Sign In to add comment