【问题标题】:PHP - Predict next number and detect a pattern of a sequence of numbersPHP - 预测下一个数字并检测数字序列的模式
【发布时间】:2018-04-03 19:09:50
【问题描述】:

嗨,我正在制作一个脚本来预测下一个数字,但我无法让它运行......

我需要什么?预测下一个数字的脚本,例如儿童数学问题,但范围更广。

  • 示例 1:

    3 > 6 > 9
    

这里是+ 3 + 3,模式是"+3"

  • 示例 2(我们将使其变得更加困难):

    4 > 10 > 5 > 11 > 6
    

这里是+ 6 - 5 + 6 - 5,模式是"+6-5"

  • 嗯...下一个例子,会很困难:

    2 > 16 > 8 > 13 > 104 > 52 > 57 > 456
    

这里是+ 14 - 8 + 5 + 91 - 52 + 5 + 399....,但模式是"* 8 / 2 + 5"

脚本需要返回下一个“可能”数字和检测到的模式。

这是出于教育目的。

【问题讨论】:

标签: php math numbers sequence predict


【解决方案1】:

我把它当作一个挑战,用纯 PHP 编写它,所以我的结果类是这样的:

class Predict {
    private $nums = array();
    private $rawPattern = array();

    function __construct($nums) {
        $this->nums = $nums;
        $this->createPattern();
    }

    private function patternPart($num) {
        if($num >= 0) {
            $patternPart = "+{$num}";
        } else {
            $patternPart = "{$num}";
        }

        return $patternPart;
    }

    private function createPattern() {
        foreach($this->nums as $key => $num) {
            if($key > 0) {
                $prev = $this->nums[$key - 1];
                $diff = $num - $prev;

                $this->rawPattern[] = $this->patternPart($diff);
            }
        }
    }

    function getPattern($del = ' ') {
        $first = reset($this->rawPattern);

        // When all values are same just print the first one
        if(count(array_unique($this->rawPattern)) === 1 && end($this->rawPattern) === $first) {
            return $first;
        } else {
            $resultPattern = array();
            $patternToAppend = array();
            $doCheckIndex = 0;

            foreach($this->rawPattern as $key => $part) {
                if($key == 0) {
                    $resultPattern[] = $part;
                } else {
                    $checkNum = $this->rawPattern[$doCheckIndex];

                    if($checkNum == $part) {
                        $patternToAppend[] = $part;
                        $doCheckIndex++;
                    } else {
                        $patternToAppend[] = $part;
                        $doCheckIndex = 0;

                        if(!empty($patternToAppend)) {
                            $resultPattern = array_merge($resultPattern, $patternToAppend);
                            $patternToAppend = array();
                        }
                    }
                }
            }

            return implode($del, $resultPattern);
        }
    }
}

我用你的值试过了,结果如下:

$nums1 = new Predict(array(3, 6, 9));
$nums2 = new Predict(array(4, 10, 5, 11, 6));
$nums3 = new Predict(array(2, 16, 8, 13, 104, 52, 57, 456));

echo $nums1->getPattern(); // prints +3
echo $nums2->getPattern(); // prints +6 -5
echo $nums3->getPattern(); // prints +14 -8 +5 +91 -52 +5 +399

好吧,我不是最好的开发人员,但似乎正在工作。只需尝试更多选项或其他方法,当它不起作用时让我知道(也许我会再找时间)。

【讨论】:

  • 哇,真快!这门课适用于求和和减法,这就是我要找的!但是需要检测除法和乘法...
  • 是的,这就是我现在不知道的情况 :D 我晚上回家时会看看它。只是举一些例子,这样我就可以测试这些案例。
猜你喜欢
  • 2016-12-05
  • 2017-09-21
  • 1970-01-01
  • 2018-11-20
  • 2012-08-07
  • 2023-03-05
  • 1970-01-01
  • 2020-12-30
  • 2014-03-30
相关资源
最近更新 更多