PHP - Как получить «все двухзначные числа», чтобы их сложение давало конкретный номер - PullRequest
0 голосов
/ 19 февраля 2019

Я создаю небольшую интеллектуальную игру, в которой нужно угадать для числа от 1 до 18 комбинацию из двух чисел, которая дает это число, например:

1: 10 (1+0 = 1)
2: 11 (1+1 = 2)
3: 12 (1+2 = 3), 21 (2+1 = 3)
4: 22 (2+2 = 4), 31 (3+1= 4), 13 (1+3 = 4)
.
.
.
.
.
.

Как получить для каждого номера это окончание списка чиселс 18?

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019

Использование более одного цикла является пустой тратой вычислительной мощности, поскольку оно будет выполнять ненужные / бесполезные итерации.Для каждой игры вы будете определять одно случайное число, которое ваш игрок будет «работать».Используйте один цикл с простым вычитанием, чтобы определить все правильные ответы.Не используйте грубую силу, если вы собираетесь каждый раз генерировать этот массив поиска; использовать один цикл и математическую логику .(Реально, вы можете / должны просто жестко закодировать весь массив поиска без заметной потери памяти; я предполагаю, что это академическая / личная проблема кодирования.)

Код: ( Демо )

$random_target = rand(1,18);
echo "Find all two digit numbers whose individual digits add up to: " , $random_target , "\n\n";

for ($x = 1; $x < 10; ++$x) {  // the tens digit
    if (($diff = $random_target - $x) >= 0 && $diff < 10 ) {  // if ones digit is only "1 digit" it qualifies
        $result[] = "$x$diff";
    }
}

var_export($result);

Возможный вывод:

Найти все двузначные числа, отдельные цифры которых составляют: 13

array (
  0 => '49',
  1 => '58',
  2 => '67',
  3 => '76',
  4 => '85',
  5 => '94',
)

пс. Если вы хотите построитьполный массив поиска, используйте бережливую технику @ Don'tPanic (без лишних итераций).Затем жестко закодируйте этот результат в вашем скрипте - больше не нужно генерировать правильные результаты.

for ($x = 1; $x <= 9; ++$x) {
    for ($y = 0; $y <= 9; ++$y) {
        $result[$x + $y][] = "$x$y";
    }
}
var_export($result);
0 голосов
/ 19 февраля 2019

Если вы просто хотите создать игру, которая позволит пользователю ввести число, которое станет суммой его цифр, и сравнить его с генерируемым компьютером номером

<?php
function sum($carry, $num){
  $carry += $num;
  return $carry;
}
function game($computer, $guess){
  if($computer === array_reduce(str_split($guess), 'sum')){
    return 'win';
  }
  return 'lose';
}
// force computer to choose 9
$computer = 9; $guess = 18;
echo game($computer, $guess);
// random 1-18 computer choice - will show win when computer picks 4
$computer = rand(1, 18); $guess = 22;
echo game($computer, $guess);
?>

Вы также можете сделать следующее:

<?php
class GuessingGame{
  public $computerFunc;
  public function __construct($computerFunc = null){
    $this->computerFunc = $computerFunc;
  }
  public function guess($guess){
    $user = array_reduce(str_split($guess), function($carry, $num){
      $carry += $num;
      return $carry;
    });
    if(call_user_func($this->computerFunc) === $user){
      return true;
    }
    return false;
  }
}
function computerFunc(){
  return rand(1, 18);
}
$game = new GuessingGame('computerFunc');
$test = $game->guess(22) ? 'win' : 'lose';
function guarantee(){
  return 9;
}
$game->computerFunc = 'guarantee';
$test2 = $game->guess(18) ? 'win' : 'lose';
$test .= ' ----- '.$test2 ;
echo $test;
?>
0 голосов
/ 19 февраля 2019

Для создания этого вида набора вы можете использовать вложенный цикл for, в котором каждый цикл повторяется от нуля до максимума, что в данном случае 9, поскольку вы хотите, чтобы все полученные пары сложений были двухзначными.

for ($x = 0; $x <= 9; $x++) {
    for ($y = 0; $y <= 9; $y++) {
        $result[$x + $y][] = $x . $y;
    }
}

Затем выведите каждый набор пар добавлений.

foreach ($result as $sum => $addends) {
    echo "$sum: " . implode(' ', $addends) . "\n";
}
0 голосов
/ 19 февраля 2019
for($target = 1; $target < 19; $target++) {
    echo "$target: ";
    for($i = 10; $i<100; $i++) {
        $parts = str_split((string) $i);
        if (array_sum($parts) == $target) {
            echo "$i ";
        }
    }

    echo "\n";
}

$target - это сумма, которую мы ищем в настоящее время.Внутренний цикл проверяет все двузначные числа для всех целевых значений, используя стандартные функции PHP str_split () и array_sum (), чтобы разделить числа и вычислить сумму частей.

Вывод:

1: 10 
2: 11 20 
3: 12 21 30 
4: 13 22 31 40 
5: 14 23 32 41 50 
6: 15 24 33 42 51 60 
7: 16 25 34 43 52 61 70 
8: 17 26 35 44 53 62 71 80 
9: 18 27 36 45 54 63 72 81 90 
10: 19 28 37 46 55 64 73 82 91 
11: 29 38 47 56 65 74 83 92 
12: 39 48 57 66 75 84 93 
13: 49 58 67 76 85 94 
14: 59 68 77 86 95 
15: 69 78 87 96 
16: 79 88 97 
17: 89 98 
18: 99
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...