Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let a = prompt("Введіть рядок"); //можна вводити будь-які літери, хоть китайські, в основі коду лежать символи
- let symbols1 = []; //роздільникиГрупа1? що буде в масиві? З назви не зрозуміло це. Вона не допомагає розуміти код.
- let symbols2 = [];
- let symbols3 = [];
- let symbols = []; // Тут будуть роздільники? Тоді можна іменувати delimiters або delimiterASCIICodes
- let allsymbols = []; // зручно та важливо дотримуватися camelCase, allSymbols. Хоча сама назва теж не допомагає
- let line = []; // далі розумію ви складаєте сюди ascii коди символів, назва для масиву lineASCIICodes може допомогти
- let x = 0;
- let y = 0;
- let z = 0;
- let n = 0;
- let k = 0;
- // Заповнюємо масив кодом символа
- for ( let i = 32; i <= 64; i++ ) { // можна for ( let i = 0; i <= 32; i++ ) {symbol[i] = i + 32;}
- symbols1[x] = i;
- x++;
- }
- // Заповнюємо масив кодом символа
- for ( let i = 91; i <= 96; i++ ) {
- symbols2[y] = i;
- y++;
- }
- // Заповнюємо масив кодом символа
- for ( let i = 123; i <= 127; i++ ) {
- symbols3[z] = i;
- z++;
- }
- // Дабавляємо в всі символи в оди масив
- symbols = symbols1.concat(symbols2,symbols3);
- // Створюємо масив у якому номер елементу буде відповідати його значенню(необхідно для подальшої умови)
- for (let i = 0; i < symbols.length; i++) {
- allsymbols[symbols[i]] = symbols[i];
- }
- for ( let i = 0; i < a.length; i++ ) { // перетворюємо рядок у масив у якому буде код ASCII кожного елемента рядка(для зручності)
- line[n] = a.charCodeAt(i); // значення і та n збігаються. краще змінні, що використовуються у одному місці в коді,
- // створювати якомога ближче до цього місця
- n++;
- }
- line.push(32); // добавляємо в кінець масиву будь-який код ASCII символу(необхідно для умови)
- for ( let i = 0; i < line.length; i++ ) {
- for ( let j = 0; j < symbols.length; j++ ) {
- if ( line[i] !== allsymbols[line[i]] && line[i + 1] === symbols[j] ) { //алгоритм умови такий - якщо після букви йде символ то це слово // слід зауважити, що для останнього елементу і + 1 вийде за межі, js це дозволяє, а от java ні.)
- k++; // така назва змінної не допомагає читати та писати код, краще wordCount
- }
- }
- }
- console.log("Кількість слів у рядку - " + k);
- /*основний блок коду, який збільшує лічильник слів:*/
- for ( let j = 0; j < symbols.length; j++ ) {
- if ( line[i] !== allsymbols[line[i]] && line[i+1] === symbols[j] ) { //алгоритм умови такий - якщо після букви йде символ то це слово
- k++; // така назва змінної не допомагає читати та писати код, краще wordCount
- }
- }
- /* якщо записати псевдокодом то маємо*/
- біжимо (індексом і) по всіх символах строки (точніше ascii кодах цих символів складених до масиву line)
- якщо поточний символ === не роздільник ТА наступний символ === роздільник
- тоді слівЛічильник++
- /*
- 1. для того щоб збагнути чи роздільник поточний символ ми користуємось "хитрим" масивом, де у всіх роздільників індекс дорівнює значенню line[i] !== allsymbols[line[i]]. Тобто по суті якщо значення елементу дорівнює індексу то це роздільник:
- if (line[i] === allsymbols[line[i]] ) {console.log(line[i] + ' it is delimiter');}
- 2. для того щоб збагнути чи роздільник наступний символ перебираємо у вкладеному циклі всі роздільники масиву symbols
- а чи можемо використати "хитрий" прийомчик і для наступного символу?
- Нормально прокачалися з масивами, цікаво придумали з масивом де індекс дорівнює самому елементові, такий прийомчик ще знадобиться.
- За для розширення досвіду раджу почитати декілька останніх кодів рішення цієї ж задачи інших людей курса, а також рев'ю до
- них.
- https://codeshare.io/2KKPqP - тут ще одне.
- Також раджу спробувати використати функції (які є слідуючою темою для освоювання).
- */
- /*
- Факультативно для шанувальників масивів бажаючих перейти у інші виміри:)
- я не кажу, що рішення з масивами роздільників symbols саме доречне, як і його назва що варто змінити , але якщо вже братися за подібне, то можна трохи оптимізувати так:
- створити масив ренжів
- let delimiterASCIIRanges = [[32, 64], [91, 96],[123, 127]]; /* це масив масивів, або двомірний масив, звертатися до
- його елементів треба так: спочатку вказуємо індекс підмасиву, а потім індекс елементу в цьому підмасиві.
- Двовимірні масиви називають матріцами, бо можна уявити їх так:
- let matrixArray = [
- [3, 2, 6, 4, 15, 6],
- [0, 9, 1, 42, 9], // так, підмасиви можуть бути різної довжини
- [12, 37, 1, 27]
- ];
- тоді звернення до елементу буде типу [по вертикалі][по горизонталі], тобто matrixArray[1][3] === 42
- длина масиву matrixArray.length === 3 (3 підмасива), а от длина підмасиву matrix.Array[2].length === 4 (елементи у другому підмассиві)
- масиви можуть мати скільки заводно вимірів, тобто у трохвимірному масиві адресація буде така [][][], бо то масив масивів масивів, і т.д.)
- Ну і ще, слова підмасиви не існує, або ж воно не часто зустрічається, і є тут лише для простоти розуміння.)_
- */
- // далі можете поміркувати самостійно як створити delimitersASCIICodes (ваш symbols) з delimiterASCIIRanges = [[32, 64], [91, 96],[123, 127]];
- // бо далі код
- for (let rangeIndex = 0, i = 0; rangeIndex < delimiterASCIIRanges; rangeIndex++) {
- for (let code = delimiterASCIIRanges[rangeIndex][0]; code <= delimiterASCIIRanges[rangeIndex][1]; code++) {
- delimitersASCIICodes[i++] = code;
- }
- /*можна позбутися індексу і, а просто пушити до delimitersASCIICodes: */
- delimitersASCIICodes.push(code); // теж саме delimitersASCIICodes[i++] = code;
- // Гарного коду.
Advertisement
Add Comment
Please, Sign In to add comment