Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.90 KB | None | 0 0
  1. final class FlowChart
  2. {
  3.     public const CAR_A = 1;
  4.     public const CAR_B = 2;
  5.     public const CAR_C = 3;
  6.  
  7.     public const WALK_RATE_A = 1;
  8.     public const WALK_RATE_B = 2;
  9.     public const WALK_RATE_C = 3;
  10.  
  11.     public const EXPANSION_RATE_A = 1;
  12.     public const EXPANSION_RATE_B = 2;
  13.  
  14.     public const SPEED_A = 1;
  15.     public const SPEED_B = 2;
  16.  
  17.     public const HUNGRY_A = 1;
  18.     public const HUNGRY_B = 2;
  19.  
  20.     public const SMART_A = 1;
  21.     public const SMART_B = 2;
  22.  
  23.  
  24.     /**
  25.      * @param $class
  26.      * @param $expansionRate
  27.      * @param $smart
  28.      * @param $hungry
  29.      * @param $hasCars
  30.      * @param $speed
  31.      * @param $walkTime
  32.      * @return int
  33.      */
  34.     public function flowChart($class, $expansionRate, $smart, $hungry, $hasCars, $speed, $walkTime): ?int
  35.     {
  36.         $expansionRate = $this->expansionRateRule($expansionRate);
  37.         $smart = $this->smartRule($smart);
  38.         $hungry = $this->hungryRule($hungry);
  39.         $hasCars = $this->hasCarsRule($hasCars);
  40.         $walkTime = $this->walkRule($walkTime);
  41.  
  42.         switch ($class) {
  43.             case 'A':
  44.                 return 1;
  45.             case 'B':
  46.                 return 2;
  47.             case 'C':
  48.                 return $this->checkRules(
  49.                     3,
  50.                     $this->smartRule($smart),
  51.                     $this->hungryRule($hungry)
  52.                 );
  53.             case 'D':
  54.                 return $this->checkRules(
  55.                     6,
  56.                     $this->smartRule($smart),
  57.                     $this->hungryRule($hungry)
  58.                     );
  59.             case 'E':
  60.                 return $this->checkRules(
  61.                     9,
  62.                     $this->smartRule($smart),
  63.                     $this->hungryRule($hungry),
  64.                     $this->hasCarsRule($hasCars)
  65.                 );
  66.             case 'F':
  67.                 return $this->checkRules(
  68.                     13,
  69.                     $this->smartRule($smart),
  70.                     $this->hungryRule($hungry),
  71.                     $this->hasCarsRule($hasCars),
  72.                     $this->speedRule($speed),
  73.                     $this->walkRule($walkTime),
  74.                     true,
  75.                     $this->expansionRateRule($expansionRate)
  76.                 );
  77.             case 'G':
  78.                 return $this->checkRules(
  79.                     25,
  80.                     $this->smartRule($smart),
  81.                     $this->hungryRule($hungry),
  82.                     $this->hasCarsRule($hasCars),
  83.                     $this->speedRule($speed),
  84.                     $this->walkRule($walkTime)
  85.                 );
  86.         }
  87.  
  88.         return null;
  89.     }
  90.  
  91.     /**
  92.      * @param $smart
  93.      * @return int
  94.      */
  95.     private function smartRule($smart): int
  96.     {
  97.         if ($smart === 'Yes') {
  98.             return self::SMART_A;
  99.         }
  100.         return self::SMART_B;
  101.     }
  102.  
  103.     /**
  104.      * @param $hungry
  105.      * @return int
  106.      */
  107.     private function hungryRule($hungry): int
  108.     {
  109.         if ($hungry === 'Yes') {
  110.             return self::HUNGRY_A;
  111.         }
  112.         return self::HUNGRY_B;
  113.     }
  114.  
  115.     /**
  116.      * @param $hasCars
  117.      * @return int
  118.      */
  119.     private function hasCarsRule($hasCars): int
  120.     {
  121.         if ($hasCars > 1) {
  122.             return self::CAR_A;
  123.         }
  124.  
  125.         if ($hasCars === 1) {
  126.             return self::CAR_B;
  127.         }
  128.  
  129.         return self::CAR_C;
  130.     }
  131.  
  132.     /**
  133.      * @param $expansion
  134.      * @return int
  135.      */
  136.     private function expansionRateRule($expansion): int
  137.     {
  138.         if ($expansion < 200) {
  139.             return self::EXPANSION_RATE_A;
  140.         }
  141.         return self::EXPANSION_RATE_B;
  142.     }
  143.  
  144.     /**
  145.      * @param $speed
  146.      * @return int
  147.      */
  148.     private function speedRule($speed): int
  149.     {
  150.         if ($speed <= 105) {
  151.             return self::SPEED_A;
  152.         }
  153.         return self::SPEED_B;
  154.     }
  155.  
  156.     /**
  157.      * @param $walk
  158.      * @return int
  159.      */
  160.     private function walkRule($walk): int
  161.     {
  162.         if ($walk < 100) {
  163.             return self::WALK_RATE_A;
  164.         }
  165.  
  166.         if ($walk > 100 && $walk < 106) {
  167.             return self::WALK_RATE_B;
  168.         }
  169.  
  170.         return self::WALK_RATE_C;
  171.     }
  172.  
  173.     /**
  174.      * @param $input
  175.      * @param bool $smart
  176.      * @param bool $hungry
  177.      * @param bool $hasCars
  178.      * @param bool $speed
  179.      * @param bool $walk
  180.      * @param bool $modifiedWalk
  181.      * @param bool $expansionRate
  182.      * @return int
  183.      */
  184.     public function checkRules(
  185.         $input,
  186.         $smart = false,
  187.         $hungry = false,
  188.         $hasCars = false,
  189.         $speed = false,
  190.         $walk = false,
  191.         $modifiedWalk = false,
  192.         $expansionRate = false
  193.     ): int
  194.     {
  195.         if ($expansionRate) {
  196.             switch ($expansionRate) {
  197.                 case self::EXPANSION_RATE_A:
  198.                     break;
  199.                 case self::EXPANSION_RATE_B:
  200.                     $input += 5;
  201.             }
  202.         }
  203.         if ($smart) {
  204.             switch ($smart) {
  205.                 case self::SMART_A:
  206.                     break;
  207.                 case self::SMART_B:
  208.                     ++$input;
  209.             }
  210.         }
  211.         if ($hungry) {
  212.             switch ($hungry) {
  213.                 case self::HUNGRY_A:
  214.                     break;
  215.                 case self::HUNGRY_B:
  216.                     ++$input;
  217.             }
  218.         }
  219.         if ($hasCars && $speed && $modifiedWalk) {
  220.             switch ($hasCars) {
  221.                 case self::CAR_A:
  222.                     break;
  223.                 case self::CAR_B:
  224.                     ++$input;
  225.                     break;
  226.                 case self::CAR_C:
  227.                     ++$input;
  228.             }
  229.             switch ($walk) {
  230.                 case self::WALK_RATE_A:
  231.                     break;
  232.                 case self::WALK_RATE_B:
  233.                     ++$input;
  234.                     break;
  235.                 case self::WALK_RATE_C:
  236.                     $input += 2;
  237.             }
  238.         } elseif ($hasCars && $speed) {
  239.             switch ($hasCars) {
  240.                 case self::CAR_A:
  241.                     break;
  242.                 case self::CAR_B:
  243.                     ++$input;
  244.                     break;
  245.                 case self::CAR_C:
  246.                     $input += 2;
  247.             }
  248.             switch ($speed) {
  249.                 case self::SPEED_A:
  250.                     break;
  251.                 case self::SPEED_B:
  252.                     ++$input;
  253.             }
  254.             switch ($walk) {
  255.                 case self::WALK_RATE_A:
  256.                     break;
  257.                 case self::WALK_RATE_C:
  258.                     ++$input;
  259.             }
  260.         } elseif ($hasCars) {
  261.             switch ($hasCars) {
  262.                 case self::CAR_B:
  263.                     break;
  264.                 case self::CAR_C:
  265.                     ++$input;
  266.             }
  267.         }
  268.         return $input;
  269.     }
  270. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement