Перестановки для всех возможных наборов (3 цифры), включая ноль - PullRequest
0 голосов
/ 13 февраля 2020

Я создаю небольшую игровую программу, в которой есть два типа игр. Single и Double. Для каждой игры есть фиксированный набор карт.

Одиночный график

        '128',   '129',  '120',  '130',  '140',   '123',  '124',  '125',  '126',  '127',
        '137',   '138',  '139',  '149',  '159',   '150',  '160',  '134',  '135',  '136',
        '146',   '147',  '148',  '158',  '168',   '169',  '179',  '170',  '180',  '145',
        '236',   '156',  '157',  '167',  '230',   '178',  '250',  '189',  '234',  '190',
        '245',   '237',  '238',  '239',  '249',   '240',  '269',  '260',  '270',  '235',
        '290',   '246',  '247',  '248',  '258',   '259',  '278',  '279',  '289',  '280',
        '380',   '345',  '256',  '257',  '267',   '268',  '340',  '350',  '360',  '370',
        '470',   '390',  '346',  '347',  '348',   '358',  '359',  '369',  '379',  '389',
        '489',   '480',  '490',  '356',  '357',   '349',  '368',  '378',  '450',  '460',
        '579',   '570',  '580',  '590',  '456',   '367',  '458',  '459',  '469',  '479',
        '560',   '589',  '670',  '680',  '690',   '457',  '467',  '468',  '478',  '569',
        '678',   '679',  '689',  '789',  '780',   '790',  '890',  '567',  '568',  '578',

Двойной график

        '100',   '110',  '166',  '112',  '113',   '114',  '115',  '116',  '117',  '118',
        '119',   '200',  '229',  '220',  '122',   '277',  '133',  '224',  '144',  '226',
        '155',   '228',  '300',  '266',  '177',   '330',  '188',  '233',  '199',  '244',
        '227',   '255',  '337',  '338',  '339',   '448',  '223',  '288',  '225',  '299',
        '335',   '336',  '355',  '400',  '366',   '466',  '377',  '440',  '388',  '334',
        '344',   '499',  '445',  '446',  '447',   '556',  '449',  '477',  '559',  '488',
        '399',   '660',  '599',  '455',  '500',   '600',  '557',  '558',  '577',  '550',
        '588',   '688',  '779',  '699',  '799',   '880',  '566',  '800',  '667',  '668',
        '669',   '778',  '788',  '770',  '889',   '899',  '700',  '990',  '900',  '677',

Когда я выбираю Single и вводим число di git 0123456789 (any sequence(sorted & unsorted), min 4 digits & max 10 digits from 0-9, repeated), он возвращает весь набор, связанный с Single Chart. Для этого случая он возвращает 120 наборов.

Если я выберу double и введу то же самое di git 0123456789 , он вернет весь набор, относящийся ТОЛЬКО к Double Chart.

В настоящее время я использую одно решение для Single игры, которое приведено здесь перестановки-все-возможные-наборы чисел , но в некотором наборе оно возвращается как 001, но должно быть 100

Также я не могу найти решения для игры Double. Что я пытаюсь:

<code> public function insertSingleGameData($motorGameData)
{

    $chartvalidation    = config('chartValidation');
    $tempMotorSet       = str_split($motorGameData->Playgame->cane);
    $motorSet           = $this->arrayCombination(3, $tempMotorSet); // Get All Sets
    $motorRange         = array_unique($motorSet);
        foreach($motorRange as $cane)
        {

            if(in_array($cane, $chartvalidation['single'])){
                $tempGameData[]     =   ([
                    'playgame_id'   =>  $motorGameData->Playgame->id,
                    'user_id'       =>  $motorGameData->Playgame->user_id,
                    'cane'          =>  $cane,
                    'amount'        =>  $motorGameData->Playgame->amount,
                    'gamemaster_id' =>  $motorGameData->Playgame->gamemaster_id,
                    "created_at"    =>  \Carbon\Carbon::now(),  
                    "updated_at"    =>  \Carbon\Carbon::now(),  
                ]);
            }
        }
        Tempgame::insert($tempGameData);

}

function arrayCombination($le, $set){
    $lk = $this->combination_number($le, count($set));
    $ret = array_fill(0, $lk, array_fill(0, $le, '') );
    $temp = array();
    for ($i = 0 ; $i < $le ; $i++)
        $temp[$i] = $i;
        $ret[0] = $temp;
        for ($i = 1 ; $i < $lk ; $i++){
            if ($temp[$le-1] != count($set)-1){
                $temp[$le-1]++;
            } else {
                $od = -1;
                for ($j = $le-2 ; $j >= 0 ; $j--)
                    if ($temp[$j]+1 != $temp[$j+1]){
                        $od = $j;
                        break;
                    }
                if ($od == -1){
                    break;
                }
                $temp[$od]++;
                for ($j = $od+1 ; $j < $le ; $j++)    {
                    $temp[$j] = $temp[$od]+$j-$od;
                }
            }
            $ret[$i] = $temp;
        }
        for ($i = 0 ; $i < $lk ; $i++) {
            for ($j = 0 ; $j < $le ; $j++){
                $ret[$i][$j] = $set[$ret[$i][$j]];   
            }

        }
    $tempSet = array();
    foreach ($ret as $key => $value) {
        $tempSet[] = implode('',  $value);
    }
    return $tempSet;
    //print("<pre>".print_r($ret,true)."
");} Функция комбинация_номер ($ k, $ n) {$ n = intval ($ n); $ k = intval ($ k); if ($ k> $ n) {return 0;} elseif ($ n == $ k) {return 1;} else {if ($ k> = $ n - $ k) {$ l = $ k + 1; для ($ i = $ l + 1; $ i <= $ n; $ i ++) $ l * = $ i; $ m = 1; для ($ i = 2; $ i <= $ n- $ k; $ i ++) $ m * = $ i ;} else {$ l = ($ n- $ k) + 1; для ($ i = $ l + 1; $ i <= $ n; $ i ++) $ l * = $ i; $ m = 1; для ($ i = 2; $ i <= $ k; $ i ++) $ m * = $ i;}} return $ l / $ m;} </code>

Как мне этого добиться Single а Double игра в одну функцию?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Вы можете сделать preg_match для чисел, создав регулярное выражение, например:

/^[235046]+$/

Это означает, что мы пытаемся сопоставить строку с цифрами 235046 ( значение 2 или 3 или 5 и т. д.) с самого начала (^ символ каретки) до конца ($ символ доллара). Если мы находим совпадение, мы собираем их в другой массив.

Фрагмент:

<?php

$digits = '235046';

$single_chart_filtered = [];

foreach($single_chart as $chart_value){
    if(preg_match("/^[$digits]+$/",$chart_value) === 1){
        $single_chart_filtered[] = $chart_value;
    }
}

print_r($single_chart_filtered);

$double_chart_filtered = [];

foreach($double_chart as $chart_value){
    if(preg_match("/^[$digits]+$/",$chart_value) === 1){
        $double_chart_filtered[] = $chart_value;
    }
}

Демонстрация: https://3v4l.org/jChvm

0 голосов
/ 13 февраля 2020

001 является допустимой комбинацией 0123456789. Вам необходимо отфильтровать массив для возможного набора:

// simple artificial setup
$single = [111,222,333,444,555];
function generatePossibleSet($input) { return [000,001,010,100,011,101,110,111]; }

$possibleSet = generatePossibleSet("01");

$set = $single;
// just interscet the picked set with the possible set
$set = array_intersect($set, $possibleSet);

В этом примере будет показано [111] - единственная допустимая комбинация 0 и 1, которая была в сет-лист.

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