KenKen Puzzle Helper - Отбрасывание последовательностей без порядка

Aug 19 2020

В следующем примере я генерирую все варианты $9 \times 9$ Головоломки KenKen, которые разбиты на группы по три человека, с использованием сложения, которое приводит к$18$.

  data = Select[Tuples[Range[9], 3], Plus @@ # == 18 &]

Это порождает

$\{\{1,8,9\},\{1,9,8\},\{2,7,9\},\{2,8,8\},\{2,9,7\},\{3,6,9\},\{3,7,8\},\{3,8,7\},\{3,9,6\},\{4,5,9\},\{4,6,8\},\{4,7,7\},\{4,8,6\},\{4,9,5\},\{5,4,9\},\{5,5,8\},\{5,6,7\},\{5,7,6\},\{5,8,5\},\{5,9,4\},\{6,3,9\},\{6,4,8\},\{6,5,7\},\{6,6,6\},\{6,7,5\},\{6,8,4\},\{6,9,3\},\{7,2,9\},\{7,3,8\},\{7,4,7\},\{7,5,6\},\{7,6,5\},\{7,7,4\},\{7,8,3\},\{7,9,2\},\{8,1,9\},\{8,2,8\},\{8,3,7\},\{8,4,6\},\{8,5,5\},\{8,6,4\},\{8,7,3\},\{8,8,2\},\{8,9,1\},\{9,1,8\},\{9,2,7\},\{9,3,6\},\{9,4,5\},\{9,5,4\},\{9,6,3\},\{9,7,2\},\{9,8,1\}\}$

Затем я могу что-то сделать для поиска повторяющихся случаев без заказа

  Cases[data, {OrderlessPatternSequence[1, 8, 9]}]

Это генерирует (я хочу удалить все, что после $198$ из данных, но делать это для каждого уникального набора из трех цифр).

$$\{\{1,8,9\},\{1,9,8\},\{8,1,9\},\{8,9,1\},\{9,1,8\},\{9,8,1\}\}$$

У этого подхода есть два недостатка: мне нужно было знать последовательность, которую нужно проверить, а затем я могу использовать это, чтобы удалить все повторы из данных. Мне пришлось бы повторить это для следующей уникальной последовательности.

Есть ли простой способ создать

 data2 = some_fancy_command[data]

Он производит data2 (обратите внимание - меня тоже не интересуют запятые), которые имеют только уникальные 3-значные числа независимо от порядка

$$\{\{189\},\{279\},\{288\}\},\{369\},\{378\}\}... $$

Как это сделать проще всего?

Обратите внимание, что я знаком с https://community.wolfram.com/groups/-/m/t/478684/, но нужен только помощник, а не решатель.

В сторону: Моя цель - создать инструмент, который эффективно дублирует https://homepages.bluffton.edu/~nesterd/apps/kenkenhelp.html как, возможно, CDF просто записной книжки для ММА, где я ввожу все клетки, их тип, размер пазла, и он дает подсказки по всем числам, которые могут войти в клетку.

Ответы

2 flinty Aug 19 2020 at 03:31
triples = Select[Sort /@ IntegerPartitions[18,{3},Range[9]], DuplicateFreeQ]

FromDigits /@ triples
(* {189, 279, 369, 459, 378, 468, 567} *)

Если вы разрешаете повторные номера, то:

FromDigits@*Sort /@ IntegerPartitions[18, {3}, Range[9]]
(* {189, 279, 369, 459, 288, 378, 468, 558, 477, 567, 666} *)