Loading...
Knightwalker avatar Knightwalker 38 Точки

11. Array Manipulator | Tech Module 4.0 | PHP

Много интересна задача - получавам 90/100, дали може някой който я е решавал на PHP да сподели? Има някаква ловка в задачата и не мога да я намеря вече няколко часа. Решил съм я по много заплетен начин но все пак ще оставя кода отдолу.

<?php

$arr = explode(" ", readline());

for($i = 0; $i < count($arr); $i++) {
  $arr[$i] = intval($arr[$i]);
}

//var_dump($arr);

while(true) {
  $commands = explode(" ", readline());
  if ($commands[0] == "end") { break; }

  // BEGIN exchange {index}  
  if ($commands[0] == "exchange") {
    $command = $commands[0]; 
    $index = $commands[1];

    if ($index >= count($arr)) {
      echo "Invalid index" . PHP_EOL;
    } else {
      $re_counter = 0;
      $counter = 0;

      $subArrOne = [];
      $subArrTwo = [];

      for ($i = 0; $i <= $index; $i++) {
        $subArrOne[] = $arr[$i];
      }

      for ($i = $index + 1; $i < count($arr); $i++) {
        $subArrTwo[] = $arr[$i];
      }

      //var_dump($subArrOne);
      //var_dump($subArrTwo);

      // Re-populate original arr with new values
      for ($i = $index + 1; $i < count($arr); $i++) {
        $arr[$re_counter] = $subArrTwo[$counter];
        $re_counter++;
        $counter++;
      }

      $counter = 0;

      for ($i = 0; $i <= $index; $i++) {
        $arr[$re_counter] = $subArrOne[$counter];
        $re_counter++;
        $counter++;
      }
      
      //var_dump($arr);
    }

  }
  // END exchange {index} 

  // BEGIN max even/odd
  // BEGIN min even/odd
  if ($commands[0] == "max" || $commands[0] == "min") { 
    $command = $commands[0]; 
    $mode = $commands[1];

    // BEGIN max
    if ($command == "max") {
      if ($mode == "even") {
        $maxEven = -999999;
        $maxEvenIndex = 0;
        $foundMaxEvenElement = false;

        for($i = 0; $i < count($arr); $i++) {
          if ($arr[$i] % 2 == 0) {

            $currentNum = $arr[$i];

            if ($currentNum >= $maxEven) {
              $maxEven = $currentNum;
              $maxEvenIndex = $i;
              $foundMaxEvenElement = true;
            }

          } 

        }

        if ($foundMaxEvenElement == true) {
          echo $maxEvenIndex . PHP_EOL;
        } else {
          echo "No matches" . PHP_EOL;
        }

      } else if ($mode == "odd") {
        $maxOdd = -999999;
        $maxOddIndex = 0;
        $foundMaxOddElement = false;

        for($i = 0; $i < count($arr); $i++) {
          if (!($arr[$i] % 2 == 0)) {

            $currentNum = $arr[$i];

            if ($currentNum >= $maxOdd) {
              $maxOdd = $currentNum;
              $maxOddIndex = $i;
              $foundMaxOddElement = true;
            }

          } 

        }

        if ($foundMaxOddElement == true) {
          echo $maxOddIndex . PHP_EOL;
        } else {
          echo "No matches" . PHP_EOL;
        }

      }

    }
    // END max

    // BEGIN min
    if ($command == "min") {
      if ($mode == "even") {
        $minEven = 999999;
        $minEvenIndex = 0;
        $foundMinEvenElement = false;

        for($i = 0; $i < count($arr); $i++) {
          if ($arr[$i] % 2 == 0) {

            $currentNum = $arr[$i];

            if ($currentNum <= $minEven) {
              $minEven = $currentNum;
              $minEvenIndex = $i;
              $foundMinEvenElement = true;
            }

          } 

        }

        if ($foundMinEvenElement == true) {
          echo $minEvenIndex . PHP_EOL;
        } else {
          echo "No matches" . PHP_EOL;
        }

      } else if ($mode == "odd") {
        $minOdd = 999999;
        $minOddIndex = 0;
        $foundMinOddElement = false;

        for($i = 0; $i < count($arr); $i++) {
          if (!($arr[$i] % 2 == 0)) {

            $currentNum = $arr[$i];

            if ($currentNum <= $minOdd) {
              $minOdd = $currentNum;
              $minOddIndex = $i;
              $foundMinOddElement = true;
            }

          } 

        }

        if ($foundMinOddElement == true) {
          echo $minOddIndex . PHP_EOL;
        } else {
          echo "No matches" . PHP_EOL;
        }

      }

    }
    // END min

  }
  // END max even/odd
  // END min even/odd

  // BEGIN first count even/odd
  // BEGIN last count even/odd
  if ($commands[0] == "first" || $commands[0] == "last") { 
    $command = $commands[0]; 
    $count = intval($commands[1]);
    $mode = $commands[2];

    if ($command == "first") {
      if ($count == 0) {
        echo "[]" . PHP_EOL;
      } else if ($count > count($arr)) {
        echo "Invalid count" . PHP_EOL;
      } else {

        if ($mode == "even") {
          $firstEvenArr = [];

          for ($i = 0; $i < count($arr); $i++) {
            if ($arr[$i] % 2 == 0) {
              $firstEvenArr[] = $arr[$i];
            }
          }

          if ($count > count($firstEvenArr)) {
            $count = count($firstEvenArr);
          }

          echo "[";
          for ($i = 0; $i < $count; $i++) {
            if ($i < $count - 1) {
              echo $firstEvenArr[$i] . ", ";
            } else { 
              echo $firstEvenArr[$i]; 
            }
          }
          echo "]" . PHP_EOL;

        } else if ($mode == "odd") {
          $firstOddArr = [];

          for ($i = 0; $i < count($arr); $i++) {
            if (!($arr[$i] % 2 == 0)) {
              $firstOddArr[] = $arr[$i];
            }
          }

          if ($count > count($firstOddArr)) {
            $count = count($firstOddArr);
          }

          echo "[";
          for ($i = 0; $i < $count; $i++) {
            if ($i < $count - 1) {
              echo $firstOddArr[$i] . ", ";
            } else { 
              echo $firstOddArr[$i]; 
            }
          }
          echo "]" . PHP_EOL;

        }

      }

    } else if ($command = "last") {
      if ($count == 0) {
        echo "[]" . PHP_EOL;
      } else if ($count > count($arr)) {
        echo "Invalid count" . PHP_EOL;
      } else {

        if ($mode == "even") {
          $lastEvenArr = [];
          $reverseLastEvenArr = [];
          $finalLastEvenArr = [];
          $reverseFinalLastEvenArr = [];

          for ($i = 0; $i < count($arr); $i++) {
            if ($arr[$i] % 2 == 0) {
              $lastEvenArr[] = $arr[$i];
            }
          }

          for ($i = count($lastEvenArr) - 1; $i >= 0; $i--) {
              $reverseLastEvenArr[] = $lastEvenArr[$i];
          }

          if ($count > count($lastEvenArr)) {
            $count = count($lastEvenArr);
          }

          for ($i = 0; $i < $count; $i++) {
            $finalLastEvenArr[] = $reverseLastEvenArr[$i];
          }

          for ($i = count($finalLastEvenArr) - 1; $i >= 0; $i--) {
              $reverseFinalLastEvenArr[] = $finalLastEvenArr[$i];
          }

          //var_dump($lastEvenArr);
          //var_dump($reverseLastEvenArr);
          //var_dump($finalLastEvenArr);
          //var_dump($reverseFinalLastEvenArr);

          echo "[";
          for ($i = 0; $i < $count; $i++) {
            if ($i < $count - 1) {
              echo $reverseFinalLastEvenArr[$i] . ", ";
            } else { 
              echo $reverseFinalLastEvenArr[$i]; 
            }
          }
          echo "]" . PHP_EOL;

        } else if ($mode == "odd") {
          $lastOddArr = [];
          $reverseLastOddArr = [];
          $finalLastOddArr = [];
          $reverseFinalLastOddArr = [];

          for ($i = 0; $i < count($arr); $i++) {
            if (!($arr[$i] % 2 == 0)) {
              $lastOddArr[] = $arr[$i];
            }
          }

          for ($i = count($lastOddArr) - 1; $i >= 0; $i--) {
              $reverseLastOddArr[] = $lastOddArr[$i];
          }

          if ($count > count($lastOddArr)) {
            $count = count($lastOddArr);
          }

          for ($i = 0; $i < $count; $i++) {
            $finalLastOddArr[] = $reverseLastOddArr[$i];
          }

          for ($i = count($finalLastOddArr) - 1; $i >= 0; $i--) {
              $reverseFinalLastOddArr[] = $finalLastOddArr[$i];
          }

          //var_dump($lastOddArr);
          //var_dump($reverseLastOddArr);
          //var_dump($finalLastOddArr);
          //var_dump($reverseFinalLastOddArr);

          echo "[";
          for ($i = 0; $i < $count; $i++) {
            if ($i < $count - 1) {
              echo $reverseFinalLastOddArr[$i] . ", ";
            } else { 
              echo $reverseFinalLastOddArr[$i]; 
            }
          }
          echo "]" . PHP_EOL;

        }

      }

    }

  }
  // END first count even/odd
  // END last count even/odd

}
// END while loop

