Ваша задача — написать несколько функций, являющихся решением подзадач. Описания подзадач, а также инструкции по запуску тестов и отправке решений находятся ниже.
Ваша задача — сосчитать котов, спрятавшихся на заднем дворе (представленном в виде двумерного массива, Array
). Коты прячутся хорошо, но их ушки ("^^"
) видны очень хорошо. Ваша задача — реализовать функцию countCats(backyard)
, которая сосчитает котов. Удачи!
Число найденных котов должно иметь тип number
. Если коты не найдены, функция должна вернуть 0
.
Например:
countCats([ [0, 1, '^^'], [0, '^^', 2], ['^^', 1, 2] ]) => 3
Напишите ваш код в src/count-cats.js
.
Для определения возраста археологических находок широко применяется радиоизотопный анализ. Один из его видов — радиоуглеродный анализ.
Примерный возраст образца рассчитывается при помощи измерения соотношения между современной активностью изотопа С14 и активностью этого же изотопа в образце.
О расчетах
Вы можете использовать формулу из статьи по ссылке выше. 0.693 — это приблизительное значение натурального логарифма двойки.Ваша задача — реализовать функцию dateSample(sampleActivity)
, которая рассчитывает примерный возраст образца (в годах). Пожалуйста, используйте данные MODERN_ACTIVITY
и HALF_LIFE_PERIOD
.
Параметр функции sampleActivity
имеет тип string
. Рассчитаный возраст образца должен иметь тип number
. Возраст должен быть целочисленным. Возраст должен округлен вверх (при получении целого числа). В случае неправильного типа входного параметра или несоответствующем значении активности, или отсутствии аргумента функция должна вернуть false
.
Например:
dateSample('1') => 22387
(либо 22392
, в зависимости от используемой формулы)
dateSample('WOOT!') => false
Напишите ваш код в src/carbon-dating.js
.
Представьте себе, что вы с вашими друзьями решаете создать команду мечты. Эта команда должна иметь крутое секретное название, в котором зашифрована информация о ней. Например, это могут быть первые буквы имен ее членов в верхнем регистре, отсортированные по алфавиту.
Ваша задача — реализовать функцию createDreamTeam(members)
, которая возвращает имя только что созданной команды (string
), основанной на именах ее членов (array
). Удачи!
Имена членов команды должны быть типа string
. Значения другого типа должны быть проигнорированы. В случае неправильного типа аргумента members
функция должна вернуть false
.
NB! Имя члена команды может содержать пробелы.
Например:
createDreamTeam(['Matt', 'Ann', 'Dmitry', 'Max'])
=> 'ADMM'
createDreamTeam(['Olivia', 1111, 'Lily', 'Oscar', true, null])
=> 'LOO'
Напишите ваш код в src/dream-team.js
.
Ваша задача — реализовать функцию getSeason(date)
, которая принимает объект Date
и возвращает соответствующую ему пору года. Пора года должна быть типа string
.
Названия пор года в англиийском языке
В английском поры года имеют следующие наименования: весна — spring, лето — summer, осень — autumn (fall), зима — winter.Если аргумент date
не был передан, функция должна вернуть строку 'Unable to determine the time of year!'
Если аргумент date
некорректный, функция должна выбросить ошибку (Error
).
Тссс! Среди аргументов, которые попадают в эту функцию, затесался вражеский агент.
Он руководствуется знаменитой поговоркой: "Если это выглядит как утка, плавает как утка, и крякает как утка, тогда это, скорее всего, утка (и неважно, что это на самом деле)". Он искусно маскируется под настоящую дату (date
), но умелый javascript-разработчик может поймать его и выбросить ошибку как раз вовремя!
Например:
const springDate = new Date(2020, 02, 31)
getSeason(springDate) => 'spring'
Напишите ваш код в src/what-season.js
.
Ханойская башня — знаменитая математическая головоломка 18 столетия. Она состоит из трех стержней и некоторого числа дисков разных размеров, которые могут быть надеты на стержень. Головоломка начинается с того, что диски расположены друг на друге, причем наименьший расположен сверху. Диски образуют конус.
Цель головоломки — переместить всю стопку на другой стержень, следуя этим простым правилам:
- перемещать можно только один диск за раз
- можно брать только верхний диск с одной из стопок и помещать на верхушку другой стопки или на пустой стержень
- диск большего размера нельзя класть на диск меньшего размера
Ваша задача значительно легче, чем придумывать алгоритм, решающий эту задачу :)
Реализуйте функцию calculateHanoi
, которая принимает параметры diskNumber
и turnsSpeed
. diskNumber
— это число дисков, а turnsSpeed
— скорость перемещения дисков (в ходах в час). Оба параметра являются числами (тип number
)
Функция calculateHanoi
возвращает объект с 2 свойствами:
turns
(минимальное число (типnumber
) ходов, необходимое для решения головоломки)seconds
(минимальное число (типnumber
) секунд, необходимое для решения головоломки при заданной скорости; должно быть целым числом, полученным в результате округления результата расчетов в меньшую (floor) сторону)
Вам не нужно валидировать входные параметры.
Например:
calculateHanoi(9, 4308) => { turns: 511, seconds: 427 }
Напишите ваш код в src/hanoi-tower.js
.
Ваша задача — реализовать функцию transform(arr)
, которая принимает массив (тип array
) и возвращает преобразованный массив, основываясь на управляющих последовательностях, которые содержит arr
. Управляющие последовательности — это определенные строковые элементы вышеупомянутого массива:
--discard-next
исключает следующий за ней элемент исходного массива из преобразованного массива.--discard-prev
исключает предшествующий ей элемент исходного массива из преобразованного массива.--double-next
удваивает следующий за ней элемент исходного массива в преобразованном массиве.--double-prev
удваивает предшествующий ей элемент исходного массива в преобразованном массиве.
Например:
transform([1, 2, 3, '--double-next', 4, 5])
=> [1, 2, 3, 4, 4, 5]
transform([1, 2, 3, '--discard-prev', 4, 5])
=> [1, 2, 4, 5]
Функция не должна изменять исходный массив. Управляющие последовательности применяются последовательно, слева направо к элементам из исходного массива. Управляющие последовательности не попадают в преобразованный массив. Управляющие последовательности в исходном массиве не встречаются подряд (не следуют одна за другой). Если около управляющей последовательности нет элемента, к которому она может быть применена в исходном массиве, либо он был удален в процессе преобразования массива, она не делает ничего. Функция должна выбросить ошибку, если arr
не является массивом.
Напишите свой код в src/transform-array.js
.
Давайте попрактикуемся в чейнинге!
Ваша задача — реализовать объект chainMaker
, который будет создавать цепочки. Оконченная цепочка это строка (тип string
) и выглядит следующим образом: '( value1 )~~( value2 )~~( value3 )'
.
chainMaker
имееет несколько методов для создания цепочек и их модификации:
getLength
возвращает текущую длину цепи в виде числа;addLink(value)
добавляет звено, содержащее строковое представлениеvalue
к цепочке;removeLink(position)
удаляет звено цепи, находящееся в заданном положении;reverseChain
разворачивает цепь задом наперед;finishChain
завершает цепь и возвращает ее.
Методы addLink
, reverseChain
и removeLink
чейнятся, в то время как остальные – нет. Если addLink
вызван без аргументов, он добавляет пустое звено ('( )'
) в цепочку. Если removeLink
принимает некорректную позицию (например, не являющуюся числом, или дробное число, или ссылающуюся на несуществующее звено), он должен выбросить ошибку. После вызова метода finishChain
существующая на данный момент цепь должна быть удалена, как и в случае, если была выброшена ошибка.
Например:
chainMaker.addLink(1).addLink(2).addLink(3).finishChain()
=> '( 1 )~~( 2 )~~( 3 )'
chainMaker.addLink(1).addLink(2).removeLink(1).addLink(3).finishChain()
=> '( 2 )~~( 3 )'
chainMaker.addLink(1).addLink(2).reverseChain().addLink(3).finishChain()
=> '( 2 )~~( 1 )~~( 3 )'
Напишите ваш код в src/simple-chain.js
.
Ваша задача — реализовать класс DepthCalculator
с методом calculateDepth
, который принимает массив и возвращает его глубину.
Метод calculateDepth
должен проходить полученный массив рекурсивно. Глубина плоского массива — 1. Метод должен корректно работать с массивами, не содержащими элементов или содержащими пустые массивы.
Например:
const depthCalc = new DepthCalculator();
depthCalc.calculateDepth([1, 2, 3, 4, 5])
=> 1
depthCalc.calculateDepth([1, 2, 3, [4, 5]])
=> 2
depthCalc.calculateDepth([[[]]])
=> 3
Напишите ваш код в src/recursive-depth.js
.
Ваша задача — реализовать функцию repeater(str, options)
.
Эта функция возвращает повторяющуюся строку, основываясь на заданных параметрах:
str
это строка, которая будет повторенаoptions
это объект опций, который содержит следующие свойства:
repeatTimes
устанавливает число повторенийstr
separator
это строка, разделяющая повторенияstr
addition
это дополнительная строка, которая будет добавлена после каждого повторенияstr
additionRepeatTimes
устанавливает число повторенийaddition
additionSeparator
это строка, разделяющая повторенияaddition
Параметры str
и addition
по умолчанию являются строками. В случае, если они другого типа, он должны быть преобразованы к строке.
Параметры separator
и additionSeparator
являются строками.
repeatTimes
и additionRepeatTimes
являются целыми числами (в случае отсутствия любого из них соответствующая строка не повторяется).
Единственный обязательный параметр — это str
, остальные могут не быть переданы.
Значение separator
по умолчанию это '+'
. Значение additionSeparator
по умолчанию это '|'
.
Например: repeater('STRING', { repeatTimes: 3, separator: '**', addition: 'PLUS', additionRepeatTimes: 3, additionSeparator: '00' })
=> 'STRINGPLUS00PLUS00PLUS**STRINGPLUS00PLUS00PLUS**STRINGPLUS00PLUS00PLUS'
Напишите свой код в src/extended-repeater.js
.
Криптография — это здорово! Давайте попробуем наладить производство шифровальных машин. Наши машины будут использовать один из методов шифрования, которые легки для понимания, но не могут быть разгаданы посредством простого криптоанализа — шифр Виженера.
Наша машина будет иметь 2 модификации: прямая и обратная (тип машины определяется в момент создания). Прямая машина просто шифрует и дешифрует строку, переданную в нее, а обратная машина возвращает перевернутую задом наперед строку после шифрования и дешифрования.
Ваша задача — реализовать класс VigenereCipheringMachine
. constructor
этого класса принимает true
(или ничего), чтобы создать прямую машину и false
, чтобы создать обратную машину.
Каждый экземляр VigenereCipheringMachine
должен иметь 2 метода: encrypt
и decrypt
.
Метод encrypt
принимает 2 параметра: message
(строка, чтобы ее зашифровать) и key
(строку-кодовое слово).
Метод decrypt
принимает 2 параметра: message
(строка, чтобы ее расшифровать) и key
(строку-кодовое слово)
Эти параметры для обоих методов являются обязательными. Если хотя бы один из них не был передан, должна быть выброшена ошибка. Машины шифруют и дешифруют только символы латинского алфавита (другие символы не изменяются). Строка, возвращаемая этими методами, должна иметь верхний регистр.
Вам не нужно валидировать значение, переданное в contructor
и в методы encrypt
и decrypt
(за исключением выбрасывания ошибки при отсутствии аргумента для для этих методов).
Например:
const directMachine = new VigenereCipheringMachine();
const reverseMachine = new VigenereCipheringMachine(false);
directMachine.encrypt('attack at dawn!', 'alphonse') => 'AEIHQX SX DLLU!'
directMachine.decrypt('AEIHQX SX DLLU!', 'alphonse') => 'ATTACK AT DAWN!'
reverseMachine.encrypt('attack at dawn!', 'alphonse') => '!ULLD XS XQHIEA'
reverseMachine.decrypt('AEIHQX SX DLLU!', 'alphonse') => '!NWAD TA KCATTA'
Напишите свой код в src/vigenere-cipher.js
.
- Установите Node.js
- Сделайте форк этого репозитория: https://github.com/AlreadyBored/basic-js
- Склонируйте себе этот репозиторий: https://github.com/<%your_github_username%>/basic-js/
- Перейдите в папку
basic-js
- Вбейте в командную строку
npm install
для установки зависимостей - Выполните
npm run test
в командой строке. - Вы увидите число ожидающих (pending), проходящих и падающих тестов. 100% проходящие тесты сооветствуют 100 очкам в скор.
Отправка в rs app
- Откройте rs app и залогиньтесь
- Перейдите на страницу отправки задания
- Выберите задание (BasicJS)
- Нажмите кнопку "Submit"
- Рекомендуется использовать 12 версию nodejs (или меньше). Если вы используете фичи, которые не поддерживаются 12 версией, могут быть проблемы с автопроверкой задания.
- Перед отправкой результата убедитесь, что каждый ваш тест проходит не более чем за 30 секунд.
& Thanks mikhama for assistance!