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!


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

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

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

6

Haskell, 100 bytes

import Data.List
p z=map nub$transpose$filter(and.(flip$zipWith elem)z)$permutations[0..length z-1]

Ó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


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

2

Mathematica, 46 bytes

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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.