echo "[";
for($i = 0; $i < count($arr); $i++) {
  if ($i < count($arr) - 1) {
    echo $arr[$i] . ", ";
  } else { 
    echo $arr[$i]; 
  }
}
echo "]";

?>

 

 

Тагове:
0
Fundamentals Module
VasilKostov avatar VasilKostov 135 Точки

Привет,

не мога да ти проверя кода изцяло, защото съм на друг език, но това което заберязах е, че проверяваш само, дали индекса е по- голям от масива,

if ($index >= count($arr)) {
  echo "Invalid index" . PHP_EOL;
}

а в условието пише, че може да е и по-малък:

The split index will be an integer in the range [-2 31 … 2 31 – 1]

пробвай, дали не е това приблема ;)

0
Knightwalker avatar Knightwalker 38 Точки

Ето това го бях изпуснал, обаче много странно... Точно това ми изглежда че е проблема, оправям го и пак е 90/100.

0
VasilKostov avatar VasilKostov 135 Точки
for ($i = 0; $i <= $index; $i++) {
        $subArrOne[] = $arr[$i];
      }

      for ($i = $index + 1; $i < count($arr); $i++) {
        $subArrTwo[] = $arr[$i];
      }

А тук, не трябва ли и на subArrOne и Two също да зададеш позиция в масива - в която да се запище или на PHP си се редят на първата всободна?

0
Knightwalker avatar Knightwalker 38 Точки

В php по този начин се записва на първата свободна. Няма проблем, аз мн се надявах това което каза първоначално да беше проблема, понеже като се замисля дори нямам проверка за него, но като сложих пак си беше същото.

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.