Принцип перестановки голубей дырки

25

В игре судоку многим игрокам нравится «набирать» возможные числа, которые можно ввести в каждом квадрате:

Судоку ряд

Вышеуказанная строка может быть представлена ​​в виде массива:

[[1,2,9], [6], [5], [7], [1,2,9], [1,2,9], [3], [1,2,4], [8]]

Теперь обратите внимание, что есть только 1 место, куда 4можно пойти. Это позволяет нам упростить приведенный выше список до:

[[1,2,9], [6], [5], [7], [1,2,9], [1,2,9], [3], [4], [8]]

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

В качестве другого примера, допустим, у вас есть следующий массив возможностей:

[[0,1,3], [0,2,3], [1,2], [1,2]]

Последние два места должны быть заполнены 1 и 2. Следовательно, мы можем удалить эти возможности из первых двух элементов в массиве:

[[0,3], [0,3], [1,2], [1,2]]

В качестве другого примера:

[[0,1,2,3], [0,2], [0,2], [0,2]]

Его невозможно построить перестановку из вышеперечисленных возможностей, поскольку есть только 1 место для обоих 1и 3, и вы хотите вернуть пустой массив.

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

  • Если конкретный массив невозможен, вам нужно либо вернуть пустой массив, либо массив, в котором один из подмассивов пуст.
  • Можно предположить, что массив будет правильно сформирован и будет содержать как минимум 1 элемент.
  • Учитывая массив размера N, вы можете предположить, что числа в подмассиве всегда будут в диапазоне [0:N), и чтоN <= 10
  • Вы не можете предполагать, что будет присутствовать каждый номер от 0доN-1
  • Вы можете предположить, что числа в пределах одного подмассива являются уникальными.
  • Если подмассив содержит только одну возможность, вы можете представить эту возможность в массиве или отдельно. [[1],[2],[0]], [1,2,0], [[1,2],0,[1,2]]Все в силе.
  • Вы можете принять массив либо в приемлемом строковом формате, либо в формате списка / массива.
  • Подмассивы могут быть в любом порядке.
  • Вместо того, чтобы иметь дело с рваными массивами, вы можете заполнить пустые места -1.

Контрольные примеры

[[0]]                                         -> [[0]]
[[1],[0]]                                     -> [[1],[0]]
[[1],[1]]                                     -> []
[[1],[0,1]]                                   -> [[1],[0]]
[[0,1,2],[1,2],[1,2]]                         -> [[0],[1,2],[1,2]]
[[0,1],[1,2],[0,2]]                           -> [[0,1],[1,2],[0,2]]
[[2,1],[1,2],[1,2]]                           -> []
[[0,3],[2,1],[3,0],[3,2]]                     -> [[0,3],[1],[0,3],[2]]
[[0,1],[0,1],[2,3],[2,3,0]]                   -> [[0,1],[0,1],[2,3],[2,3]]
[[0,1],[0,3],[3,2],[0]]                       -> [[1],[3],[2],[0]]
[[3,5,2],[0,2,4],[4,0],[0,1,3,5],[2,1],[2,4]] -> [[3,5],[0,2,4],[4,0],[3,5],[1],[2,4]]
[[6,9,8,4],[4,5],[5,3,6],[3,8,6,1,4],[3,1,9,6],[3,7,0,2,4,5],[9,5,6,8],[6,5,8,1,3,7],[8],[8,0,6,2,5,6,3]] -> [[6,9,4],[4,5],[5,3,6],[3,6,1,4],[3,1,9,6],[0,2],[9,5,6],[7],[8],[0,2]]
[[3,5,0],[5,7],[5,1,2],[1,3,0],[5,3],[5,0],[5,3,7,8,0,6],[7,5,0,1,8],[1,0,8],[0,6]] -> []
[[9,0,2,3,7],[0,7,6,5],[6,9,4,7],[9,1,2,3,0,5],[2,8,5,7,4,6],[6,5,7,1],[5,9,4],[5,9,3,8,1],[5,0,6,4],[0,7,2,1,3,4,8]] -> [[9,0,2,3,7],[0,7,6,5],[6,9,4,7],[9,1,2,3,0,5],[2,8,5,7,4,6],[6,5,7,1],[5,9,4],[5,9,3,8,1],[5,0,6,4],[0,7,2,1,3,4,8]]
[[2,6,0],[0,4,3],[0,6,2],[0,7],[0,9,2,3,6,1,4],[1,7,2],[2,7,8],[8,6,7],[6,5,2,8,0],[5,8,1,4]] -> [[2,6,0],[3],[0,6,2],[0,7],[9],[1],[2,7,8],[8,6,7],[5],[4]]
[[8],[8,0,6,5,7,2,4,1],[8,6,9,3,5,0,7],[3,9,1,0],[9],[9,2,6],[2,8,3],[3,1,6,8,2],[6],[6,4,5,3,0,7]] -> [[8],[5,7,4],[5,7],[0],[9],[2],[3],[1],[6],[4,5,7]]
[[8,1,0],[5,8,7,6,2,0],[6,8,2],[2,4,0,9],[4,1,7,3,6,8],[8,1],[8,0,3],[0,8,2],[0,8,3],[1,8,0]] -> []

