@by_zed

Как избавиться от гкода?

В общем есть функция, она проверяет числа ,
к примеру

$win = win(1,4,1); ./// $win будет равно 2
и сколько совпадений из трех то и выдает

function win($num_1,$num_2,$num_3){

   $result = NULL;


   if($num_1 == $num_2 || $num_2 == $num_1 || $num_2 == $num_3 || $num_3 == $num_2 || $num_1 == $num_3 || $num_3 == $num_1){



    $result =  1;
   }

  else if($num_1 == $num_2 && $num_2 == $num_3){

    $result = 3;

   }

   else
   {
     $result = 0;
   }

   return $result;
}

как то можно более кошерно это сделать??
но по сути если можно и переделать функцию под проверку трехзначного числа и число одним целым

$win = win(141);

и да, разброс чисел от 000 до 555
  • Вопрос задан
  • 799 просмотров
Решения вопроса 1
$digits = str_split($number);
$repeating = count($digits) - count(array_unique($digits));
$duplicates = $repeating ? $repeating + 1 : 0;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
solotony
@solotony
покоряю пик Балмера
return ($n1===$n2) + ($n2===$n3) + ($n1===$n3);
Ответ написан
Комментировать
@granty
Чтобы избавиться от "говнокода", надо избавиться от "говноалгоритма".
Программист всегда решает задачу в общем виде. Как это сделать - отлично показал usheninmike.
Вся суть его алгоритма - в строке:
$repeating = count($digits) - count(array_unique($digits));


Я просто "допилил" его решение под вашу задачу:
function win() {
  if (func_num_args() <=0 ) $digits = array(); // Нет аргументов
  elseif (func_num_args() >1 ) {        // > 1 аргумента
	  for ($i=0, $digits=array(); $i < func_num_args(); $i++)
	    $digits[] = func_get_arg($i);
	  }
  else $digits = str_split( func_get_arg(0) );
  // ... тут надо проверить, что $digits не более 3-х элементов
  $repeating = count($digits) - count(array_unique($digits));
  return $repeating ? $repeating + 1 : 0;
  }

Такая функция win() будет понимать:
echo win().'<br>';
echo win("").'<br>';
echo win(1,4,1).'<br>';
echo win(141).'<br>';
echo win("141").'<br>';
echo win("11").'<br>';
echo win(11,11,1).'<br>';

Disclaimer
Функция отлично работает с ЦИФРАМИ. Но если понадобится считать СИМВОЛЫ в строке, результат по начале может показаться не очевидным - проверьте: win("§§§").'<br>';
Почему - разберётесь сами :)
Ответ написан
Комментировать
@ATLANT1S
Back-end developer
Странные какие-то у Вас функции. Проверку 3 чисел сделать немного красивее можно как-то так:
function win($num1, $num2, $num3) {
    if ($num1 == $num2) {
        return $num1 == $num3 ? 3 : 1;
    }
    
    return $num1 == $num3 || $num2 == $num3 ? 1 : 0;
}


Про то, что в функцию может залететь одно число - понятно чуть больше, чем ничерта. Что в этом случае нужно делать? Сравнивать цифры этого числа по такой же логике? Проще в таком случае сразу такое число разбить на три цифры и пихать в вашу функцию, чем делать одну функцию под все случаи жизни.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы