проблема
Рассмотрим квадрат 3 на 3 сетки неотрицательных целых чисел. Для каждой строки i
сумма целых чисел устанавливается равной r_i
. Аналогично для каждого столбца j
сумма целых чисел в этом столбце устанавливается равной c_j
.
Задача состоит в том, чтобы написать код для перечисления всех возможных различных назначений целых чисел в сетке с учетом ограничений суммы строк и столбцов. Ваш код должен выводить одно назначение за раз.
вход
Ваш код должен принимать 3 неотрицательных целых числа, указывающих ограничения строки, и 3 неотрицательных целых числа, указывающих ограничения столбца. Вы можете предположить, что они действительны, то есть, что сумма или ограничения строки равны сумме ограничений столбца. Ваш код может сделать это любым удобным для вас способом.
Выход
Ваш код должен выводить различные 2d сетки, которые он вычисляет, в любом удобочитаемом формате по вашему выбору. Чем красивее, тем лучше, конечно. Вывод не должен содержать дублирующихся сеток.
пример
Если все ограничения строки и столбца точно, 1
то есть только 6
разные возможности. Для первой строки вы можете поместить 1
любой из первых трех столбцов, для второй строки теперь есть 2
альтернативы, и последняя строка теперь полностью определяется двумя предыдущими. Все остальное в сетке должно быть установлено на 0
.
Скажем, ввод 2 1 0
для строк и 1 1 1
столбцов. Используя прекрасный выходной формат APL, возможные целые сетки:
┌─────┬─────┬─────┐
│0 1 1│1 0 1│1 1 0│
│1 0 0│0 1 0│0 0 1│
│0 0 0│0 0 0│0 0 0│
└─────┴─────┴─────┘
Теперь скажите, что ввод 1 2 3
для строк и 3 2 1
столбцов. Возможные целочисленные сетки:
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│0 0 1│0 0 1│0 0 1│0 1 0│0 1 0│0 1 0│0 1 0│1 0 0│1 0 0│1 0 0│1 0 0│1 0 0│
│0 2 0│1 1 0│2 0 0│0 1 1│1 0 1│1 1 0│2 0 0│0 1 1│0 2 0│1 0 1│1 1 0│2 0 0│
│3 0 0│2 1 0│1 2 0│3 0 0│2 1 0│2 0 1│1 1 1│2 1 0│2 0 1│1 2 0│1 1 1│0 2 1│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
источник
Шелуха ,
2017 байт-3 байта благодаря @ H.PWiz
Принимает ввод как список,
xs
кодирующий ограничения[r_1,r_2,r_3,c_1,c_2,c_3]
, попробуйте это онлайн!объяснение
Метод грубой силы: P Создайте все сетки 3x3 с записями
[0..max xs]
:источник
Брахилог , 17 байт
Попробуйте онлайн!
ВНИМАНИЕ: УРОЧНЫЙ ВЫХОД! Не волнуйтесь, это все еще читается человеком, я не обязан учитывать, сколько. ;)
По какой-то причине это должно быть намного дольше, чем я ожидал бы иметь смысл (13 байт):
Эта последняя версия, если бы она работала, взяла бы ввод из вывода (то есть аргумента командной строки).
источник
Python 2 ,
149,145,142,141,138,136 байт.Попробуйте онлайн!
Вводит в виде списка списков:
[[r1, c1], [r2, c2], [r3, c3]]
источник
Haskell,
94888479 байтовПринимает суммы строк и столбцов в виде одного плоского списка из 6 элементов
[r1,r2,r3,c1,c2,c3]
.Попробуйте онлайн!
Поскольку элементы тестируемых матриц увеличиваются до суммы
r
, код не завершается в разумные сроки для больших сумм строк / столбцов. Вот версия, максимальная скоростьr
которой выше, но длиннее на 4 байта: попробуйте онлайн!источник
Mathematica, 81 байт
находит все матрицы 3x3 с элементами 0..Max и выбирает правильные,
это означает, что
(Max+1)^9
матрицы должны быть провереныПопробуйте онлайн!
источник
Grid
также работаю с TIO, используяToString
. Попробуйте онлайн!R ,
115110 байтПопробуйте онлайн!
Принимает ввод как
c(r1,r2,r3,c1,c2,c3)
, одиночныйvector
, и печатает матрицы в стандартный вывод.Это очень похоже на ответ APL Уриэля , но генерирует сетки 3x3 несколько иначе.
Пусть
M=max(S)
он генерирует вектор0:M
, затемrep
съедает его 9 раз, т.е.[0..M, 0...M, ..., 0...M]
девять раз. Затем он выбирает все комбинации этого нового вектора, взятые по 9 за раз, используяmatrix, 3, 3
для преобразования каждую 9-комбинацию в3x3
матрицу и заставляяsimplify=F
возвращать список, а не массив. Затем он унифицирует этот список и сохраняет его какm
.Затем он отфильтровывает
m
те, где суммы строк / столбцов идентичны входным данным, печатает те, которые есть, и ничего не делает для тех, которые не являются.Так как он вычисляет
choose(9*(M+1),9)
различные возможные сетки (больше, чем(M+1)^9
возможности), он исчерпает память / время быстрее, чем более эффективный (но менее гениальный) ответ ниже:R 159 байт
Попробуйте онлайн!
источник
MATL ,
3522 байта-13 байт благодаря Луису Мендо
Попробуйте онлайн!
Ссылка на версию кода, которая печатается немного приятнее; эта версия будет просто печатать все матрицы с одной новой строкой между ними.
Принимает вход как
[c1 c2 c3 r1 r2 r3]
.Очевидно, что это вычисляет декартово мощность
X^
из0...max(input)
с показателем9
, и транспонирование!
. Затем он"
перебирает столбцы, изменяя@
форму каждого из них как матрицу 3х33e
, дублируяt
, перемещая!
и объединяя их по горизонталиh
. Затем он вычисляет суммы столбцовs
, которые приведут к вектору[c1 c2 c3 r1 r2 r3]
. Мы делаем поэлементное равенство с входомG=
, и если?
все они отличны от нуля, мы восстанавливаем правильную матрицу, выбирая вход для функции!
, используя4M
.источник
Пакетный, 367 байт
Верхний левый квадрат 2 × 2 приводит к получению результата, поэтому лучший подход состоит в том, чтобы сгенерировать все значения для верхнего левого целого числа, все допустимые значения для суммы верхнего левого и верхнего среднего целого числа, все действительные значения для суммы верхнего левое и среднее левое целое число, и вычислите диапазон допустимых значений для среднего целого числа, затем, пройдя все соответствующие диапазоны, рассчитайте оставшиеся значения из ограничений.
источник
Python 2 , 118 байт
Попробуйте онлайн!
Python 2 , 123 байта
Попробуйте онлайн!
источник