O princípio do buraco de pombos de permutação

25

No jogo do sudoku, muitos jogadores gostam de "escrever" os possíveis números que podem aparecer em cada quadrado:

Linha Sudoku

A linha acima pode ser representada como uma matriz:

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

Agora, observe que há apenas 1 lugar para onde um 4pode ir. Isso efetivamente permite simplificar a lista acima para:

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

O objetivo desse desafio é fazer uma lista de possíveis números em uma permutação e deduzir quais possibilidades podem ser eliminadas .

Como outro exemplo, digamos que você tenha o seguinte conjunto de possibilidades:

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

Os dois últimos locais devem ser preenchidos com 1 e 2. Portanto, podemos remover essas possibilidades dos dois primeiros elementos da matriz:

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

Como outro exemplo:

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

É impossível construir uma permutação a partir das possibilidades acima, pois há apenas 1 local para ambos 1e 3, e você gostaria de retornar um array vazio.

Você precisa inserir uma lista de possibilidades e gerar as possibilidades restantes após a eliminação do número máximo de possibilidades.

  • Se uma matriz específica for impossível, você precisará retornar uma matriz vazia ou uma matriz em que um dos sub-arranjos esteja vazio.
  • Você pode supor que a matriz será bem formada e tenha pelo menos 1 elemento.
  • Dada uma matriz de tamanho N, você pode assumir que os números na sub- matriz sempre estarão no intervalo [0:N)e queN <= 10
  • Você não pode assumir que todos os números de 0até N-1estarão presentes
  • Você pode supor que os números em uma única sub-matriz sejam únicos.
  • Se uma sub-matriz contiver apenas uma única possibilidade, você poderá representar a possibilidade em uma matriz ou por si só. [[1],[2],[0]], [1,2,0], [[1,2],0,[1,2]]São todos válidos.
  • Você pode aceitar a matriz em um formato de sequência razoável ou em formato de lista / matriz.
  • Os subarrays podem estar em qualquer ordem.
  • Em vez de lidar com matrizes irregulares, você pode preencher lugares vazios com -1.

Casos de teste

[[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]] -> []

Este é um portanto, faça suas respostas o mais curtas possível!

Nathan Merrill
fonte
Algum número maior que 9?
Leaky Nun
Você não precisa de números de suporte maior que 9.
Nathan Merrill
Posso retornar com duplicatas em sub-matrizes?
Leaky Nun
@LeakyNun no. As sub-matrizes podem conter apenas elementos exclusivos.
Nathan Merrill
Eu acho que você tem alguns erros no seu quarto caso de teste; uma das sublistas está entre colchetes duplos.
TheBikingViking 23/08

Respostas:

17

Braquilog , 21 bytes

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

Experimente online!

Experimente online!

Predicado 0 (predicado principal)

: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.

Predicado 1 (predicado auxiliar 1)

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

Predicado 2 (predicado auxiliar 2)

:Am     Output is member of Input
Freira Furada
fonte
8

Gelatina , 10 bytes

Œp⁼Q$ÐfZQ€

Experimente online!

Œ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
Freira Furada
fonte
Parece um pouco falso reivindicar 10 bytes quando o Jelly usa caracteres fora do latin1. Representada como UTF-8, a sequência acima requer 16 bytes.
Chris Becke
1
@ChrisBecke Jelly tem seu próprio conjunto de caracteres
Robin Gertenbach
E ainda - se eu tentar online! - Eu preciso enviar 16 bytes.
Chris Becke
@ChrisBecke Sim, mas se você baixar o Jelly, precisará apenas escrever um programa de 10 bytes.
Freira vazada
E salve-o em um arquivo de texto que não consigo editar com nada além de Jelly? Por esse argumento, se o Jelly compactou seu programa, devemos contar apenas os bytes compactados?
precisa saber é o seguinte
7

Pitão , 11 bytes

{MC{I#.nM*F

Experimente online!

{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
Freira Furada
fonte
6

Haskell, 100 bytes

import Data.List
p z=map nub$transpose$filter(and.(flip$zipWith elem)z)$permutations[0..length z-1]
Geoff Reedy
fonte
Ótima solução! and.flip(zipWith elem)zé mais curto
Damien
2

Python 3, 101 99 bytes

Graças a @TLW por -2 bytes

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

Uma função anônima que recebe entrada via argumento de uma lista de listas e retorna uma lista de conjuntos.

Como funciona

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

Experimente no Ideone

TheBikingViking
fonte
list(map(set,é mais curto, eu acho
TLW 23/08
2

Mathematica, 46 bytes

Union/@Thread@Select[Tuples@#,DuplicateFreeQ]&
alefalpha
fonte
0

PHP, 245 231 bytes

131 117 para a função do produto cartesiano, 114 para o outro material

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?:[];}

Encontrei problemas de memória em alguns casos de teste, com uma função recursiva para o produto cartesiano. Funcionou melhor com esta classe de gerador e function c($a){$b=[];foreach($a as$i)$b[]=new \ArrayIterator($i);return new CartesianProductIterator($b);}.
Mas meu gerador é mais curto e faz o mesmo trabalho.

Os exemplos maiores, no entanto, resultam em um erro interno do servidor (tanto com o iterador quanto com o gerador) depois de um tempo na minha máquina. Atualmente, não há tempo para verificar os logs do servidor, infelizmente.

Titus
fonte