Anteriormente , defini o processo de esmagar uma matriz
Em uma paixonite, lemos a matriz da esquerda para a direita. Se em um ponto encontramos dois elementos iguais seguidos, removemos o primeiro e duplicamos o segundo.
Por exemplo, aqui está o processo de esmagar a seguinte matriz
[5,2,2,4]
^
[5,2,2,4]
^
[5,2,2,4]
^
[5,4,4]
^
[5,4,4]
^
[5,8]
^
Observe que o mesmo elemento pode ser recolhido várias vezes. No exemplo 2,2,4
foi recolhido 8
em uma única passagem.
Agora, esmagar matrizes é fácil, o difícil é esmagá-las. Sua tarefa é pegar uma matriz de números inteiros positivos como entrada e gerar a maior matriz que pode formar a entrada quando pressionada repetidamente. Por exemplo, a matriz [4]
é formada por esmagamento, [2,2]
que por sua vez é formado por esmagamento [1,1,1,1]
. Como não podemos ter valores não inteiros, [1,1,1,1]
não podemos mais ser esmagados e, portanto, é a nossa resposta.
Você nunca receberá um 0
em sua matriz de entrada porque essas matrizes podem ser expandidas indefinidamente. Você também nunca receberá um caso com dois do mesmo número ímpar um ao lado do outro; esses casos não podem ser o resultado de uma trituração.
Isso é código-golfe, então as respostas serão pontuadas com o tamanho da fonte medido em bytes, com menos bytes sendo melhores.
Antes de começar a responder, quero apenas dizer que esse desafio é significativamente mais difícil do que parece. Verifique sua intuição à medida que avança e verifique se sua resposta passa em todos os casos de teste.
Casos de teste
[] -> []
[5] -> [5]
[6] -> [3,3]
[8] -> [1,1,1,1,1,1,1,1]
[4,8] -> [1,1,1,1,1,1,1,1,1,1,2]
[2,8] -> [1, 1, 1, 1, 2, 1, 1, 1, 1]
[4,4] -> [1,1,1,1,1,1,1,1]
fonte
[1,1,1,1,1,1,1,1,1,1,2]
produzir em[4, 8]
vez de[8, 4]
? deve ser isso[1,>1,1,1,1,1,1,1,1,1,2]
,[2,1,>1,1,1,1,1,1,1,2]
,[2,>2,1,1,1,1,1,1,2]
,[4,1,>1,1,1,1,1,2]
,[4,2,1,>1,1,1,2]
,[4,2,>2,1,1,2]
,[4,>4,1,1,2]
,[8,1,>1,2]
,[8,2,>2]
,[8,4]
?[1,>1,1,1,1,1,1,1,1,1,2]
,[2,>1,1,1,1,1,1,1,1,2]
,[2,1,>1,1,1,1,1,1,1,2]
,[2,2,>1,1,1,1,1,1,2]
,[2,2,1,>1,1,1,1,1,2]
,[2,2,2,>1,1,1,1,2]
,[2,2,2,1,>1,1,1,2]
,[2,2,2,2,>1,1,2]
,[2,2,2,2,1,>1,2]
,[2,2,2,2,2,>2]
,[2,2,2,2,4>]
, segunda passagem:[2,>2,2,2,4]
,[4,>2,2,4]
,[4,2,>2,4]
,[4,4,>4]
,[4,8>]
. Espero que isso esclareça. Se você deseja que algum código veja a pergunta anterior, tem respostas que implementam uma função de esmagamento.[4, 4]
deve ser removido, pois nunca podemos obter esse array após uma sequência de alongamento => esmagamento, pois isso terminará com[8]
Respostas:
JavaScript (Node.js) ,
237221213186 bytesExperimente online!
Esse algoritmo calcula matrizes esticadas ideais, estendendo cada número ao máximo e, se necessário, retalha um par de números no lugar certo, criando efetivamente um "bloqueador de esmagamento", interrompendo a sequência de esmagamento do número anterior.
Por exemplo:
[1, 1, 1, 1, 1, 1]
dá[4,2]
uma vez esmagado, mas[1, 1, 1, 1, 2]
resulta em[2, 4]
O desafio é determinar onde exatamente um bloqueador de esmagamento deve ser colocado, para que o esmagamento da matriz resultante dê o resultado certo:
[2, 4]
exige um bloqueador de esmagamento (o número é esticado1
, repetido, e[1, 1]
é mais curto do que[1,1,1,1]
), mas[4, 2]
e[2, 6]
não requerem umn
a sequência esticada anterior e se a condição acima for verificada, a sequência atual será uma repetição dan
sequência. Para interromper a sequência de esmagamento do número anterior, precisamos colocar o bloqueador de esmagamento no final da segundan
sequência do número atual para esticar. Exemplo:,[2, 8] => [(1, 1)=n, (1, 1) + (2) + (1, 1) + ...]
ou[4, 8] => [(1, 1, 1, 1)=n, (1, 1, 1, 1) + (1, 1, 2) + ...]
fonte
Geléia , 42 bytes
Experimente online!
Programa completo. Extremamente ineficiente, mas funciona.
fonte
Python 2 ,
230228226 bytesFunciona iterando todas as listas possíveis com a mesma soma que a entrada. Removendo aqueles que não são iguais à matriz de entrada em algum estado esmagado, selecionando o mais longo.
Editar: -2 bytes removendo o
if
na função principalEditar: -2 bytes removendo dois colchetes desnecessários
Experimente online!
Explicação
Função principal, responsável por encontrar todas as soluções possíveis e selecionar a mais longa
Função de esmagamento, que verifica se y é igual a um dos esmagamentos.
Gere todas as permutações possíveis com a soma fornecida
fonte
05AB1E ,
4137 bytesExperimente online!
Porta da minha solução Javascript.
Explicações:
fonte