Este desafio é baseado no jogo Layerz.
Dado, no stdin ou como argumento de função, uma matriz retangular de células 2D em que cada célula contém um espaço em branco (você pode optar por usar 0s em vez de espaços em branco sem penalidade), 1, 2, 3 ou 4 ; encontre uma maneira de dividi-lo em regiões válidas (conforme definido abaixo), de modo que cada célula não em branco esteja contida em exatamente uma região. Em seguida, imprima a solução encontrada em qualquer formato razoável. Se não houver solução, pare sem produzir saída ou produza um único valor de falsey e pare.
Qualquer um dos seguintes constitui uma região válida:
- Uma única célula contendo 1
- Uma célula contendo um 2 e exatamente um de seus vizinhos ortogonais não vazios
- Uma célula contendo um 3 e exatamente dois de seus vizinhos ortogonais não vazios
- Uma célula contendo 4 e exatamente três de seus vizinhos ortogonais não vazios
Isso é código-golfe , então a resposta mais curta e válida, em bytes, vence.
Alguns casos de teste:
1. Um tanto trivial:
E esta é a solução, com cada região em uma cor diferente:
2. Mais interessante
Este tem mais de uma solução, mas aqui está um deles:
3. Um menor, contendo espaços em branco, que não possui soluções (dependendo de você usar um dos dois para "capturar" os três ou os três para capturar dois dos dois, você fica com um par de dois não adjacentes [e, portanto, não agrupáveis] ou um único dois por si só):
Como essa grade não tem soluções, seu programa deve parar sem produzir nenhuma saída quando receber essa grade.
4. Esta (com as duas principais deslocadas uma célula para a esquerda) possui uma solução:
Solução:
(O canto inferior direito 2 é usado para "capturar" os 3)
5. Porque precisávamos de um caso de teste com alguns quatro:
Uma solução:
fonte
4
s se essas são entradas válidas.Respostas:
Eu sei que esse desafio tem mais de um ano, mas eu o encontrei em "sem resposta" e me pareceu bastante interessante.
Supondo que o número da célula "raiz" seja o único significativo em cada região (dedutível nos exemplos), aqui está minha solução de retorno:
Python 3 ,
355351349 bytesExperimente online!
O formato de entrada é uma lista 2D de números inteiros, em branco como zero, e o formato de saída também é uma lista 2D de números inteiros representando uma região por número. O número da região começa em um; zero é reservado para células em branco (como na entrada). Se a entrada fornecida for insolúvel, a função retornará zero único (valor falso).
Por exemplo, o caso de teste 5 é inserido como
e a saída é
Ungolfed, com comentários:
Experimente online!
Nota: Este é um caso especial de Set Packing que é conhecido por ser NP-complete. Esse problema específico tem tamanho de conjunto limitado (máx. 4) e existem algoritmos de aproximação para encontrar o conjunto "bom" de conjuntos em tempo polinomial, mas eles não garantem o conjunto máximo possível de conjuntos (o que é estritamente necessário neste problema).
fonte