{"id":17203578,"url":"https://github.com/alreadybored/basic-js","last_synced_at":"2025-05-12T13:21:47.616Z","repository":{"id":39651406,"uuid":"236548377","full_name":"AlreadyBored/basic-js","owner":"AlreadyBored","description":null,"archived":false,"fork":false,"pushed_at":"2025-04-19T16:38:26.000Z","size":680,"stargazers_count":207,"open_issues_count":0,"forks_count":9794,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-23T16:03:57.351Z","etag":null,"topics":["javascript","learning","tasks"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AlreadyBored.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-01-27T17:23:53.000Z","updated_at":"2025-04-19T16:38:31.000Z","dependencies_parsed_at":"2025-01-08T17:08:05.221Z","dependency_job_id":"4024d616-3059-4e27-bca7-0b5ff50e2b63","html_url":"https://github.com/AlreadyBored/basic-js","commit_stats":{"total_commits":104,"total_committers":16,"mean_commits":6.5,"dds":"0.29807692307692313","last_synced_commit":"735a2ddd2827adceba45cb587b9a072751314e5d"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlreadyBored%2Fbasic-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlreadyBored%2Fbasic-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlreadyBored%2Fbasic-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlreadyBored%2Fbasic-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlreadyBored","download_url":"https://codeload.github.com/AlreadyBored/basic-js/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253745198,"owners_count":21957319,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","learning","tasks"],"created_at":"2024-10-15T02:18:27.729Z","updated_at":"2025-05-12T13:21:47.590Z","avatar_url":"https://github.com/AlreadyBored.png","language":"JavaScript","readme":"# BasicJS\n\n⚠️ DO NOT SUBMIT PULL REQUESTS TO THIS REPO ⚠️\n\n---\n\n#### Prerequisites\n\n1. Install [Node.js](https://nodejs.org/en/download/)\n2. Fork this repository: https://github.com/AlreadyBored/basic-js\n3. Clone your newly created repo: https://github.com/\u003c%your_github_username%\u003e/basic-js/\n4. Go to folder `basic-js`\n5. To install all dependencies use [`npm install`](https://docs.npmjs.com/cli/install)\n6. Run `npm run test` in command line.\n7. You will see the number of pending, passing and failing tests. 100% of passing tests is equal to max score for the task\n\n---\n\n#### Troubleshooting\n\n- If you catch error like [this](https://user-images.githubusercontent.com/17920285/158375305-f54d87fa-6f42-402f-af25-10b233d98cf9.png) you can try to make `npm install -g node-gyp`\n\n---\n\n#### Submit to [rs app](https://app.rs.school)\n\n1. Open [rs app](https://app.rs.school) and login\n2. Go to submit task page\n3. Select your task (BasicJS)\n4. Press the submit button and enjoy\n\n---\n\n#### Notes\n\n1. We recommend you to use Node.js of version 16.x.x LTS. If you use any of features, that does not supported by Node.js v16, there may be problems with task submit.\n2. Please, be sure that each of your tests is limited to 30 sec.\n\n---\n\n## General task description\n\nYour task is to write several functions that are the solution to the subtasks. Subtasks descriptions, as well as instructions on how to run tests and submit solutions are below.\n\n---\n\n### **Count cats!**\n\n![Count cats!](https://i.imgur.com/fK1LS0B.png)  \nYour task is to count the cats hidden in the backyard (presented by two-dimensional `Array`). Cats hide well, but their **ears** (`\"^^\"`) are clearly visible. Your task is to implement the `countCats(backyard)` function that will count cats. Good luck!\n\nNumber of cats found should be `number`. If no cats found, function should return `0`.\n\nFor example:\n\n`countCats([\n    [0, 1, '^^'],\n    [0, '^^', 2],\n    ['^^', 1, 2]\n  ])` =\u003e `3`\n\nWrite your code in `src/count-cats.js`.\n\n---\n\n### **Carbon dating**\n\n![Carbon dating](https://earthhow.com/wp-content/uploads/2018/12/Carbon-Dating-678x378.png)  \nTo determine the age of archaeological finds, **radioisotope dating** is widely used. One of its types is **radiocarbon dating**.\n\nThe approximate age of the sample is calculated by measuring the **ratio** of the **modern** activity of the C14 isotope to the activity of the same isotope in the **sample**.\n\n[Read about method](\u003chttps://chem.libretexts.org/Bookshelves/Physical_and_Theoretical_Chemistry_Textbook_Maps/Supplemental_Modules_(Physical_and_Theoretical_Chemistry)/Nuclear_Chemistry/Nuclear_Kinetics/Half-Lives_and_Radioactive_Decay_Kinetics#section_2\u003e)\n\n[Reserved link](https://web.archive.org/web/20230522040038/https://chem.libretexts.org/Bookshelves/Physical_and_Theoretical_Chemistry_Textbook_Maps/Supplemental_Modules_%28Physical_and_Theoretical_Chemistry%29/Nuclear_Chemistry/Nuclear_Kinetics/Half-Lives_and_Radioactive_Decay_Kinetics#section_2)\n\n---\n\n\u003cdetails\u003e\n\n  \u003csummary\u003eAbout calculations\u003c/summary\u003e\n  You can use the formula from the article at the link above. 0.693 is an approximation of the natural logarithm of two.\n\n\u003c/details\u003e\n\n---\n\nYour task is to implement the function `dateSample(sampleActivity)` that calculates sample approximate age (in years). Please use given `MODERN_ACTIVITY` and `HALF_LIFE_PERIOD`.\n\nFunction parameter `sampleActivity` is a `string`. Calculated sample age must be `number`.\n\nAge must be **integer**. Age must be **rounded up** (ceiling). In case of wrong input parameter **type** or **inadequate** activity value or **absence** of argument function must return `false`.\n\nFor example:\n\n`dateSample('1')` =\u003e `22387` (or `22392` depending on formula used)\n\n`dateSample('WOOT!')` =\u003e `false`\n\nWrite your code in `src/carbon-dating.js`.\n\n---\n\n### **Dream team**\n\n![Dream team](https://i0.wp.com/www.comicsbeat.com/wp-content/uploads/2021/05/power-rangers.jpg?fit=1420,945\u0026ssl=1)  \nImagine you and your friends decide to create a **dream team**. This team should have a cool secret name that contains encrypted information about it. For example, these may be the **first letters** of the names of its members in **upper case** **sorted alphabetically**.\nYour task is to implement the `createDreamTeam(members)` function that returns name of a newly made team (`string`) based on the names of its members (`Array`). Good luck!\n\nNames of the members should be `strings`. Values with other **type** should be **ignored**. In case of wrong `members` **type** function must return `false`.\n\nNB! Team member name may contain **whitespaces**.\n\nFor example:\n\n`createDreamTeam(['Matt', 'Ann', 'Dmitry', 'Max'])` =\u003e `'ADMM'`\n\n`createDreamTeam(['Olivia', 1111, 'Lily', 'Oscar', true, null])` =\u003e `'LOO'`\n\nWrite your code in `src/dream-team.js`.\n\n---\n\n### **What season?**\n\n![What season](https://images.twinkl.co.uk/tw1n/image/private/t_630_eco/image_repo/83/d2/T-T-224-four-seasons-posters-a4_ver_2.avif)  \nYour task is to implement the function `getSeason(date)` that accepts `Date` object and returns the time of the year that matches it.\nTime of the year must be `string`.\n\n---\n\n\u003cdetails\u003e\n\n\u003csummary\u003eSeasons in English\u003c/summary\u003e\nThe names of the seasons in English are: spring, summer, autumn (fall), winter.\n\n\u003c/details\u003e\n\n---\n\nIf the `date` argument was not passed, the function must return the `string` `'Unable to determine the time of year!'`. If the `date` argument is **invalid**, the function must throw an `Error` with message `Invalid date!`.\n\nShh! An enemy scout has lurked among the arguments that come into this function.\n\n![Disguised](https://www.famousbirthdays.com/faces/disguised-toast-image.jpg)  \nHe is guided by the famous proverb: “If it looks like a **duck**, swims like a **duck** and quacks like a **duck**, then it probably is a **duck** (who cares what it **really** is)”. He is **expertly disguised** as a real date, but a clever javascript developer can catch him and `throw` an `Error` with message `Invalid date!` just in time!\n\nFor example:\n\n`const springDate = new Date(2020, 02, 31)`\n\n`getSeason(springDate)` =\u003e `'spring'`\n\nWrite your code in `src/what-season.js`.\n\n---\n\n### **Tower of Hanoi**\n\n![Tower of hanoi visualisation](https://ioecapsule.com/wp-content/uploads/2019/08/tower_of_hanoi_3_disks.gif)  \n[Tower of Hanoi](https://www.britannica.com/topic/Tower-of-Hanoi) is famous mathematical puzzle of the 18th century.\nIt consists of three rods and a number of disks of different sizes, which can slide onto any rod. The puzzle starts with the disks in a neat stack in ascending order of size on one rod, the smallest at the top, thus making a conical shape.\n\nThe objective of the puzzle is to move the entire stack to another rod, obeying the following simple **rules**:\n\n- Only **one** disk can be moved at a time.\n- Each move consists of taking the **upper** disk from one of the stacks and placing it on **top** of another stack or on an empty rod.\n- No **larger** disk may be placed on top of a **smaller** disk.\n\nYour task is much easier than coming up with an algorithm that solves this puzzle :)\n\nImplement the function `calculateHanoi` that accepts `diskNumber` and `turnsSpeed` parameters. `diskNumber` is a number of **disks** and `turnsSpeed` is the speed of moving discs (in **turns** per **hour**).\nBoth parameters are `numbers`.\n\n`calculateHanoi` function returns an object with 2 properties:\n\n- `turns` (minimum `number` of turns to solve the puzzle)\n- `seconds` (minimum `number` of **seconds** to solve the puzzle at a given `turnsSpeed`, seconds must be an integer, obtained from **rounded down** (floor) calculation result)\n\nYou don't need to validate parameters.\n\nFor example:\n\n`calculateHanoi(9, 4308)` =\u003e `{ turns: 511, seconds: 427 }`\n\nWrite your code in `src/hanoi-tower.js`.\n\n---\n\n### **Transform array**\n\n![Transform array](https://www.capturehighered.com/wp-content/uploads/2019/02/The-Call-720x332.jpg)  \nYour task is to implement the function `transform(arr)` that takes an `array` and returns **transformed** array, based on the **control sequences** that `arr` contains.\n**Control sequences** are defined `string` elements of the mentioned `array`:\n\n- `--discard-next` excludes the next element of the array from the transformed array.\n- `--discard-prev` excludes the previous element of the array from the transformed array.\n- `--double-next` duplicates the next element of the array in the transformed array.\n- `--double-prev` duplicates the previous element of the array in the transformed array.\n\nFor example:\n\n`transform([1, 2, 3, '--double-next', 4, 5])` =\u003e `[1, 2, 3, 4, 4, 5]`\n\n`transform([1, 2, 3, '--discard-prev', 4, 5])` =\u003e `[1, 2, 4, 5]`\n\nThe function must not affect inital array. Control sequences are applied **from left to right** to initial array elements. Control sequences **do not fall** into the transformed array. Control sequences in initial array don't occur in a row. If there is **no element** next to the control sequence **to which it can be applied** in the initial array, or this element was previously deleted, **it does nothing**. The function should throw an `Error` with message `'arr' parameter must be an instance of the Array!` if the `arr` is not an `Array`.\n\nWrite your code in `src/transform-array.js`.\n\n---\n\n### **Chain maker**\n\n![Chaining](https://www.sdxcentral.com/cdn-cgi/image/w=748,h=374,fit=scale-down,f=auto,q=30/https://www.sdxcentral.com/wp-content/uploads/2018/08/Why-Problems-With-Service-Chaining-Are-Stalling-NFV.jpg)  \nLet's practice in [chaining](https://en.wikipedia.org/wiki/Method_chaining)!\n\nYour task is to create the object `chainMaker` that creates chains. The finished chain is a `string` and looks like this: `'( value1 )~~( value2 )~~( value3 )'`.\nThe `chainMaker` has several **methods** for creating chains and modifying them:\n\n- `getLength` returns the current chain length as a number;\n- `addLink(value)` adds a link containing a `string` representation of the `value` to the chain;\n- `removeLink(position)` removes a chain link in the specified position;\n- `reverseChain` reverses the chain;\n- `finishChain` ends the chain and `returns` it.\n\n`addLink`, `reverseChain` and `removeLink` methods are **chainable**, while the another ones are not. If `addLink` is called with no arguments, it adds an empty link (`'(  )'`) to the chain. If `removeLink` accepts **invalid** `position` (e.g. not a number, or a fractional number, or corresponding to a nonexistent link), it must throw an `Error` with message `You can't remove incorrect link!`. After calling the `finishChain` method, the existing chain must be deleted, as if an `Error` was thrown.\n\nFor example:\n\n`chainMaker.addLink(1).addLink(2).addLink(3).finishChain()` =\u003e `'( 1 )~~( 2 )~~( 3 )'`\n\n`chainMaker.addLink(1).addLink(2).removeLink(1).addLink(3).finishChain()` =\u003e `'( 2 )~~( 3 )'`\n\n`chainMaker.addLink(1).addLink(2).reverseChain().addLink(3).finishChain()` =\u003e `'( 2 )~~( 1 )~~( 3 )'`\n\nWrite your code in `src/simple-chain.js`.\n\n---\n\n### **Recursive depth calculator**\n\n![Go deeper](https://i.imgur.com/k7lADiM.jpg)  \nYour task is to implement the class `DepthCalculator` with method `calculateDepth` that takes an `array` and returns its depth.\n\n`calculateDepth` method must pass the given array **recursively**. Depth of a **flat** array is 1. Method must correctly work with `arrays` that contain no elements or contain empty `arrays`.\n\nFor example:\n\n`const depthCalc = new DepthCalculator();`\n\n`depthCalc.calculateDepth([1, 2, 3, 4, 5])` =\u003e `1`\n\n`depthCalc.calculateDepth([1, 2, 3, [4, 5]])` =\u003e `2`\n\n`depthCalc.calculateDepth([[[]]])` =\u003e `3`\n\nWrite your code in `src/recursive-depth.js`.\n\n---\n\n### **Extended repeater**\n\n![Extended repater](https://upload.wikimedia.org/wikipedia/commons/4/4b/Macaws_at_Jurong_Bird_Park_-Singapore-8.jpg)  \nYour task is to implement the function `repeater(str, options)`.\nThis function returns a repeating `string` based on the given parameters:\n\n- `str` is a `string` to repeat;\n- `options` is an `object` of options, that contains properties:\n  - `repeatTimes` sets the `number` of repetitions of the `str`;\n  - `separator` is a `string` separating repetitions of the `str`;\n  - `addition` is an additional `string` that will be added to each repetition of the `str`;\n  - `additionRepeatTimes` sets the `number` of repetitions of the `addition`;\n  - `additionSeparator` is a `string` separating repetitions of the `addition`.\n\nThe `str` and `addition` parameters are `strings` by default. In case when **type** of these parameters is different, they must be converted to a `string`.\n\n`separator` and `additionSeparator` parameters are `strings`.\n\n`repeatTimes` and `additionRepeatTimes` are integer `numbers` (in the absence of any of them, the corresponding string is not repeated).\n\nThe only indispensable parameter is `str`, any others may be not defined. `separator` default value is `'+'`. `additionSeparator` default value is `'|'`.\n\nFor example: `repeater('STRING', { repeatTimes: 3, separator: '**', addition: 'PLUS', additionRepeatTimes: 3, additionSeparator: '00' })` =\u003e `'STRINGPLUS00PLUS00PLUS**STRINGPLUS00PLUS00PLUS**STRINGPLUS00PLUS00PLUS'`\n\nWrite your code in `src/extended-repeater.js`.\n\n---\n\n### **Vigenere cipher**\n\n![Ciphering machine](https://live.staticflickr.com/1931/44960892745_471bee66bb_b.jpg)  \nCryptography is awesome! Let's try to organize production of encryption machines. Our machines will use one of the encryption methods that are easy to understand, but also not amenable to simple cryptanalysis - the [**Vigenere cipher**](https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher).\n\nOur machine will have 2 modifications: **direct** and **reverse** (the type of machine is determined at the moment of creation). The **direct** machine simply encodes and decodes the string that was transmitted to it, and the **reverse** machine returns an **inverted** string after encoding and decoding.\n\nYour task is to implement the class `VigenereCipheringMachine`. `constructor` of this `class` accepts `true` (**or nothing**) to create **direct** machine and `false` to create **reverse** machine.\nEach instance of `VigenereCipheringMachine` must have 2 methods: `encrypt` and `decrypt`.\n\n`encrypt` method accepts 2 parameters: `message` (`string` to encode) and `key` (`string`-keyword).\n\n`decrypt` method accepts 2 parameters: `encryptedMessage` (`string` to decode) and `key` (`string`-keyword).\n\nThese parameters for both methods are **mandatory**. If at least one of them has not been given, an `Error` with message `Incorrect arguments!` must be thrown. The text returned by these methods must be **uppercase**. Machines encrypt and decrypt **only latin alphabet** (all other symbols remain unchanged).\n\nYou don't need to validate value sent to `constructor` and to `encrypt` and `decrypt` methods (except throwing an `Error` on absence of argument for these methods).\n\nFor example:\n\n`const directMachine = new VigenereCipheringMachine();`\n\n`const reverseMachine = new VigenereCipheringMachine(false);`\n\n`directMachine.encrypt('attack at dawn!', 'alphonse')` =\u003e `'AEIHQX SX DLLU!'`\n\n`directMachine.decrypt('AEIHQX SX DLLU!', 'alphonse')` =\u003e `'ATTACK AT DAWN!'`\n\n`reverseMachine.encrypt('attack at dawn!', 'alphonse')` =\u003e `'!ULLD XS XQHIEA'`\n\n`reverseMachine.decrypt('AEIHQX SX DLLU!', 'alphonse')` =\u003e `'!NWAD TA KCATTA'`\n\nWrite your code in `src/vigenere-cipher.js`.\n\n---\n\n### **(ST) Common character count**\n\nYour task is to implement function that accepts two **strings** (`s1` and `s2`) and returns **number** of common characters between them.\n\nFor example:\n\n`getCommonCharacterCount('aabcc', 'adcaa')` =\u003e `3`\n\nWrite your code in `src/common-character-count.js`.\n\n---\n\n### **(ST) Delete digit**\n\nYour task is to implement function that accepts **integer number** (`n`) and returns maximal **number** you can obtain by deleting exactly one digit of the given number.\n\nFor example:\n\n`deleteDigit(152) =\u003e 52`\n\nWrite your code in `src/delete-digit.js`.\n\n---\n\n### **(ST) DNS stat**\n\nYour task is to implement function that accepts an **array** of domains (`domains`) and returns the **object** with the appearances of the DNS.\n\nFor example:\n\n`getDNSStats(['code.yandex.ru', 'music.yandex.ru', 'yandex.ru'])` =\u003e `{'.ru': 3, '.ru.yandex': 3, '.ru.yandex.code': 1,'.ru.yandex.music': 1}`\n\nWrite your code in `src/dns-stats.js`.\n\n---\n\n### **(ST) Encode line**\n\nYour task is to implement function that accepts **string** (`str`) and returns its encoded version.\n\nFor example:\n\n`encodeLine('aabbbc')` =\u003e `'2a3bc'`\n\nWrite your code in `src/encode-line.js`.\n\n---\n\n### **(ST) File names**\n\nThere's a list of file, since two files cannot have equal names, the one which comes later will have a suffix **(k)**, where k is the smallest **integer** such that the found name is not used yet.\nYour task is to implement function that accepts **array** of names (`names`) and returns an **array** of names that will be given to the files.\n\nFor example:\n\n`renameFiles([\"file\", \"file\", \"image\", \"file(1)\", \"file\"])` =\u003e `[\"file\", \"file(1)\", \"image\", \"file(1)(1)\", \"file(2)\"]`\n\nWrite your code in `src/file-names.js`.\n\n---\n\n### **(ST) Get email domain**\n\nYour task is to implement function that accepts email address (`email`) and returns it's **domain**.\n\nFor example:\n\n`getEmailDomain('prettyandsimple@example.com')` =\u003e `'example.com'`\n\nWrite your code in `src/get-email-domain.js`.\n\n---\n\n### **(ST) Is MAC-48 Address?**\n\nThe **MAC-48 address** is six groups of two hexadecimal digits (0 to 9 or A to F) separated by hyphens.\nYour task is to implement function that accepts **string** (`inputString`) and returns `true` if **string** is valid **MAC-48 address**.\n\nFor example:\n\n`isMAC48Address('00-1B-63-84-45-E6')` =\u003e `true`\n\nWrite your code in `src/mac-adress.js`.\n\n---\n\n### **(ST) Matrix elements sum**\n\nGiven **matrix**, a rectangular matrix of **integers**, just add up all the values that **don't appear below a \"0\"**.\n\nFor example:\n\n```\nconst matrix = [\n [0, 1, 1, 2],\n [0, 5, 0, 0],\n [2, 0, 3, 3]\n];\n\ngetMatrixElementsSum(matrix) =\u003e 9\n```\n\nWrite your code in `src/matrix-elements-sum.js`.\n\n---\n\n### **(ST) Minesweeper**\n\nIn the popular Minesweeper game you have a board with some mines and cells that have a **number** in it that indicates the total **number of mines** in the neighboring cells. Starting off with some arrangement of mines we want to create a Minesweeper game setup.\n\nFor example:\n\n```\nconst matrix = [\n [true, false, false],\n [false, true, false],\n [false, false, false]\n];\n\nminesweeper(matrix) =\u003e [\n [1, 2, 1],\n [2, 1, 1],\n [1, 1, 1]\n];\n```\n\nWrite your code in `src/minesweeper.js`.\n\n---\n\n### **(ST) Sort by height**\n\nGiven an array with heights, sort them except if the value is `-1`.\nYour task is to implement function that accepts **array** (`arr`) and returns it **sorted**\n\nFor example:\n\n`sortByHeight([-1, 150, 190, 170, -1, -1, 160, 180])` =\u003e `[-1, 150, 160, 170, -1, -1, 180, 190]`\n\nWrite your code in `src/sort-by-height.js`.\n\n---\n\n### **(ST) Sum digits**\n\nYour task is to implement function that accepts a **number** (`n`) and returns the **sum of its digits** until we get to a **one digit number**.\n\nFor example:\n\nFor 100, the result should be 1 (1 + 0 + 0 = 1)  \n`getSumOfDigits(100)` =\u003e `1`\n\nFor 91, the result should be 1 (9 + 1 = 10, 1 + 0 = 1)  \n`getSumOfDigits(91)` =\u003e `1`\n\nWrite your code in `src/sum-digits.js`.\n\n---\n\n© [AlreadyBored](https://github.com/alreadybored)\n\n\u0026 tasks:\n\n- Common character count\n- Delete digit\n- DNS stat\n- Encode line\n- File names\n- Get email domain\n- Is MAC-48 Adress?\n- Matrix elements sum\n- Minesweeper\n- Sort by height\n- Sum digits\n\nare integrated from [Short track 2021 repo](https://github.com/rkhaslarov/rs-school-short-track-2021)\n\n\u0026 Thanks [mikhama](https://github.com/mikhama) for assistance!\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falreadybored%2Fbasic-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falreadybored%2Fbasic-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falreadybored%2Fbasic-js/lists"}