игроки php a и b подряд камни - PullRequest
0 голосов
/ 09 июня 2018

Мне нужно найти php-код для решения математической задачи.

Это описание проблемы:

Игроки A и B играют в новую игру с камнями.На земле расположены N камней, образующих последовательность.Камни обозначены от 1 до N .Игроки A и B, играющие по очереди, берут ровно два камня подряд на земле, пока на земле не останется подряд камней.То есть каждый игрок может взять камень i и камень i + 1 , где 1≤i≤N − 1 .Если число оставшихся камней нечетное, A выигрывает.В противном случае, B выигрывает.Предположим, что A и B играют оптимально, а A играет первым, знаете ли вы, кто является победителем?

Линия имеет N камней и имеет индекс от 1 до N -> N (1 ≤ N ≤10 000 000)

Если число оставшихся камней нечетное, A побеждает.В противном случае выигрывает B.

Это мой код.Это работает, но это не правильно.

        <?php
$nStones =  rand(1, 10000000);
$string = ("i");
$start = rand(1, 10000000);
$length = 2;
while($nStones > 0) {
    substr( $nStones , $start [,  $length ]): string;
}
if ($nStones % 2 == 1) {
    echo "A";
} else {
echo "B";
}
?>

Я думаю, что пропущено альтернативное вычитание двух последовательных камней от A & B, в то время как $ nStones> 0. Кроме того, в описании проблемы упоминается вычитание оптимумов.пока не останется только один камень.Поэтому я предполагаю, что камни движутся вместе к своим ближайшим камням (промежутки исчезают и заменяются ближайшими камнями).

1 Ответ

0 голосов
/ 09 июня 2018

Я начал здесь:

<?php
class GameOfStones
{
    const STONE_PAIR = 'OO';
    const GAP_PAIR   = '__';

    public $line;

    public function __construct($length)
    {
        $this->line = str_pad('', $length, self::STONE_PAIR);
    }

    // Removes a pair of stones from the line at nth location.
    public function remove($n)
    {
        if(substr($this->line, $n-1, 2) == self::STONE_PAIR)
            $this->line =
                substr_replace($this->line, self::GAP_PAIR , $n-1, 2);
        else
            throw new Exception('Invalid move.');
    }

    // Check if there are no further possible moves.
    public function is_finished()
    {
        return strpos($this->line, self::STONE_PAIR) === false;
    }

    // Representation of line.
    public function __toString()
    {
        return implode('.', str_split($this->line)) ."\n";
    }
};

$game = new GameOfStones(6);
echo $game;
var_dump($game->is_finished());
$game->remove(5);
echo $game;
var_dump($game->is_finished());
$game->remove(2);
echo $game;
var_dump($game->is_finished());

Вывод:

O.O.O.O.O.O
bool(false)
O.O.O.O._._
bool(false)
O._._.O._._
bool(true)

В настоящее время этот класс начинается с создания строки, состоящей из символов «O».

Таким образом, если длина равна 5, строка будет выглядеть следующим образом:

OOOOO

Метод удаления принимает индекс.Если этот индекс был 1, сначала строка проверяется по индексу 0 строки (ваш n-1) для двух последовательных O.Другими словами «есть ли камни для удаления в данной позиции?».Если есть камни, мы выполняем замену строки в этой позиции и меняем два Os на два _s.

Метод is_finished проверяет строку на предмет первого вхождения двух Os.Другими словами, если есть два последовательных камня, на линии все еще есть ход для игры.

Магический метод __toString - строковое представление объекта GameOfStones.Это используется как способ визуализации состояния игры.

O.O.O.O._._

Выше показаны четыре камня и два пробела (я не уверен, что разделители точек необходимы - подчеркивания могут сливаться друг с другомвот почему я их использовал).

Я добавил пример использования кода, в котором (две) пары камней удаляются из линии из шести камней.После каждого удаления мы проверяем, есть ли еще один возможный ход, или, скорее, игра закончилась.

В настоящее время нет атрибуции игрока, которая оставлена ​​вам.

Ваше последнее правило:

'Если число оставшихся камней нечетное, A побеждает.В противном случае выигрывает B. '

Я борюсь с.Посмотрите эти примеры:

i) Line of length 3:

OOO 
O__ A (1)

End: one (odd) stone left.

ii) Line of length 4:

OOOO
OO__ A (3)
____ B (1)

End: zero (even) stones left.

ii) Line of length 7:

OOOOOOO
O__OOOO A(1)
O__O__O B(5)

End: three (odd) stones left.

Я бы сказал, что человек, который удаляет пару, чтобы следующий игрок не смог пойти, является победителем.В игре ii) выше, если A играл в позиции 1 (O__O), тогда они не давали бы играть B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...