2013-02-08 34 views
0

我做了一個程序,將採取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 

我的老師認爲這些數學一樣,因此他們四個都只是1解決方案。我無法弄清楚如何做的是找到這些「重複」並刪除它們。任何幫助表示讚賞,謝謝。

回答

3

一個更通用的,你使用的dedupping代碼的形式是

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; 
+0

我相信你想比較是'$ 1 <$ 3',而不是'$ 1 <$ 2'。 – jwodder 2013-02-08 20:33:50

+0

@jwodder,固定。 – ikegami 2013-02-08 20:40:10

+0

我真的很喜歡這個解決方案,但我似乎無法編輯它的格式。現在它會返回類似「3 + 10 = 13 1 + 4 = 5; 13-5 = 8」的值,但是我希望它返回「10 + 3 = 13; 4 + 1 = 5; 1-5 = 8 「 我試圖通過改變三元檢查和值自己編輯它,但我似乎無法找出解決方案(我覺得很愚蠢......) – 2013-02-08 21:20:36

3

例如,對於交換操作,只考慮x @ y,其中x <= y。這樣,2 * 17是可能的,但17 * 2不是。