Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
</body>
</html>
 
"use strict";
/*Класс Электрическая Сеть*/
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),
      initialBalance = balance,
      powerlines = this.makeAndSortPowerLines(this.listElements),
      price = 0,
      buy,
      result = {buy: 0, sell: 0, isBalanced: true, extraEnergy: 0, missingEnergy: 0};
  
  if (balance < 0) {
    buy = true;
    balance = -balance;
    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);
  }
  
  if (buy === true) {
    result.buy = price;
    result.missingEnergy = balance;
    
    if (balance !== 0) {
      result.isBlanced = false;
      
    }
  }
  
  if (buy === false) {
    result.sell = initialBalance - balance;
    result.extraEnergy = balance;
    
    if (balance !== 0) {
      result.isBlanced = false;
    } 
  }
  
  return result;
};
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]);
    }
  }
  
  powerlines.sort(function comparePrices(powerline1, powerline2) {
    return powerline2.power - powerline1.power;
  });
  
  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 ;
  
  ElementsNetwork.call(this);
  Powerhouse.prototype = Object.create(ElementsNetwork.prototype);
  Powerhouse.prototype.constructor = this.constructor;
}
/*Класс Солнечная Панель*/
function SolarPanel(generatedPower) {
  this.power = {};
  this.power[ElectricNetwork.timeOfDay.AFTERNOON] = generatedPower;
  this.power[ElectricNetwork.timeOfDay.NIGHT] = 0;
  
  ElementsNetwork.call(this);
  SolarPanel.prototype = Object.create(ElementsNetwork.prototype);
  SolarPanel.prototype.constructor = this.constructor;
}
/*Класс Дом*/
function House(costsAfternoon, costsNight, persons) {
  this.costsAfternoon = costsAfternoon;
  this.costsNight = costsNight;
  this.persons = persons;
  
  this.power = {};
  this.calcCostsAfternoon();
  this.calcCostsNight();
  
  ElementsNetwork.call(this);
  House.prototype = Object.create(ElementsNetwork.prototype);
  House.prototype.constructor = this.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;
  
  ElementsNetwork.call(this);
  PowerLine.prototype = Object.create(ElementsNetwork.prototype);
  PowerLine.prototype.constructor = this.constructor;
}
/*Применение*/
var electricNetwork1 = new ElectricNetwork();
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

Dismiss x
public
Bin info
anonymouspro
0viewers