如何反转算法以查找哪个字符串生成特定输出?

时间:2016-03-04 23:14:37

标签: perl

我想在Perl中创建一个函数来计算要乘以的数组元素以获得给定值。

该数组包含559到574之间的整数。我想得到的值是3552907293224。

我该怎么做?

我们的想法是使用以下代码获取产生数字3552907293224的7个字符的字符串:

sub hash {
     my $nr = 13;
     for (split //, shift) {
          $nr = $nr * 43 + index("acdegijmnoprstuw", $_);
     }
     return $nr;
}

我设法通过反复试验弄清楚字符串是" eddigjo",但我需要一个能够执行此操作的函数。

2 个答案:

答案 0 :(得分:1)

很好。通过ThisSuitIsBlackNot算法:给定范围内的数字均不均匀地划分给定数字,因此不可能通过将它们相乘来获得它。

use warnings;
use strict;

my $num = 3552907293224;

my @range = (559..574);

my @divs = grep { $num % $_ == 0 } @range;

if (@divs) {  print "Divisors: @divs\n";    }
else       {  print "No divisors found.\n"; }

# Check explicitly (lay our eyes on them)
for (@range) { print "res = " . ($num / $_) . "\n" }

我们可以进行这些输入,因此可以尝试不同的数字,但问题是针对这些问题的。一旦找到除数,那么你需要经历所有可能长度的所有排列,检查乘法结果。我们在谈论因子复杂性。对于小范围,它会起作用,并且有减少,但对于较小数字的较长范围,它会迅速爆炸。

以良好的性能运行它是一个有趣的数学和计算问题。

问题得到澄清,现在有点不同了:扭转了得到结果的过程。

结果是系列中的最后一个元素从13开始并由给定的算法生成。它由一个额外的输入字符串驱动,每个下一个字符的索引提供偏移量。我们需要扭转这一过程。

所以倒退。取结果并从中减去输入字符串的最后一个字符的索引(在给定的引用字符串中),然后除以43.这是我们的最后一个因素。现在从中减去输入字符串的前一个字符的索引并除以43,这是我们倒数第二个因素。重复,直到我们达到13。

$result = 3552907293224;
$refstr = 'acdegijmnoprstuw';
$str = 'eddigio';

for (split '', reverse $str) {
    $result = $result - index($refstr, $_) ) / 43;
    print "$result\n";
}

打印


82625751005
1921529093.02326
44686723.0005408
1039226.00001258
24168.0000002925
562.000000006802
13.0000000001582

这是一个过程,我们最终得到了13个事实证实了这一点。

问题进一步发展,现在是一个不同的post,答案很好。

答案 1 :(得分:-1)

从你的问题中我可以理解,你是在追求这样的事情...... 我的例子是用Java编写的,但我相信你明白了!

public String getMultiplicationElements(int[] values, int toGet)
{
    //loop for first value in multiplication
    //will only move to next element when multiplied by all values within array
    for (int i = 0; i < values.length; i++)
    {
        //loop for second value in multiplication
        for (int j = 0; j < values.length; j++)
        {
            //test if matches specified value
            if ((values[i] * values[j]) == toGet)
            {
                //return indication of successful elements
                return "Array indices " + i " and " + j
                        + " multiply to get this result";
            }
        }
    }
    //for if no match found
    return null;
}