0

5つの数字を取り、最初の4つを使って5番目の数字を解として取得するプログラムを作成しました。ソリューションには正の整数のみを含めることができ、使用できる演算子は "+ - * /" のみです。数字と演算子を括弧で並べる方法は 11 通りあります。Ex "(n @ n) @ n @ n" ここで、n は数値を表し、@ は演算子を表します。

すべての解決策を見つけるのに問題はありません。私の問題は「重複」を削除することです。を使用してほとんどの重複を削除できました

%Seen = ();
@solutions = grep { ! $Seen{ $_ }++ } @solutions;

ただし、「重複した」式を削除する方法がわかりません。

21 14 2 7 を使用して 34 を取得すると、最初の重複が削除された後に 4 つの解が得られます。どうぞ

21/7=3; 14+3=17; 2*17=34
21/7=3; 3+14=17; 2*17=34
21/7=3; 3+14=17; 17*2=34
21/7=3; 14+3=17; 17*2=34

私の先生は、これらは数学的に同じであると考えているため、4 つすべてが 1 つの解にすぎません。どうすればよいかわかりませんが、これらの「重複」を見つけて削除することです。どんな助けでも大歓迎です、ありがとう。

4

2 に答える 2

3

使用した重複排除コードのより一般的な形式は次のとおりです。

grep !$seen{key($_)}++, ...

この場合key

sub key {
   ( my $key = $_[0] ) =~ s/(\d+)([*+])(\d+)/ $1 < $3 ? "$1$2$3" : "$3$2$1" /eg;
   return $key;
}

あなたの場合、最初に入力を単純に正規化することをお勧めします

sub normalise(_) {
   ( my $s = $_[0] ) =~ s/(\d+)([*+])(\d+)/ $1 < $3 ? "$1$2$3" : "$3$2$1" /eg;
   return $s;
}

@solutions = grep !$seen{$_}++, map normalise, @solutions;
于 2013-02-08T20:29:43.970 に答える
3

たとえば、可換演算の場合は、x @ ywhereのみを考慮してx <= yください。この方法2 * 17は可能ですが、そうで17 * 2はありません。

于 2013-02-08T20:07:12.077 に答える