Решил от нечего делать набросать скриптик (за 10-15 мин.), облегчающий жизнь разгадывателям судоку.В итоге 2 ночи не могу решить вроде бы простенькую задачу. Суть:
показать все возможные комбинации цифр (1..9), чья сумма == заданной.
Напр.: какие 3 уникальные цифры составляют в сумме "23"? Ответ: "689"
Напр.: какие 2 уникальные цифры составляют в сумме "6"? Ответ: "15","24"скрипту передается 3 параметра:
1) требуемая сумма.
2) кол-во используемых цифр.
3) список цифр, которые нельзя использовать. (через запятую)
Напр.: script.pl 33 6 7,8 = какая комбинация неповторяющихся "6" цифр составляет сумму "33", если известно, что среди них нет "7 и 8"?#!/usr/bin/perl
@p = @ARGV;;
$sum = int $p[0]; # требуемая сумма
$n = int $p[1]; # кол-во цифр для суммы
$not = $p[2]; # 3-й параметр - через запятую перечисляются неиспользуемые цифры
@not = split(',',$not);
foreach $not (@not) { $not{$not} =1; }
# сделали %not - там ключи=цифры, которые нельзя использовать при составлении суммы.
-----
а дальше?
А вот что дальше?
> А вот что дальше?Есть ли решение, чтобы просто вывести комбинации цифр (без сравнения: на сумму, на повторяющиеся цифры): просто набор: напр. все комбинации из 3-х цифр:
111
112
113
...
121
122
...
211
212
213
...
Я даже этого счас не могу осилить....
#!/usr/bin/perl@p = @ARGV;;
$sum = int $p[0]; # требуемая сумма
$n = int $p[1]; # кол-во цифр для суммы
$not = $p[2]; # 3-й параметр - через запятую перечисляются неиспользуемые цифры
@not = split(',',$not);
foreach $not (@not) { $not{$not} =1; }
# сделали %not - там ключи=цифры, которые нельзя использовать при составлении суммы.
#-----sub sudoku {
my $start = shift;
my $_numbers = shift; #найденные цифры
my $_current_sum = shift; #сумма найденных цифр
my $n = shift; #кол-во оставшихся цифр
for (my $i=$start; $i<10; $i++)
{
next if $not{$i} == 1;
if ($n > 1) { sudoku($i + 1, join('', ($_numbers, $i)), $_current_sum + $i, $n - 1); }
elsif ($_current_sum + $i == $sum) { print "${_numbers}${i}\n"; }
}
}sudoku(1, '', 0, $n, $not);
СПАСИБО!!!!!!!
Внес только такие изменения:
-for (my $i=$start; $i<10; $i++)
+for my $i ($start..9)-next if $not{$i} == 1;
+next if $not{$i};# == 1; красивее так (imho): $not{$i} && next;СПАСИБО!!!!!!!