Vamos definir o processo de esmagar uma matriz de números. 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,3]
^
[5,2,2,3]
^
[5,2,2,3]
^
[5,4,3]
^
[5,4,3]
^
O mesmo elemento pode ser dobrado múltiplas vezes, por exemplo, [1,1,2]
torna-se [4]
quando esmagado.
Nós chamaremos uma matriz de inutilizável quando o processo de esmagar essa matriz não a alterar. Por exemplo, [1,2,3]
ainda está [1,2,3]
depois de ser esmagado.
Sua tarefa é obter uma matriz e determinar o número de esmagamentos necessários para torná-la inescrutável. Você precisa apenas suportar números inteiros no intervalo de 0 a 2 32 -1
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
Casos de teste
[1] -> 0
[1,1] -> 1
[2,1,1] -> 2
[4,2,1,1] -> 3
[2,2,2,1,1] -> 3
[0,0,0,0] -> 1
[4,0,0,0,4] -> 1
[4,0,0,0,0,4] -> 1
[] -> 0
fonte
[1,1,2,4,8]
retornar 1 ou 4?0,0,0,0
era só1
. Pode ser uma idéia mencionar explicitamente em algum lugar que estamos contando o número de vezes que precisamos percorrer um array para esmagá-lo completamente e não , como eu pensava inicialmente, o número total de vezes que esmagamos dois números juntos.Respostas:
montagem x86 (64 bits),
6665 bytesAs instruções das cordas foram úteis. Ter que corrigir erros off-by-one em um ambiente de 64 bits não era.
Código fonte totalmente comentado:
Eu posso tentar fazer isso em 32 bits, mesmo que por diversão, já que esses prefixos REX realmente me mataram.
Edit: raspou um byte, substituindo lodsq por add,% rdx por% rax e recolhendo dois cld's em um.
fonte
Pitão , 22 bytes
Verifique todos os casos de teste.
fonte
Haskell , 66 bytes
Experimente online!
Explicação
f
é uma função que esmaga uma lista. Ele executa a quebra conforme descrito na pergunta.g
é uma função que conta o número de esmagamentos. Sef x==x
,g x=0
de outro modog x=1+g(f x)
.fonte
g(f x)
parag$f x
+
tem maior precedência do que$
Paradoc (v0.2.10), 16 bytes (CP-1252)
Experimente online! / com cabeçalho / rodapé que verifica todos os casos de teste
Pega uma lista na pilha e resulta em um número na pilha.
Implementação bastante direta, para ser sincero. Esmaga uma lista começando com um sentinela -1, percorrendo a lista, pressionando cada elemento e adicionando-o ao elemento abaixo dela, se eles forem iguais. No final, cortamos o -1. Nós apenas esmagamos números iguais e todos os números do problema não são negativos, portanto a sentinela -1 não afetará o processo de esmagamento. Com a britagem implementada, é apenas uma questão de contar as iterações para seu ponto fixo.
Explicação:
Se pudéssemos assumir que a entrada não era vazia, não precisaríamos do sentinela e poderíamos cortar 2 bytes:
{(\ε=k+x}]}IL(
Outro fato interessante: só perdemos 2 bytes se forçarmos a usar apenas ASCII:
{1m\{=k+x}e]1>}IL(
fonte
JavaScript (ES6), 86 bytes
Ungolfed e Explained
Testes
Mostrar snippet de código
fonte
a.length>n
é o mesmo quea[n]!=[]._
. Nesse caso (como todos os itens da matriz são números maiores que -1), é o mesmo quea[n]>-1
. Além disso,a[i]==a[++i]&&x
é o mesmo quea[i]-a[++i]||x
.1/a[i]
também trabalha para salvar outro byte.JavaScript, 67 bytes
Experimente online!
fonte
Flacidez cerebral , 144 bytes
Experimente online!
Explicação
A função de esmagamento avalia o número de pares de itens que foram esmagados juntos:
fonte
Java 8, 120 bytes
Um lambda de
List<Long>
paraInteger
. A lista de entrada deve ser implementadaremove(int)
(por exemploArrayList
). Atribuir aFunction<List<Long>, Integer>
.Experimente Online
Lambda ungolfed
c
conta o número de esmagamentos até o momento,i
é o índice na lista ef
indica se deve continuar esmagando a lista quando uma iteração terminar. Dentro dos loops, cada par adjacente é comparado.i
é incrementado incondicionalmente; portanto, se um elemento é removido por esmagamento,i
é decrementado primeiro para cancelar o incremento. O elemento anterior é removido da lista.Agradecimentos
fonte
valueOf
cache. Exemplo:{128L, 128L}
. É por issol.get(i)==l.get(i-1)
que deve ser substituído porl.get(i).equals(l.get(i-1))
.l.get(i)-l.get(i-1)==0
vai funcionar. Obrigado!Perl 5 , 96 bytes
Código 94, 2 para
-pa
Experimente online!
fonte
JavaScript (ES6), 70 bytes
Explicação:
Casos de teste:
Mostrar snippet de código
fonte
Python 2 ,
112110108107105100 bytesEditar: salvou 2 bytes removendo
or
na declaração de retornoEditar: salvou 2 bytes tendo
i
como índice o segundo dos dois elementos a serem acessadosEdit: economizou 1 byte graças a @ Mr.Xcoder
Edit: salvou 7 bytes graças a @jferard
Experimente online!
fonte
JavaScript (ES6), 83 bytes
Explicação: Os elementos são extraídos recursivamente da matriz original e os valores exclusivos são anexados a
b
whilec
é um sinalizador para indicar se a matriz foi esmagada com êxito.fonte
J, 54 bytes
Experimente online!
Não é o meu melhor golfe, por qualquer meio. Certamente deve haver uma maneira melhor de converter uma lista com um item em um átomo.
Explicação
A paixão súbita
Isso esmaga uma matriz uma vez. Ele precisa receber a matriz ao contrário, pois a inserção de J funciona da direita para a esquerda (algo que aprendi hoje). Isso não importa particularmente, já que tudo o que precisamos é o número de vezes que podemos esmagar a matriz.
vezes
Isso é bastante simples: aplique esmagamento na matriz até que nosso resultado converja, mas há alguns problemas que tive que lidar com esse resultado em muito mais código do que eu previa.
Primeiro, quando a trituração se reduz a um único elemento, na verdade, esse elemento está em uma lista de um item (ou seja, não é atômica), então a função é aplicada novamente, resultando em uma contagem excessiva. Para corrigir isso, usei um hack que criei para reduzir uma lista de elementos simples para um átomo que é
".@":
(converter em string e depois avaliar).Segundo,
crush
erros na lista vazia. Eu acho que você pode definir como uma função deve se comportar ao receber entrada vazia com insert (/
), mas não consegui encontrar nada depois de uma aparência superficial, por isso estou usando outra solução alternativa. Esta solução alternativa é anexada antecipadamente_
(infinito) à lista, pois nunca afetará o número de vezes que a matriz é esmagada (_ > 2^64
). No entanto , isso resulta em uma lista de elementos únicos que consiste em_
quando é fornecida a lista vazia, portanto, precisamos converter em um átomo novamente antes de esmagar.fonte
Gelatina , 21 bytes
Experimente online!
fonte
R, 142 bytes
Horrific, I am sure there's a more clever way.
R integers are actually all at most
2^31-1
.Try it online!
fonte