fork download
  1. function City(powerStations, powerPanels, powerLines, houses) {
  2. this._powerStations = powerStations;
  3. this._powerPanels = powerPanels;
  4. this._powerLines = powerLines;
  5. this._houses = houses;
  6. }
  7.  
  8. //Метод получения прибыли (убытка)
  9. City.prototype.getFinanceResult = function(overflowPower) {
  10. var order = (overflowPower > 0) ? "desc" : "asc";
  11. //Если продаем подороже, то сортируем линии электропередач по убыванию
  12. //Если покупаем подешевле, то по возрастанию
  13. var powerLinesSortedByCost = this._powerLines.sort(function(a, b) {
  14. return (order == "asc") ? a.cost - b.cost : b.cost - a.cost;
  15. });
  16. //console.log(powerLinesSortedByCost);
  17. var powerSum = 0;
  18. var costSum = 0;
  19. for (var i = 0; i < powerLinesSortedByCost.length; i++) {
  20. var power = Util.convertPowerToKwNumber(powerLinesSortedByCost[i].power);
  21. var cost = powerLinesSortedByCost[i].cost;
  22. if (powerSum + power >= Math.abs(overflowPower)) {
  23. power = Math.abs(overflowPower) - powerSum;
  24. }
  25. powerSum += power;
  26. //Так как учет цены идет в виде стоимости за мегаватт
  27. costSum += Util.convertKwToMw(power) * cost;
  28. }
  29. /*
  30.   console.log("overflow " + overflowPower);
  31.   console.log("powerSum " + powerSum);
  32.   console.log("costSum " + costSum);
  33.   */
  34. if (powerSum < Math.abs(overflowPower)) {
  35. throw new CityException("Power lines are not enough in the city");
  36. }
  37. //Если это был экспорт из других городов, надо показать это отрицательным значением
  38. if (order == "asc") {
  39. costSum = -costSum;
  40. }
  41. return +costSum.toFixed(2);
  42. };
  43.  
  44. //Метод получения переизбытка (недоотдачи) городской энергии
  45. City.prototype.getOverflowPower = function(timesOfDay) {
  46. var cityPower = this._getCityPower(timesOfDay);
  47. var needPower = this._getNeedPower(timesOfDay);
  48. /*
  49.   console.log("cityPower " + cityPower);
  50.   console.log("needPower " + needPower);
  51.   console.log("np & cp " + timesOfDay);
  52.   console.log("---------------------------");
  53.   */
  54. return cityPower - needPower;
  55. };
  56.  
  57.  
  58. City.prototype._getCityPower = function(timesOfDay) {
  59. var powerSum = 0;
  60. for (var i = 0; i < this._powerStations.length; i++) {
  61. var powerStation = this._powerStations[i];
  62. powerSum += Util.convertPowerToKwNumber(powerStation.power);
  63. }
  64. if (timesOfDay == "day") {
  65. for (var j = 0; j < this._powerPanels.length; j++) {
  66. var powerPanel = this._powerPanels[j];
  67. powerSum += Util.convertPowerToKwNumber(powerPanel.power);
  68. }
  69. } else {
  70. for (j = 0; j < this._powerPanels; j++) {
  71. powerSum += PowerPanel.NIGHT_POWER;
  72. }
  73. }
  74. return powerSum;
  75. };
  76.  
  77. City.prototype._getNeedPower = function(timesOfDay) {
  78. var counter = 0;
  79. for (var key in this._houses) {
  80. counter++;
  81. }
  82. if (timesOfDay == "day") {
  83. return counter * Util.convertPowerToKwNumber(House.FLAT_TAKE_DAY_POWER);
  84. } else {
  85. return counter * Util.convertPowerToKwNumber(House.FLAT_TAKE_NIGHT_POWER);
  86. }
  87. };
  88.  
  89. function CityException(message) {
  90. this.name = "CityException";
  91. this.message = message;
  92. }
  93.  
  94. /***************PowerStation***************/
  95.  
  96. PowerStation.MIN_POWER = "1MW";
  97. PowerStation.MAX_POWER = "100MW";
  98.  
  99. function PowerStation(power) {
  100. this._setPower(power);
  101. }
  102.  
  103. PowerStation.prototype._setPower = function(power) {
  104. if (power < Util.convertPowerToKwNumber(PowerStation.MIN_POWER) ||
  105. power > Util.convertPowerToKwNumber(PowerStation.MAX_POWER)) {
  106. throw new PowerStationException("Incorrectly set power. " +
  107. "Min: " + PowerStation.MIN_POWER + ". " +
  108. "Max: " + PowerStation.MAX_POWER + ".");
  109. }
  110. this.power = power;
  111. };
  112.  
  113. function PowerStationException(message) {
  114. this.name = "PowerStationException";
  115. this.message = message;
  116. }
  117.  
  118. /***************House***************/
  119.  
  120. House.MIN_FLATS = 100;
  121. House.MAX_FLATS = 400;
  122. House.FLAT_TAKE_DAY_POWER = "4KW";
  123. House.FLAT_TAKE_NIGHT_POWER = "1KW";
  124.  
  125. function House(flats) {
  126. this._setFlats(flats);
  127. }
  128.  
  129. House.prototype._setFlats = function(flats) {
  130. flats = +flats.slice(0, -5);
  131. if (isNaN(flats)) {
  132. throw new HouseException("Not a number");
  133. } else if (flats < House.MIN_FLATS || flats > House.MAX_FLATS) {
  134. throw new HouseException("Incorrect number of flats. " +
  135. "Min: " + House.MIN_FLATS + ". " +
  136. "Max: " + House.MAX_FLATS + ".");
  137. }
  138. this.flats = flats;
  139. };
  140.  
  141. function HouseException(message) {
  142. this.name = "HouseException";
  143. this.message = message;
  144. }
  145.  
  146. /***************PowerPanel***************/
  147.  
  148. PowerPanel.TYPE_ONE = "typeOne";
  149. PowerPanel.TYPE_TWO = "typeTwo";
  150. PowerPanel.TYPE_THREE = "typeThree";
  151. PowerPanel.TYPE_FOUR = "typeFour";
  152. PowerPanel.TYPE_FIVE = "typeFive";
  153. PowerPanel.NIGHT_POWER = 0;
  154.  
  155. PowerPanel.typeList = {
  156. "typeOne": "1MW",
  157. "typeTwo": "2MW",
  158. "typeThree": "3MW",
  159. "typeFour": "4MW",
  160. "typeFive": "5MW"
  161. };
  162.  
  163. function PowerPanel(type) {
  164. this._setType(type);
  165. this._setPower(PowerPanel.typeList[this.type]);
  166. }
  167.  
  168. PowerPanel.prototype._setType = function(type) {
  169. if (!(type in PowerPanel.typeList)) {
  170. throw new PowerPanelException("Wrong type of panel. Allowed panels: " +
  171. Object.keys(PowerPanel.typeList) + ".");
  172. }
  173. this.type = type;
  174. };
  175.  
  176. PowerPanel.prototype._setPower = function(power) {
  177. this.power = power;
  178. };
  179.  
  180. function PowerPanelException(message) {
  181. this.name = "PowerPanelException";
  182. this.message = message;
  183. }
  184.  
  185. /***************PowerLine***************/
  186.  
  187. PowerLine.typeList = {
  188. "typeOne": {power: "50MW", cost: 5},
  189. "typeTwo": {power: "75MW", cost: 4.9},
  190. "typeThree": {power: "110MW", cost: 5.2},
  191. "T-800": {power: "100MW", cost: 5.6}
  192. };
  193.  
  194. function PowerLine(type) {
  195. this._setType(type);
  196. }
  197.  
  198. PowerLine.prototype._setType = function(type) {
  199. if (!(type in PowerLine.typeList)) {
  200. throw new PowerLineException("Wrong type of power line. Allowed panels: " +
  201. Object.keys(PowerLine.typeList) + ".");
  202. }
  203. this.type = type;
  204. this.power = PowerLine.typeList[type].power;
  205. this.cost = PowerLine.typeList[type].cost;
  206. };
  207.  
  208. function PowerLineException(message) {
  209. this.name = "PowerLineException";
  210. this.message = message;
  211. }
  212.  
  213. /***************Util***************/
  214.  
  215. function Util() {}
  216.  
  217. //Статический метод конвертации строки вида 15MW в число 15000
  218. Util.convertPowerToKwNumber = function(power) {
  219. var unit = power.slice(-2);
  220. var value = +power.slice(0, -2);
  221. switch(unit) {
  222. case "KW": return value;
  223. case "MW": return value * 1000;
  224.  
  225. default: throw new UtilException("Wrong unit of power");
  226. }
  227. };
  228.  
  229. //Противоположный эффект методу Util.convertPowerToKwNumber
  230. Util.convertKwNumberToPower = function(kw) {
  231. if (Math.abs(kw) < 1000) {
  232. return kw + "KW";
  233. } else {
  234. return Util.convertKwToMw(kw) + "MW";
  235. }
  236. };
  237.  
  238. //Метод для расчета цены (тарифы в мегаваттах) который используется один раз :(
  239. Util.convertKwToMw = function(kw) {
  240. return kw / 1000;
  241. };
  242.  
  243. //Создание массива объектов
  244. Util.generator = function(constructor, conditions) {
  245. var objects = [];
  246. for (var key in conditions) {
  247. for (var i = 0; i < conditions[key]; i++) {
  248. objects.push(new constructor(key));
  249. }
  250. }
  251. return objects;
  252. };
  253.  
  254. Util.showResults = function(timesOfDay, power, financeResult) {
  255. console.log("Times of day: " + timesOfDay + ".");
  256. if (financeResult >= 0) {
  257. console.log("Profit is equal to: " + financeResult + ". " +
  258. "Overflow of power: " + Util.convertKwNumberToPower(power) + ".");
  259. } else {
  260. console.log("Loss is equal to: " + financeResult + ". " +
  261. "Deficit of power: " + Util.convertKwNumberToPower(power) + ".");
  262. }
  263. console.log("---------------------------");
  264. };
  265.  
  266. function UtilException(message) {
  267. this.name = "UtilException";
  268. this.message = message;
  269. }
  270.  
  271. /***************Test***************/
  272.  
  273. //Далее - количество определенных элементов электросети (значение) и их хар-ка (ключ)
  274.  
  275. //(15000 * 1) + (30000 * 2) + (45000 * 1) + (60000 * 2) = 240000KW (сила на сутки)
  276. var conditionsForPowerStations = {
  277. "15MW": 1,
  278. "30MW": 2,
  279. "45MW": 1,
  280. "60MW": 2
  281. };
  282.  
  283. //(8 * 1000) + (6 * 2000) + (9 * 3000) + (9 * 4000) + (8000 * 5) = 123000KW (сила на день)
  284. var conditionsForPowerPanels = {
  285. "typeOne": 8,
  286. "typeTwo": 6,
  287. "typeThree": 9,
  288. "typeFour": 9,
  289. "typeFive": 8
  290. };
  291.  
  292. //800000KW требуется днем и 200000KW ночью
  293. var conditionsForHouses = {
  294. "100Flats": 200000,
  295. "200Flats": 0,
  296. "300Flats": 0,
  297. "400Flats": 0
  298. };
  299.  
  300. //(50 * 5) + (75 * 8) + (110 * 6) + (100 * 1) = 1610MW пропускная способность
  301. var conditionsForPowerLines = {
  302. "typeOne": 5,
  303. "typeTwo": 8,
  304. "typeThree": 6,
  305. "T-800": 1
  306. };
  307.  
  308. /**
  309.  Перенесем сюда тарифы чтобы легче было сверить результаты
  310.  работы програмы
  311.  */
  312.  
  313. //"typeOne": {power: "50MW", cost: 5},
  314. //"typeTwo": {power: "75MW", cost: 4.9},
  315. //"typeThree": {power: "110MW", cost: 5.2},
  316. //"T-800": {power: "100MW", cost: 5.6}
  317.  
  318. /**
  319.   Днем энергия города будет 363 мегаватта.
  320.   Днем городу нужно 80 мегаватт.
  321.   Днем дефицит будет 437 мегаватт.
  322.   Придется их купить со второй дешевой линии (4.9).
  323.   Шести линий хватит (75 * 6 > 437). Цена: 437 * 4.9 = 2141.3
  324.  
  325.   Ночью энергия города будет 240 мегаватта.
  326.   Ночью городу нужно 200 мегаватт.
  327.   Ночью переизбыток будет 40 мегаватт.
  328.   Продаем их с последней дорогой линии (5.6).
  329.   Одной линии хватит (100 > 40). Цена: 40 * 5.6 = 224
  330.  */
  331.  
  332. try {
  333. var powerStations = Util.generator(PowerStation, conditionsForPowerStations);
  334. var panels = Util.generator(PowerPanel, conditionsForPowerPanels);
  335. var houses = Util.generator(House, conditionsForHouses);
  336. var powerLines = Util.generator(PowerLine, conditionsForPowerLines);
  337. //console.log(powerStations);
  338. //console.log(panels);
  339. //console.log(houses);
  340. var city = new City(powerStations, panels, powerLines, houses);
  341. var overflowForDay = city.getOverflowPower("day");
  342. var overflowForNight = city.getOverflowPower("night");
  343. var resultForDay = city.getFinanceResult(overflowForDay);
  344. var resultForNight = city.getFinanceResult(overflowForNight);
  345. Util.showResults("day", overflowForDay, resultForDay);
  346. Util.showResults("night", overflowForNight, resultForNight);
  347. } catch(error) {
  348. console.log(error.name + ": " + "Message: " + error.message);
  349. }
  350.  
Success #stdin #stdout 0.17s 21336KB
stdin
Standard input is empty
stdout
Times of day: day.
Loss is equal to: -2141.3. Deficit of power: -437MW.
---------------------------
Times of day: night.
Profit is equal to: 224. Overflow of power: 40MW.
---------------------------