// ------------------------------------1------------------------------------------
// Создайте объект calculator с методами:
// read() запрашивает prompt для двух значений и сохраняет их как свойства объекта x, y
// sum() возвращает сумму этих двух значений
// multi() возвращает произведение этих двух значений
// diff() возвращает разницу
// div() возвращает частное
// оценочное время 60  мин 
// Потраченное время 15 мин
// var calculator = {
// 	x: '',
// 	y: '',
// 	getread: function() {
// 		return this.x = +prompt('Enter x'), this.y = +prompt('Enter y');
// 	},
// 	getsum: function() {
// 		return this.x + this.y;
// 	},
// 	getmulti: function() {
// 		return this.x * this.y;
// 	},
// 	getdiff: function() {
// 		return this.x - this.y;
// 	},
// 	getdiv: function() {
// 		return this.x / this.y;
// 	}
// };
// calculator.getread();
// alert( calculator.getsum() );
// alert( calculator.getmulti() );
// alert( calculator.getdiff() );
// alert( calculator.getdiv() );

// ------------------------------------2------------------------------------------
// Создайте объект coffeeMachine со свойством message: ‘Your coffee is ready!’ 
// и методом start(), при вызове которого – coffeeMachine.start() – 
// через 3 секунды появляется окно с сообщением, записанным в свойстве объекта message.
// оценочное время 60  мин 
// Потраченное время 15 мин

// var coffeeMachine = {
// 	mss: 'Your coffee is ready!',
// 	getstart: function() {
// 		return setTimeout(function(){
// 			alert(this.mss);
// 		}.bind(this), 3000)
// 	}
// };
// coffeeMachine.getstart();

// ------------------------------------3------------------------------------------
// Создайте объект counter с методами увеличения, уменьшения значения счетчика 
// и методом возврата текущего значения. Используйте концепцию chaining для создания цепочки вызовов.
// оценочное время 60  мин 
// Потраченное время 10 мин
// var counter = {
// 	count: 0,
// 	getplus: function() {
// 		this.count++;
// 		return this;
// 	},
// 	getminus: function() {
// 		this.count--;
// 		return this;
// 	}
// };
// counter.getplus().getplus().getplus().getplus().getplus().getminus().getminus();
// alert(counter.count);

// ------------------------------------4------------------------------------------
// Создайте объект с данными: x, y и методами: getSum, getDiff, getMulti, getDiv. 
// Методы объекта ничего не реализуют, а только выводят в alert сообщения вида ‘1 + 1 = 2’ или ‘1 / 0 = Infinity’. 
// Для расчетов все методы используют функционал ранее созданного калькулятора.
// оценочное время 60  мин 
// Потраченное время 300 мин
// var calculator = {
// 	x: '',
// 	y: '',
// 	getread: function() {
// 		return this.x = +prompt('Enter x'), this.y = +prompt('Enter y');
// 	},
// 	getsum: function() {
// 		return this.x + this.y;
// 	},
// 	getmulti: function() {
// 		return this.x * this.y;
// 	},
// 	getdiff: function() {
// 		return this.x - this.y;
// 	},
// 	getdiv: function() {
// 		return this.x / this.y;
// 	}
// };
// var objdata = {
// 	getsum: function(a, b) {
// 		calculator.x = a,
// 		calculator.y = b,
// 		alert( a + ' + ' + b +' = ' + calculator.getsum());
// 	},
// 	getmulti: function(a, b) {
// 		calculator.x = a,
// 		calculator.y = b,
// 		alert(a + ' * ' + b +' = ' + calculator.getmulti());
// 	},
// 	getdiff: function(a, b) {
// 		calculator.x = a,
// 		calculator.y = b,
// 		alert(a + ' - ' + b +' = ' + calculator.getdiff());
// 	},
// 	getdiv: function(a, b) {
// 		calculator.x = a,
// 		calculator.y = b,
// 		alert(a + ' / ' + b +' = ' + calculator.getdiv());
// 	}
// };
// objdata.getsum(1, 3);
// objdata.getdiv(3, 5);

// ------------------------------------5------------------------------------------
// Есть следующий код: 
// Допишите код, чтобы в консоли браузера появились строки, которые написаны в комментариях:
// format.call(/* Ваш код */); // Ukraine
// format.apply(/* Ваш код */); // [Ukraine]
// format.call(/* Ваш код */); // Kyiv
// format.apply(/* Ваш код */); // Kyiv
// format.apply(/* Ваш код */); // undefined
// оценочное время 60  мин 
// Потраченное время 30 мин
// var country = {
//     name: 'Ukraine',
//     language: 'ukrainian',
//     capital: {
//         name: 'Kyiv',
//         population: 2907817,
//         area: 847.66
//     }
// };
// function format(start, end) {
//     console.log(start + this.name + end);
// }
// format.call(country, ' ', ' '); // Ukraine
// format.apply(country,['[', ']']); // [Ukraine]
// format.call(country.capital, ' ', ' '); // Kyiv
// format.apply(country.capital,[' ', ' ']); // Kyiv
// format.apply(undefined, ['undefined', ' ']); // undefined

