<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
</body>
</html>
/*Класс Электрическая Сеть*/
function ElectricNetwork() {
this.listElements = [];
}
ElectricNetwork.timeOfDay = {};
ElectricNetwork.timeOfDay.AFTERNOON = 'afternoon';
ElectricNetwork.timeOfDay.NIGHT = 'night';
ElectricNetwork.prototype.makeBalance = function(timeOfDay) {
var balance = 0;
for (var i = 0; i < this.listElements.length; i++) {
balance += this.listElements[i].showPower(timeOfDay);
}
return balance;
};
ElectricNetwork.prototype.calcPrice = function(timeOfDay) {
var balance = this.makeBalance(timeOfDay),
powerlines = this.makeAndSortPowerLines(this.listElements),
price = 0;
if (balance < 0) {
for (var i = 0; balance !== 0 && i < powerlines.length; i++) {
price += Math.min(-balance, powerlines[i].bandwidth) * powerlines[i].price;
balance += Math.min(-balance, powerlines[i].bandwidth);
}
} else if (balance > 0) {
powerlines.reverse();
for (var i = 0; balance !== 0 && i < powerlines.length; i++) {
price += Math.min(balance, powerlines[i].bandwidth) * powerlines[i].price;
balance -= Math.min(balance, powerlines[i].bandwidth);
}
}
return price;
};
ElectricNetwork.prototype.addNewElement = function(element) {
if (!(element instanceof ElementsNetwork)) {
throw new Error("Нельзя добавить объект, ненаследующийся от ЭлементаСети!");
}
this.listElements.push(element);
};
ElectricNetwork.prototype.removeElement = function(element) {
for (var i = 0; i < this.listElements.length; i++) {
if (this.listElements[i] == element) {
this.listElements.splice(i, 1);
return;
}
}
throw new Error("Такого элемента нету в списке!");
};
ElectricNetwork.prototype.makeAndSortPowerLines = function(listElements) {
var powerlines = [];
for (var i = 0; i < listElements.length; i++) {
if (listElements[i] instanceof PowerLine) {
powerlines.push(listElements[i]);
}
}
function comparePrices(powerline1, powerline2) {
if (powerline1.price > powerline2.price) return 1;
if (powerline1.price < powerline2.price) return -1;
}
powerlines.sort(comparePrices);
return powerlines;
};
/*Класс Элемент Электрической Сети*/
function ElementsNetwork() {
}
ElementsNetwork.prototype.showPower = function(timeOfDay) {
if (this.power) {
return this.power[timeOfDay];
} else {
return 0;
}
};
/*Класс Электростанция*/
function Powerhouse(generatedPower) {
this.power = {};
this.power[ElectricNetwork.timeOfDay.AFTERNOON] = generatedPower / 2;
this.power[ElectricNetwork.timeOfDay.NIGHT] = generatedPower / 2 ;
}
var constructor = this.constructor;
Powerhouse.prototype = Object.create(ElementsNetwork.prototype);
Powerhouse.prototype.constructor = constructor;
/*Класс Солнечная Панель*/
function SolarPanel(generatedPower) {
this.power = {};
this.power[ElectricNetwork.timeOfDay.AFTERNOON] = generatedPower;
this.power[ElectricNetwork.timeOfDay.NIGHT] = 0;
}
var constructor = this.constructor;
SolarPanel.prototype = Object.create(ElementsNetwork.prototype);
SolarPanel.prototype.constructor = constructor;
/*Класс Дом*/
function House(costsAfternoon, costsNight, persons) {
this.costsAfternoon = costsAfternoon;
this.costsNight = costsNight;
this.persons = persons;
this.power = {};
this.calcCostsAfternoon();
this.calcCostsNight();
}
var constructor = this.constructor;
House.prototype = Object.create(ElementsNetwork.prototype);
House.prototype.constructor = constructor;
House.prototype.calcCostsAfternoon = function() {
this.power[ElectricNetwork.timeOfDay.AFTERNOON] = - this.costsAfternoon * this.persons;
};
House.prototype.calcCostsNight = function() {
this.power[ElectricNetwork.timeOfDay.NIGHT] = - this.costsNight * this.persons;
};
/*Класс Линия Электропередач*/
function PowerLine(bandwidth, price) {
this.bandwidth = bandwidth;
this.price = price;
}
var constructor = this.constructor;
PowerLine.prototype = Object.create(ElementsNetwork.prototype);
PowerLine.prototype.constructor = constructor;
/*Применение*/
var electricNetwork1 = new ElectricNetwork();
ElementsNetwork();
var powerhouse1 = new Powerhouse(100);
var solarPanel1 = new SolarPanel(4);
var house1 = new House(0.004, 0.001, 200);
var powerLine1 = new PowerLine(20, 100);
var powerLine2 = new PowerLine(30, 90);
var powerLine3 = new PowerLine(40, 80);
electricNetwork1.addNewElement(powerhouse1);
electricNetwork1.addNewElement(solarPanel1);
electricNetwork1.addNewElement(house1);
electricNetwork1.addNewElement(powerLine1);
electricNetwork1.addNewElement(powerLine2);
electricNetwork1.addNewElement(powerLine3);
console.log(electricNetwork1.makeBalance(ElectricNetwork.timeOfDay.AFTERNOON));
console.log(electricNetwork1.makeBalance(ElectricNetwork.timeOfDay.NIGHT));
console.log(electricNetwork1.calcPrice(ElectricNetwork.timeOfDay.AFTERNOON));
Output
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |