2013-02-08 2 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 

Мой учитель считает эти математически одинаковыми, и поэтому все четыре из них - всего лишь одно решение. Я не могу понять, как это сделать, найти эти «дубликаты» и удалить их. Любая помощь приветствуется, спасибо.

ответ

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

+0

@jwodder, исправлено. – ikegami

+0

Мне очень нравится это решение, но я не могу изменить его формат. Прямо сейчас он вернет что-то вроде «3 + 10 = 13 1 + 4 = 5; 13-5 = 8», однако я бы предпочел, чтобы он вернул «10 + 3 = 13; 4 + 1 = 5; 1-5 = 8 « Я попытался отредактировать его сам, изменив тройную проверку и значения, но я не могу понять решение (я чувствую себя довольно глупо ...) –

3

Например, для коммутативных операций учитывайте только x @ y, где x <= y. Таким образом, 2 * 17 возможен, но 17 * 2 нет.

Смежные вопросы