Eu tenho uma pilha de meias limpas que quero separar em pares. Infelizmente, só posso tirar meias de cada extremidade da pilha, não do meio. Além disso, só posso remover da pilha um par correspondente de cada vez. Minha estratégia é primeiro dividir a pilha em uma ou mais pilhas menores. Eu acho que alguns exemplos deixarão isso claro. Vou representar cada meia como um número inteiro positivo (números inteiros correspondentes indicam meias iguais).
Se a pilha inicial de meias for
1 2 3 3 2 1
então não preciso fazer nenhuma divisão. Posso remover as duas 1
meias, depois as duas 2
meias e as duas 3
meias.
Se, em vez disso, a pilha inicial for
1 2 3 2 3 1
então eu tenho que dividi-lo primeiro porque não poderei emparelhar todas as meias apenas removendo-as do final. Uma possibilidade é dividi-lo em duas pilhas
1 2 3 and 2 3 1
Agora posso remover as 1
meias, saindo 2 3 and 2 3
, seguidas pelas 3
meias, saindo 2 and 2
e, finalmente, as 2
meias.
Seu emprego
Dada a pilha inicial de meias, escreva um programa que o divida em pilhas menores que me permitam classificar as meias. Seu programa deve dividir a pilha no menor número possível de pilhas (se houver várias melhores soluções, você precisará encontrar apenas uma).
A entrada será fornecida como uma lista, sequência delimitada ou outra forma conveniente. Ele conterá apenas números inteiros entre 1
e algum valor máximo n
, com cada número inteiro ocorrendo exatamente duas vezes.
A saída deve consistir na lista de entrada dividida em listas menores, fornecidas de qualquer forma conveniente.
Exemplos
Input Sample Output
1 1 1 1
1 2 1 2 1; 2 1 2
1 3 2 4 3 2 1 4 1 3 2; 4 3 2 1 4
1 2 3 4 3 4 1 2 1; 2 3; 4 3 4 1 2
1 1 2 2 3 3 1 1 2; 2 3 3
4 3 4 2 2 1 1 3 4 3 4 2; 2 1 1 3
Observe que essa não é a única saída permitida para a maioria dessas entradas. Para o segundo caso, por exemplo, as saídas 1 2; 1 2
ou 1 2 1; 2
também seriam aceitas.
Obrigado ao Sp3000 por algumas sugestões de teste!
Eu odeio gastar muito tempo escolhendo minhas roupas, então faça seu código o mais curto possível. Menor resposta em bytes ganha!
Notas
- Não quero ter que olhar atrás de uma meia para ver se o par correspondente está lá; portanto, não é permitido usar as duas meias do mesmo lado. Por exemplo, se a pilha estiver
1 1 2 2
, você não poderá deixá-la como uma pilha e tirar as duas1
meias da extremidade esquerda.
123213
poderia ser dividido em1; 23; 213
(1; 23; 213
->1; 2; 21
->; 2; 2
)?123213
usando apenas duas pilhas, sua resposta teria que dar uma das divisões de duas pilhas.Respostas:
Pitão, 25 bytes
Suíte de teste
Explicação:
fonte
JavaScript (ES6), 329
Não é uma tarefa fácil para um idioma que não possui componentes combinatórios.
Provavelmente um pouco mais jogável.
Nota: todas as partições têm pelo menos o tamanho 2, pois uma partição com um único elemento é sempre menos útil.
Explicação em partes
(é excessivamente detalhado, mas achei difícil de explicar - pule para "juntar tudo")
Uma função recursiva para enumerar todas as divisões possíveis de uma matriz
Agora, preciso de partições de tamanho 2 ou mais, portanto, devo usar esta função com parâmetros ligeiramente diferentes. O parâmetro v é "tamanho da matriz - número de partições desejadas - 1". Então eu devo construir as partições de uma maneira ligeiramente diferente.
Então, eu posso enumerar a lista de partições para nenhuma divisão, 1 divisão, 2 divisões e assim por diante. Quando encontro uma partição em funcionamento, pararei e exibirei o resultado encontrado.
Para verificar, verifique a lista de partições, observe os valores no início e no final de cada um, se houver um valor repetido e remova-o. Repita até que nada possa ser removido, afinal: se todos os pares foram removidos, esta partição é boa.
Em seguida, a parte que falta é apenas um loop para calibrar a função G, aumentando a contagem de partições. O loop sai quando um resultado é encontrado.
Coloque tudo junto
Teste
fonte