Это поэтому делайте ваши ответы как можно короче!

Натан Меррилл
источник
Любое число больше 9?
Утренняя монахиня
Вам не нужно поддерживать числа больше 9.
Натан Меррилл
Могу ли я вернуться с дубликатами в подмассивах?
Утренняя монахиня
@ LeakyNun нет. Подмассивы могут содержать только уникальные элементы.
Натан Меррилл
Я думаю, у вас есть некоторые ошибки в вашем четвертом тесте; один из подсписков заключен в квадратные скобки.
TheBikingViking

Ответы:

17

Брахилог , 21 байт

:1fz:da|,[]
:2a#d
:Am

Попробуйте онлайн!

Попробуйте онлайн!

Предикат 0 (основной предикат)

:1fz:da|,[]
:1f            Find all solutions of Predicate 1 using Input as Input.
   z           Transpose
    :da        Deduplicate each.
       |,[]    If there is no solution, return [] instead.

Предикат 1 (вспомогательный предикат 1)

:2a#d
:2a     Each element of Output satisfies Predicate 2 with each element of Input as Input
   #d   Each element is different

Предикат 2 (вспомогательный предикат 2)

:Am     Output is member of Input
Дрянная Монахиня
источник
8

Желе , 10 байт

Œp⁼Q$ÐfZQ€

Попробуйте онлайн!

Œp⁼Q$ÐfZQ€   Main chain, argument: z

Œp           Cartesian product
  ⁼Q$Ðf      Filter for those that remain unchanged when uniquified
       Z     Transpose
        Q€   Uniquify each subarray
Дрянная Монахиня
источник
Кажется немного неискренним требовать 10 байтов, когда Jelly использует символы за пределами latin1. Представленная как UTF-8, приведенная выше последовательность требует 16 байтов.
Крис Бекк
1
@ChrisBecke Jelly имеет свою собственную кодировку
Робин Гертенбах
И еще - попробую онлайн! - Мне нужно отправить 16 байтов.
Крис Бекк
@ChrisBecke Да, но если вы загрузите Jelly, вам нужно будет написать только 10-байтовую программу.
Утренняя монахиня
И сохранить его в текстовом файле, который я не могу редактировать ни с чем, кроме Jelly? По этому аргументу, если Jelly сжал свою программу, мы должны считать только сжатые байты?
Крис Бекк
7

Pyth , 11 байт

{MC{I#.nM*F

Попробуйте онлайн!

{MC{I#.nM*F
         *F  reduce by Cartesian product
             produces nested arrays
      .nM    flatten each
   {I#       filter for invariant under deduplication
  C          transpose
{M           deduplicate each
Дрянная Монахиня
источник
6

Haskell, 100 байт

import Data.List
p z=map nub$transpose$filter(and.(flip$zipWith elem)z)$permutations[0..length z-1]
Джефф Риди
источник
Отличное решение! and.flip(zipWith elem)zкороче
Дэмиен
2

Python 3, 101 99 байт

Спасибо @TLW за -2 байта

from itertools import*
lambda x:list(map(set,zip(*[i for i in product(*x)if len(i)==len(set(i))])))

Анонимная функция, которая принимает входные данные через аргумент списка списков и возвращает список множеств.

Как это работает

from itertools import*        Import Python's library for iterator generation
lambda x                      Anonymous function with input possibilities x as a
                              list of lists
...for i in product(*x)...    For i in the Cartesian product of x, ie all candidate
                              arrangements:
[...if len(i)==len(set(i))]    Filter into list by non-duplicity (set removes
                               duplicates, so there are no duplicates if the length
                               of i is the same as the length of the set of
                               the elements of i)
zip(*...)                     Unpack and take the transpose, leaving the modified
                              possibilities with duplicates
map(set,...)                  Remove duplicates
:list(...)                    Return the modified possibilities as a list of sets

Попробуйте это на Ideone

TheBikingViking
источник
list(map(set,короче, я думаю
TLW
2

Mathematica, 46 байтов

Union/@Thread@Select[Tuples@#,DuplicateFreeQ]&
alephalpha
источник
0

PHP, 245 231 байт

131 117 для функции декартового произведения, 114 для другого материала

function c($a){if ($a){if($u=array_pop($a))foreach(c($a)as$p)foreach($u as$v)yield $p+[count($p)=>$v];}else yield[];}
function p($a){foreach(c($a)as$i)if(max(array_count_values($i))<2)foreach($i as$k=>$v)$r[$k][$v]=$v;return$r?:[];}

Я столкнулся с проблемами с памятью в некоторых тестовых случаях с рекурсивной функцией для декартового произведения. Работал лучше с этим классом генератора и function c($a){$b=[];foreach($a as$i)$b[]=new \ArrayIterator($i);return new CartesianProductIterator($b);}.
Но мой генератор короче и выполняет ту же работу.

Однако более крупные примеры приводят к внутренней ошибке сервера (как с итератором, так и с генератором) через некоторое время на моей машине. На данный момент нет времени проверять логи сервера, к сожалению.

Titus
источник