// ------------------------------------6------------------------------------------
// Создайте объект user с полем name. Создайте функцию format с параметрами start и end:
// Привяжите функцию format() к объекту user таким образом, чтобы ее вызов возвращал отформатированное имя пользователя
// userFormat('<<<', '>>>'); // <<<John>>>
// Реализуйте 2 версии текущего задания, используя:
// 1. Анонимную функцию;
// 2. Метод bind().
// оценочное время 120 мин 
// Потраченное время 30 мин
// var user = {
// 	name: 'Tony',
// 	format: function(start, end) {
//     console.log(start + this.name + end);
// }
// };
// user.format('<<<', '>>>');

// var nwf = user.format.bind(user, '<<<', '>>>');
// nwf();

// var nwaf = (function(){
// 	return user.format.call(user, '<<<','>>>');
// })()

// ------------------------------------7------------------------------------------
// Напишите функцию concat, которая соединяет две строки, разделенные каким-то символом: 
// разделитель и строки передаются в параметрах функции. Используя карринг, создайте новую функцию hello, 
// которая которая выводит приветствие тому, кто передан в ее параметре:
// 			hello('World'); // Hello World
// 			hello('John'); // Hello John
// оценочное время 30 мин 
// Потраченное время 10 мин
// function concat(firstV, delimiter, secondV) {
// 	return console.log(firstV + delimiter + secondV);
// }
// var hello = concat.bind(null, 'Hello', ' ');
// hello('World');
// hello('John');

// ------------------------------------8------------------------------------------
// Создайте объект со свойством delay и методами appendTo и appendText. 
// Метод appendTo с помощью jQuery добавляет абзац в контейнер, переданный в параметре метода. 
// Метод appendText может дописывает текст в добавленный элемент. Создайте массив строк и запустите цикл по этому массиву. 
// С периодичностью, определенной в свойстве delay, в текст созданного html-элемента добавляется соответствующий 
// по порядку элемент массива. Учтите, что для доступа к вашему элементу не должен производиться поиск по DOM-дереву.
// оценочное время 120 мин 
// Потраченное время 240 мин 
// var arr = [ 'Д','ь','я','в','о','л',' ','н','е',' ','с','п','и','т','.',' ','С',' ','к','е','м',' ','п','о','п','а','л','о','.'];
// var obj = {
// 	delay: 50,
// 	container: function(tag){
// 		return this.tag = tag;
// 	},
// 	appendTo: function() {
// 		$('<'+ this.tag + '>').css({
// 			margin: '0 auto',
// 			background: '#000',
// 			color: '#fff',
// 			'text-align': 'center'
// 		}).appendTo('body');
// 	},
// 	appendText: function(val){
// 		$('<i>').css('font-size', '15px').text(val).appendTo(this.tag);
// 	}
// };
// obj.container('div');
// obj.appendTo();
// for (i=0; i < arr.length; i++) {
// 	(function() {
// 		var j =i;
// 		setTimeout(function() {
// 			obj.appendText(arr[j]);
// 		}, i * obj.delay);
// 	})();
// }    

// ------------------------------------рекурсия 1------------------------------------------
// Напишите функцию, которая возвращает куб переданного числа, аналог Math.pow(x, 3) 
// – a) используя цикл b) используя рекурсию:
// console.log( cube(2) ); // 8
// оценочное время 240 мин 
// Потраченное время 30 мин
// function cube(x) {
// 	for (var i=0, result=1; i<3 ; i++) {
// 		result = result * x;
// 	}
// 	return result;
// }
// console.log( cube(2) ); // 8

// function rcube(x, count) {
//  	if (count != 1) {
//  		return x * rcube(x, count-1);
//  	} else 
//  		return x;
// }
// console.log( rcube(2, 3) ); // 8

// ------------------------------------рекурсия 2------------------------------------------
// Придумайте алгоритм расчета суммы всех фактических параметров функции с использованием только рекурсии:
// console.log( sum(1, 2, 3, 4, 5) ); // 15
// оценочное время 240 мин 
// Потраченное время 30 мин
function sum() {
	var arr=arguments[arguments.length-1];
	arguments.length--;
	if (arguments.length > 0) 
		arr += sum.apply(null, arguments);
	return arr;
}
console.log( sum(1, 2, 3, 4, 5) ); // 15