fork download
  1. <?php
  2. //С крипа берет начало каждый класс. Надо будет сделать абстрактным
  3. abstract class Creep
  4. {
  5. //Базовые данные. потом стоит изменить к ним доступ
  6. protected $tier;
  7. protected $isBig;
  8.  
  9. //Давать доступ только через конструктор
  10. public function __construct($tier, $isBig){
  11. $this->tier = $tier;
  12. $this->isBig = $isBig;
  13. }
  14.  
  15. //Забить базовую ставку
  16. public function setSalary($num){
  17. $this->salary = $num;
  18. }
  19.  
  20. //Забить потребление
  21. public function setThirst($num){
  22. $this->thirst = $num;
  23. }
  24.  
  25. //Забиваем является ли крип боссом
  26. public function setBigGuy($num){
  27. $this->isBig = $num;
  28. }
  29.  
  30. //Забиваем тип крипа
  31. public function setTier($num){
  32. $this->tier = $num;
  33. }
  34.  
  35. //Выводит зарплату
  36. public function countTierSalary(){
  37. $salary = $this->salary;
  38. switch($this->tier){
  39. case 2 :
  40. $salary += $salary * 0.25;
  41. break;
  42. case 3 :
  43. $salary += $salary * 0.5;
  44. break;
  45. }
  46. //Если крип- босс, то поднимаем оплату
  47. if($this->isBig == 1){
  48. $salary += $salary * 0.5;
  49. }
  50. return $salary;
  51. }
  52.  
  53. //Выводит потребление
  54. public function countCreepThirst(){
  55. $thirst = $this->thirst;
  56. if($this->isBig == 1){
  57. $thirst += $thirst * 0.5;
  58. }
  59. return $thirst;
  60. }
  61.  
  62. //Выводит выхлоп
  63. public function countCreepOutput(){
  64. $output = $this->output;
  65. if($this->isBig == 1){
  66. $output = 0;
  67. }
  68. return $output;
  69. }
  70.  
  71. //Выводит является ли крип боссом
  72. public function getBossAligment(){
  73. return $this->isBig;
  74. }
  75.  
  76. //Выводит тип крипа
  77. public function getCreepTier(){
  78. return $this->tier;
  79. }
  80. }
  81.  
  82. //Менеджеры
  83. class Manager extends Creep
  84. {
  85. protected $salary = 500;
  86. protected $thirst = 20;
  87. protected $output = 200;
  88. }
  89.  
  90. //Маркетологи
  91. class Marketer extends Creep
  92. {
  93. protected $salary = 400;
  94. protected $thirst = 15;
  95. protected $output = 150;
  96. }
  97.  
  98. //Инженеры
  99. class Engeneer extends Creep
  100. {
  101. protected $salary = 200;
  102. protected $thirst = 5;
  103. protected $output = 15;
  104. }
  105.  
  106. //Аналитики
  107. class Analyst extends Creep
  108. {
  109. protected $salary = 800;
  110. protected $thirst = 50;
  111. protected $output = 5;
  112. }
  113.  
  114. //Абстрактный департамент, с него пойдут 4 департамента
  115. abstract class Department
  116. {
  117. //массив с работниками записанный строками
  118. protected $textArray = array();
  119.  
  120. //Конструктор для ввода массива с работниками строкой
  121. public function __construct(array $a){
  122. $this->textArray = $a;
  123. }
  124.  
  125. //Массив сотрудников
  126. protected $listOfCreeps = array();
  127.  
  128. //Метод, записывающий работника в массив
  129. public function fillListOfCreeps(){
  130.  
  131. foreach($this->textArray as $vorkers){
  132.  
  133. //Выводит кол-во работников одного типа и вида
  134. if(is_numeric(mb_substr($vorkers, 1, 1))){
  135. $numberOfCreeps = intval(mb_substr($vorkers, 0, 1)) * 10 + intval(mb_substr($vorkers, 1, 1));
  136. }else{
  137. $numberOfCreeps = mb_substr($vorkers, 0, 1);
  138. }
  139.  
  140. //проверяет является ли боссом
  141. $isBoss = (is_numeric(mb_substr($vorkers, -1))) ? 0 : 1;
  142.  
  143. //Выводим тип работника
  144. if($isBoss == 0){
  145. $creepType = mb_substr($vorkers, -1);
  146. }else{
  147. $creepType = mb_substr($vorkers, -2, 1);
  148. }
  149.  
  150. //Создаем работников
  151. if(intval($numberOfCreeps) < 10){
  152. $creepOffice = mb_substr($vorkers, 1, 2);
  153. }else{
  154. $creepOffice = mb_substr($vorkers, 2, 2);
  155. }
  156. switch($creepOffice){
  157. case 'me' :
  158. $worker = new Manager(intval($creepType), $isBoss);
  159. break;
  160. case 'ma' :
  161. $worker = new Marketer(intval($creepType), $isBoss);
  162. break;
  163. case 'en' :
  164. $worker = new Engeneer(intval($creepType), $isBoss);
  165. break;
  166. case 'an' :
  167. $worker = new Analyst(intval($creepType), $isBoss);
  168. break;
  169. }
  170.  
  171. //Забиваем массив с работниками массивами с работниками одного вида и типа
  172. $this->listOfCreeps[] = array_fill(0, intval($numberOfCreeps), $worker);
  173. }
  174. }
  175.  
  176. //Метод, выводящий кол-во сотрудников в департаменте
  177. public function countNumberOfCreeps(){
  178. $creepCount = 0;
  179. foreach($this->listOfCreeps as $creepMultiplier){
  180. $creepCount += count($creepMultiplier);
  181. }
  182. return $creepCount;
  183. }
  184.  
  185. //Метод, выводящий расходы на зарплату
  186. public function countSalary(){
  187. $sum = 0;
  188. foreach($this->listOfCreeps as $creepMultiplier){
  189. foreach($creepMultiplier as $creep){
  190. $sum += $creep->countTierSalary();
  191. }
  192. }
  193. return $sum;
  194. }
  195.  
  196. //Метод, выводящий потребление кофе
  197. public function countThirst(){
  198. $sum = 0;
  199. foreach($this->listOfCreeps as $creepMultiplier){
  200. foreach($creepMultiplier as $creep){
  201. $sum += $creep->countCreepThirst();
  202. }
  203. }
  204. return $sum;
  205. }
  206.  
  207. //Метод, выводящий кол-во страниц
  208. public function countNumOfPages(){
  209. $sum = 0;
  210. foreach($this->listOfCreeps as $creepMultiplier){
  211. foreach($creepMultiplier as $creep){
  212. $sum += $creep->countCreepOutput();
  213. }
  214. }
  215. return $sum;
  216. }
  217.  
  218. //Средний расход тугриков на страницу
  219. public function countCharge(){
  220. $charge = $this->countSalary() / $this->countNumOfPages();
  221. return floor($charge);
  222. }
  223.  
  224. //Выводим название департамента
  225. public function getName(){
  226. return $this->name;
  227. }
  228.  
  229. //Первая антикризисная мера
  230. public function cutSomeEngeneersHeads(){
  231.  
  232. //Посчитаем общее кол-во инженеров не боссов
  233. $commonSum = 0;
  234.  
  235. foreach($this->listOfCreeps as $creepMultiplier){
  236. foreach($creepMultiplier as $creep){
  237. if($creep instanceof Engeneer && $creep->getBossAligment() != 1){
  238. $commonSum++;
  239. }
  240. }
  241. }
  242.  
  243. //Дергаем инженеров как банкомат завещал
  244. $numberOfVictims = $commonSum * 0.4;
  245.  
  246. for($i = 0; $i < ceil($numberOfVictims); $i++){
  247. //Стоит четыре, т.к. тип крипа не может быть выше третьего уровня
  248. $tier = 4;
  249.  
  250. $victim = array();
  251.  
  252. //Перебираю массив с массивами с работниками
  253. foreach($this->listOfCreeps as $multiplierKey => $creepMultiplier){
  254. foreach($creepMultiplier as $key => $creep){
  255. //Ищем жертву с наименьшим значением типа и записываем его ключи в массив
  256. if($creep instanceof Engeneer && $creep->getBossAligment() != 1 && $tier > $creep->getCreepTier()){
  257. $tier = $creep->getCreepTier();
  258. $victim[0] = $multiplierKey;
  259. $victim[1] = $key;
  260. }
  261. }
  262. }
  263.  
  264. //Вытаскиваем жертву из массива
  265. unset($this->listOfCreeps[$victim[0]][$victim[1]]);
  266. }
  267. }
  268.  
  269. //Вторая антикризисная писулька
  270. public function careBoutAnalysts(){
  271.  
  272. //Меняем базовую ставку и потребление кофе
  273. Analyst::setSalary(1100);
  274. Analyst::setThirst(75);
  275.  
  276. //Перебираем массив с работниками для поиска аналистов
  277. foreach($this->listOfCreeps as $creepMultiplier){
  278. foreach($creepMultiplier as $creep){
  279. //Если босс не аналист, то опускаем его и ставим нового аналиста во главу
  280. if(!$creep instanceof Analyst && $creep->getBossAligment() == 1){
  281. $creep->setBigGuy(0);
  282. $this->listOfCreeps[] = array_fill(0, 1, new Analyst(3, 1));
  283. }
  284. }
  285. }
  286. }
  287.  
  288. //Третий антикризисный метод пошел
  289. public function promoteLowerTierManagers(){
  290. //Считаю общее кол-во манеджеров 1 и 2 типа
  291. $sum1Tier = 0;
  292. $sum2Tier = 0;
  293. foreach($this->listOfCreeps as $creepMultiplier){
  294. foreach($creepMultiplier as $creep){
  295. if($creep instanceof Manager && $creep->getCreepTier() == 1){
  296. $sum1Tier++;
  297. }elseif($creep instanceof Manager && $creep->getCreepTier() == 2){
  298. $sum2Tier++;
  299. }
  300. }
  301. }
  302.  
  303. //Кол-во кандидатов на повышение
  304. $half1Tier = ceil($sum1Tier);
  305. $half2Tier = ceil($sum2Tier);
  306.  
  307. //Перебираю массив, увеличивая тип заданного менеджера
  308. foreach($this->listOfCreeps as $creepMultiplier){
  309. foreach($creepMultiplier as $creep){
  310. //Повышаем половину менеджеров первого ранга
  311. if($creep instanceof Manager && $creep->getCreepTier() == 1){
  312. if($half1Tier == 0){
  313. continue;
  314. }else{
  315. $newTier = $creep->getCreepTier() + 1;
  316. $creep->setTier($newTier);
  317. $half1Tier--;
  318. }
  319. }
  320.  
  321. //Повышаем половину менеджеров второго ранга
  322. if($creep instanceof Manager && $creep->getCreepTier() == 2){
  323. if($half2Tier == 0){
  324. continue;
  325. }else{
  326. $newTier = $creep->getCreepTier() + 1;
  327. $creep->setTier($newTier);
  328. $half2Tier--;
  329. }
  330. }
  331.  
  332. //Если обе полусуммы равны нулю, то останавливаем обход
  333. if($half2Tier == 0 && $half1Tier == 0){
  334. break;
  335. }
  336. }
  337. }
  338. }
  339. }
  340.  
  341. //Отдел закупок
  342. class Procurement extends Department
  343. {
  344. protected $name = 'Закупок';
  345. }
  346.  
  347. //Отдел продаж
  348. class Selling extends Department
  349. {
  350. protected $name = 'Продаж';
  351. }
  352.  
  353. //Отдел рекламы
  354. class Marketing extends Department
  355. {
  356. protected $name = 'Рекламы';
  357. }
  358.  
  359. //Отдел логистики
  360. class Logistics extends Department
  361. {
  362. protected $name = 'Логистики';
  363. }
  364.  
  365. //Создаю класс компании
  366. class Company
  367. {
  368. //Массив со всеми департаментами
  369. private $fullList = array();
  370.  
  371. //Доступ к массиву
  372. public function addDepartment(Department $department){
  373. $this->fullList[] = $department;
  374. }
  375.  
  376. //получить массив
  377. public function getListOfDepartments(){
  378. return $this->fullList;
  379. }
  380.  
  381. //Общее кол-во работников
  382. public function getNumOfCreeps(){
  383. $sum = 0;
  384. foreach($this->fullList as $department){
  385. $sum += $department->countNumberOfCreeps();
  386. }
  387. return $sum;
  388. }
  389.  
  390. //Общие затраты на зп
  391. public function getFinalSalary(){
  392. $sum = 0;
  393. foreach($this->fullList as $department){
  394. $sum += $department->countSalary();
  395. }
  396. return $sum;
  397. }
  398.  
  399. //Всего кофе выжрали
  400. public function getFinalThirst(){
  401. $sum = 0;
  402. foreach($this->fullList as $department){
  403. $sum += $department->countThirst();
  404. }
  405. return $sum;
  406. }
  407.  
  408. //Всего выхлопа
  409. public function getFinalOutput(){
  410. $sum = 0;
  411. foreach($this->fullList as $department){
  412. $sum += $department->countNumOfPages();
  413. }
  414. return $sum;
  415. }
  416.  
  417. //Затраты на страничку
  418. public function getFinalCharge(){
  419. $charge = $this->getFinalSalary() / $this->getFinalOutput();
  420. return floor($charge);
  421. }
  422.  
  423. //Функция для вывода таблички
  424. public function printTable(){
  425.  
  426. //Выводим табличку
  427. echo padRight('Департамент'). padLeft('сотр.'). padLeft('денег').
  428. padLeft('кофе'). padLeft('стр.'). padLeft('кпд'). "\n";
  429.  
  430. foreach($this->getListOfDepartments() as $department){
  431. echo padRight($department->getName()). padLeft($department->countNumberOfCreeps()).
  432. padLeft($department->countSalary()). padLeft($department->countThirst()).
  433. padLeft($department->countNumOfPages()). padLeft($department->countCharge()). "\n";
  434. }
  435.  
  436. echo padRight('Итого'). padLeft($this->getNumOfCreeps()). padLeft($this->getFinalSalary()).
  437. padLeft($this->getFinalThirst()). padLeft($this->getFinalOutput()).
  438. padLeft($this->getFinalCharge());
  439.  
  440. }
  441. }
  442.  
  443. //Функция для забивания строки пробелами справа
  444. function padRight($string){
  445.  
  446. //Ширина колонки
  447. $column = 13;
  448.  
  449. $length = mb_strlen(strval($string));
  450. $numOfPads = $column - $length;
  451. $filledColumn = strval($string). str_repeat(" ", $numOfPads);
  452. echo $filledColumn;
  453. }
  454.  
  455. //Функция для забивания строки пробелами справа
  456. function padLeft($string){
  457.  
  458. //Ширина колонки
  459. $column = 13;
  460.  
  461. $length = mb_strlen(strval($string));
  462. $numOfPads = $column - $length;
  463. $filledColumn = str_repeat(" ", $numOfPads). strval($string);
  464. echo $filledColumn;
  465. }
  466.  
  467. //Создаю департаменты
  468. $procurementArray = array('9me1', '3me2', '2me3', '2ma1', '1me2b');
  469. $procurement = new Procurement($procurementArray);
  470. $procurement->fillListOfCreeps();
  471.  
  472. $sellingArray = array('12me1', '6ma1', '3an1', '2an2', '1ma2b');
  473. $selling = new Selling($sellingArray);
  474. $selling->fillListOfCreeps();
  475.  
  476. $marketingArray = array('15ma1', '10ma2', '8me1', '2en1', '1ma3b');
  477. $marketing = new Marketing($marketingArray);
  478. $marketing->fillListOfCreeps();
  479.  
  480. $logisticsArray = array('13me1', '5me2', '5en1', '1me1b');
  481. $logistics = new Logistics($logisticsArray);
  482. $logistics->fillListOfCreeps();
  483.  
  484. //Создаю вектор
  485. $vector = new Company;
  486.  
  487. //Забиваю департаменты
  488. $vector->addDepartment($procurement);
  489. $vector->addDepartment($selling);
  490. $vector->addDepartment($marketing);
  491. $vector->addDepartment($logistics);
  492.  
  493. $vector->printTable();
  494.  
  495. //Проба первой антикризисной меры
  496. $test1Logistics = new Logistics($logisticsArray);
  497. $test1Logistics->fillListOfCreeps();
  498. $test1Logistics->cutSomeEngeneersHeads();
  499.  
  500. $test1Marketing = new Marketing($marketingArray);
  501. $test1Marketing->fillListOfCreeps();
  502. $test1Marketing->cutSomeEngeneersHeads();
  503.  
  504. $test1Procurement = new Procurement($procurementArray);
  505. $test1Procurement->fillListOfCreeps();
  506. $test1Procurement->cutSomeEngeneersHeads();
  507.  
  508. $test1Selling = new Selling($sellingArray);
  509. $test1Selling->fillListOfCreeps();
  510. $test1Selling->cutSomeEngeneersHeads();
  511.  
  512. $test1Vector = new Company;
  513.  
  514. $test1Vector->addDepartment($test1Procurement);
  515. $test1Vector->addDepartment($test1Selling);
  516. $test1Vector->addDepartment($test1Marketing);
  517. $test1Vector->addDepartment($test1Logistics);
  518.  
  519. echo "\n\nПервые антикризисные меры, рубим инженеров, смотрим как они корчатся\n\n";
  520. $test1Vector->printTable();
  521.  
  522. //Проба второй антикризисной меры
  523. $test2Logistics = new Logistics($logisticsArray);
  524. $test2Logistics->fillListOfCreeps();
  525. $test2Logistics->careBoutAnalysts();
  526.  
  527. $test2Marketing = new Marketing($marketingArray);
  528. $test2Marketing->fillListOfCreeps();
  529. $test2Marketing->careBoutAnalysts();
  530.  
  531. $test2Procurement = new Procurement($procurementArray);
  532. $test2Procurement->fillListOfCreeps();
  533. $test2Procurement->careBoutAnalysts();
  534.  
  535. $test2Selling = new Selling($sellingArray);
  536. $test2Selling->fillListOfCreeps();
  537. $test2Selling->careBoutAnalysts();
  538.  
  539. $test2Vector = new Company;
  540.  
  541. $test2Vector->addDepartment($test2Procurement);
  542. $test2Vector->addDepartment($test2Selling);
  543. $test2Vector->addDepartment($test2Marketing);
  544. $test2Vector->addDepartment($test2Logistics);
  545.  
  546. echo "\n\nВторые антикризисные меры, растим и плодим аналистов, смотрим как они добреют\n\n";
  547. $test2Vector->printTable();
  548.  
  549. //Проба третьей антикризисной меры
  550. $test3Logistics = new Logistics($logisticsArray);
  551. $test3Logistics->fillListOfCreeps();
  552. $test3Logistics->promoteLowerTierManagers();
  553.  
  554. $test3Marketing = new Marketing($marketingArray);
  555. $test3Marketing->fillListOfCreeps();
  556. $test3Marketing->promoteLowerTierManagers();
  557.  
  558. $test3Procurement = new Procurement($procurementArray);
  559. $test3Procurement->fillListOfCreeps();
  560. $test3Procurement->promoteLowerTierManagers();
  561.  
  562. $test3Selling = new Selling($sellingArray);
  563. $test3Selling->fillListOfCreeps();
  564. $test3Selling->promoteLowerTierManagers();
  565.  
  566. $test3Vector = new Company;
  567.  
  568. $test3Vector->addDepartment($test3Procurement);
  569. $test3Vector->addDepartment($test3Selling);
  570. $test3Vector->addDepartment($test3Marketing);
  571. $test3Vector->addDepartment($test3Logistics);
  572.  
  573. echo "\n\nТретьи антикризисные меры, выращиваем мелких менеджеров\n\n";
  574. $test3Vector->printTable();
Success #stdin #stdout 0s 52488KB
stdin
Standard input is empty
stdout
Департамент          сотр.        денег         кофе         стр.          кпд
Закупок                 17       9612.5          340         3100            3
Продаж                  24        13550        602.5         3325            4
Рекламы                 36        16300        567.5         5380            3
Логистики               24        11375          415         3675            3
Итого                  101      50837.5         1925        15480            3

Первые антикризисные меры, рубим инженеров, смотрим как они корчатся

Департамент          сотр.        денег         кофе         стр.          кпд
Закупок                 17       9612.5          340         3100            3
Продаж                  24        13550        602.5         3325            4
Рекламы                 35        16100        562.5         5365            3
Логистики               22        10975          405         3645            3
Итого                   98      50237.5         1910        15435            3

Вторые антикризисные меры, растим и плодим аналистов, смотрим как они добреют

Департамент          сотр.        денег         кофе         стр.          кпд
Закупок                 18        11100          405         3300            3
Продаж                  25        15100          670         3475            4
Рекламы                 37        17800          635         5530            3
Логистики               25        12925          480         3875            3
Итого                  105        56925         2190        16180            3

Третьи антикризисные меры, выращиваем мелких менеджеров

Департамент          сотр.        денег         кофе         стр.          кпд
Закупок                 17        12425          340         3100            4
Продаж                  24        15050        602.5         3325            4
Рекламы                 36        17300        567.5         5380            3
Логистики               24        15625          415         3675            4
Итого                  101        60400         1925        15480            3