Desafio
Dada uma lista de números inteiros, retorne a lista desses números inteiros após remover repetidamente todos os pares de itens iguais adjacentes.
Observe que, se você tiver um número ímpar de números iguais, um deles permanecerá, não fazendo parte de um par.
Exemplo:
[0, 0, 0, 1, 2, 4, 4, 2, 1, 1, 0]
Primeiro, você deve remover 0, 0
, 4, 4
e 1, 1
para obter:
[0, 1, 2, 2, 0]
Agora, você deve remover 2, 2
:
[0, 1, 0]
E este é o resultado final.
Casos de teste
[] -> [] [1] -> [1] [1, 1] -> [] [1,2] -> [1,2] [11, 11, 11] -> [11] [1, 22, 1] -> [1, 22, 1] [-31, 46, -31, 46] -> [-31, 46, -31, 46] [1, 0, 0, 1] -> [] [5, 3, 10, 10, 5] -> [5, 3, 5] [5, 3, 3, 3, 5] -> [5, 3, 5] [0, -2, 4, 4, -2, 0] -> [] [0, 2, -14, -14, 2, 0, -1] -> [-1] [0, 0, 0, 1, 2, 4, 4, 2, 1, 1, 0] -> [0, 1, 0] [3, 5, 4, 4, 8, 26, 26, 8, 5] -> [3] [-89, 89, -87, -8, 8, 88] -> [-89, 89, -87, -8, 8, 88]
Pontuação
Isso é código-golfe , então a resposta mais curta em cada idioma vence!
code-golf
array-manipulation
musicman523
fonte
fonte
[14, 14, 14]
colapsos para[14]
1,2
,11,12
, etc.)-89,89,-87,-8,-88
? Tanto minha solução Japt (não publicada) quanto a solução Retina de Fry falham por aí, produzindo--87,8
.Respostas:
Gelatina , 10 bytes
Experimente online!
Como funciona
fonte
Ẏ
vez deF
faria com que você também suporte listas na sua lista.œ^
depende da promoção de número inteiro para matriz aqui. Como matrizes 1D não são promovidas para matrizes 2D, ele não funcionará para nada, exceto para uma matriz de números.ŒgWẎ$œ^/$€ẎµÐL
... oh, espere, isso é muito ingênuo. : PRetina ,
1715 bytesExperimente online!
Economizou 2 bytes graças a Neil e Martin!
Substitui cada par de números por nada. Esse processo faz um loop até que nenhuma alteração seja feita.
fonte
-89 89 -87 -88 -88
, quais saídas--87
._
para denotar negativos, como é comum em alguns idiomas._89 89 _87 _8 _88
saída_89 89 _87 8
. Desculpe: \m
para transformar\b
s em^
e$
.Mathematica 29 bytes
Isso remove repetidamente pares de elementos adjacentes iguais,
a_,a_
até que não haja mais nenhum.fonte
Python 2 , 57 bytes
Experimente online!
Constrói iterativamente a lista de saída anexando o próximo elemento e, em seguida, cortando o final se o elemento anexado for igual ao anterior. Verificar o penúltimo elemento
r[-2:-1]!=[x]
torna-se estranho, porque é possível que a lista tenha apenas um comprimento.fonte
Gelatina , 15 bytes
Experimente online!
Explicação
-1 byte graças a milhas e fixo :)
fonte
ValueError: not enough values to unpack (expected 2, got 0)
para o caso de teste[1,2,2,1]
. Observe também que a saída vazia é diferente[]
e2
é diferente de[2]
.Œr;ṪḂ$$€ŒṙµÐL
. Para evitar o erro, substituaŒṙ
por,x/€F
pois a decodificação de comprimento de execução está lançando um erro ao receber uma lista vazia. Para ver o resultado como uma lista, o alinhamentoŒṘ
o mostrará.ÇŒṘ
no rodapé para chamar o último link (Ç
) e imprimir uma representação do Python (ŒṘ
) . O erro pode não ser aceitável no entanto.JavaScript (ES6),
5453 bytesGuardado 1 byte graças a @ThePirateBay
Solução recursiva ingênua, pode ser improvável.
fonte
i=0
pori=-2
ei-1
comi
qual é -1 byte no total.i+1
? (Eu tentei isso antes com mover o++
bem e não conseguia entender, embora eu só tinha cerca de um minuto para fazê-lo)Python 2 , 73 bytes
Como não tenho reputação suficiente para comentar: acabei de alterar a resposta de @officialaimm para usar r! = [] Em vez de len (r) para salvar um byte. Solução muito inteligente para você, @officialaimm!
Experimente online!
É, de novo, tarde demais ... por que ainda estou acordado?
fonte
Python,
6058 bytesExperimente online!
fonte
[a[0]]
éa[:1]
MATL , 7 bytes
Em alguns casos de teste em que o resultado está vazio, o programa sai com um erro, mas, em qualquer caso, produz a saída correta (vazia).
Experimente online! Ou verifique os casos de teste com saída não vazia .
Explicação
Considere entrada
Cada iteração remove pares de pares consecutivos. A primeira iteração reduz a matriz para
Os dois valores
2
que agora são adjacentes não eram adjacentes na matriz inicial. É por isso que é necessária uma segunda iteração, que fornece:Outras iterações deixarão isso inalterado. O número de iterações necessárias é limitado pelo tamanho da entrada.
Um resultado intermediário vazio causa um
Y"
erro na função de decodificação de duração da execução ( ) na versão atual do idioma; mas a saída está vazia conforme necessário.fonte
Código da máquina x86 (modo protegido de 32 bits), 36 bytes
Os bytes acima do código de máquina definem uma função que recebe uma matriz como entrada, recolhe duplicatas adjacentes no local e retorna ao chamador sem retornar um resultado. Segue a
__fastcall
convenção de chamada , passando os dois parâmetros nos registradoresECX
eEDX
, respectivamente.O primeiro parâmetro (
ECX
) é um ponteiro para o primeiro elemento na matriz de números inteiros de 32 bits (se a matriz estiver vazia, pode apontar para qualquer lugar na memória). O segundo parâmetro (EDX
) é um ponteiro para um número inteiro de 32 bits que contém o comprimento da matriz.A função modificará os elementos da matriz no local, se necessário, e também atualizará o comprimento para indicar o novo comprimento da matriz recolhida. Esse é um método pouco usual para receber e retornar resultados, mas você realmente não tem outra opção na linguagem assembly. Como em C, matrizes são realmente representadas na linguagem como um ponteiro para o primeiro elemento e um comprimento . A única coisa um pouco estranha aqui é tomar o comprimento por referência , mas se não fizéssemos isso, não haveria maneira de reduzir a matriz. O código funcionaria bem, mas a saída conteria lixo, porque o chamador não saberia onde parar de imprimir elementos da matriz recolhida.
Mnemônicos de montagem não destruídos:
A implementação foi inspirada na minha resposta C ++ 11 , mas meticulosamente reescrita na montagem, otimizando o tamanho. Assembly é uma linguagem de golfe muito melhor. :-)
Nota: Como esse código usa as instruções de cadeia, é não assumir que a bandeira direção é clara (
DF
== 0). Essa é uma suposição razoável na maioria dos ambientes operacionais, pois a ABI geralmente exige que o DF seja claro. Se isso não puder ser garantido, umaCLD
instrução de 1 byte (0xFC
) precisará ser inserida na parte superior do código.Também, como observado, assume o modo protegido de 32 bits - especificamente, um modelo de memória "simples", em que o segmento extra (
ES
) é o mesmo que o segmento de dados (DS
).fonte
Lote, 133 bytes
Defino s como
.
porque Lote fica confuso se houver apenas duplicatas. Eu também tenho que usarshift/1
para que eu possa usar%0%s:~1%
para definir a lista de argumentos para a nova matriz e loop.fonte
Gelatina , 12 bytes
Um link monádico que recebe e retorna listas de números.
Experimente online! ou veja uma suíte de testes
Quão?
fonte
ṁLḂ$$€
é equivalente aoḣLḂ$$€
qualṫḊ¿€3$
você pode substituirṫḊ¿€3
aqui para formar um par díade / nilad.Ḋ
retornará[]
enquanto len (x) == 0Ḋ
retornará0
, sendo ambos valores falsos. A entrada paraḊ
é, obviamente, o valor atual eṫ
terá o valor atual como argumento à esquerda e3
à direita. Se len (x) == 4, seria o mesmo queṫ3ṫ3
ouṫ5
com você[]
.x
na sua descrição há realmente o valor atual? Experimente isso para ver o tamanho.Japonês , 34 bytes
Remove recursivamente pares de números iguais até que não exista.
Experimente online! com o
-Q
sinalizador para formatar a matriz de saída.Execute todos os casos de teste usando o meu WIP CodePen.
fonte
05AB1E , 15 bytes
Experimente online!
Explicação
fonte
05AB1E , 13 bytes
Experimente online!
Explicação:
fonte
Haskell , 33 bytes
Experimente online!
fonte
Python 2 ,
74 7066 bytesr
vez delen(r)
é suficiente para verificar o vazio da lista / pilha.[i]==r[-1:]
Python 2 , 66 bytes
Experimente online!
fonte
len(r)
é apenas verificar se a lista está vazia ou não, você deve substituí-la por apenasr
, eu acho?Clojure, 100 bytes
Não tenho certeza se este é o mais curto possível.
fonte
Bash, 82 bytes
Provavelmente existe uma saída para todos esses
cat
s, mas eu não sei.fonte
Casca , 10 bytes
Experimente online!
Explicação
fonte
PHP, 81 bytes
função, chame por referência ou experimente online .
falha na entrada vazia; inserir
$i&&
ou$a&&
antes--$i
de corrigir.fonte
V , 10 bytes
Experimente online!
Comprimido Regex:
:%s/\(.\+\)\n\1\n*
. A nova linha opcional é para que também funcione no final do arquivo. Se eu assumir que existe uma nova linha após o final, seria 8 bytes ... mas isso parece um trechofonte
dc ,
8478 bytesExperimente online!
Descompactar um pouco, fora de ordem, em alguma tentativa de clareza:
[0syzdsz1<Olydsx0<Alx1+lz>M]dsMxf
A macro principalM
redefine o contadory
para 0, recupera o número de itens na pilha, armazena isso no registroz
e executa a macroO
se houver pelo menos dois itens na pilha. QuandoO
termina, ele carrega o contadory
e o copia no registrox
antes de verificar para garantir quey
não seja zero (ou seja, a pilha.
possui dados). Se for esse o caso, ele executa macroA
. Por fim, verifica se o tamanho da pilha original é maior que o tamanho da pilha atual e, em caso afirmativo, é executado novamente. Depois de terminar, imprime a pilha comf
.[dStrdStr!=Pz1<O]sO
A macroO
armazena temporariamente os dois principais itens da pilha na pilhat
. Em seguida, ele compara os dois itens principais e executa a macroP
se eles não forem iguais. Por fim, verifica se há ou não pelo menos dois itens na pilha e, se for o caso, executa-se.[LtLtS.ly1+sy]sP
MacroP
pega os dois itens da pilhat
, empurra o de volta para a pilha principal e empurra o seguinte para a pilha.
. Em seguida, incrementa o contadory
.[L.ly1-dsy0<A]sA
A macroA
pega a pilha.
e a transforma novamente na pilha principal. Faz isso, diminuindo o contadory
até que não haja mais nada para empurrar.Editado para explicação e para tirar 6 bytes de golfe, pois eu desnecessariamente armazenava o tamanho da pilha.
fonte
C ++ 11, 161 bytes
O código acima define uma função,
f
que usa umastd::vector<int>
por referência, modifica-a no local para recolher duplicatas adjacentes de acordo com a especificação e, em seguida, retorna.Experimente online!
Antes de verificar a contagem de bytes, achei que era um código bastante esbelto. Mais de 150 bytes, no entanto, não é tão bom! Ou eu não sou muito bom em golfe, ou C ++ não é uma linguagem muito boa de golfe…
Ungolfed:
fonte
std::adjacent_find
! Eu me pergunto se você implementou esta função se se seria mais curto, desde que você pode remover#include <algorithm>
bemstd::unique
para fazer o que eu precisava. Mas é preciso muito código para fazer toda a lógica e, quando eu me depareistd::adjacent_find
, era bastante óbvio que esse era um vencedor em termos de tamanho do código.PHP, 74 bytes
A função c chama por referência para reduzir a matriz. Experimente online .
Curiosamente, isso funciona no Php5.6, mas não no 7.
fonte
R ,
5754 bytesExperimente online!
usa uma codificação de comprimento de execução para remover pares.
fonte
J , 38 bytes
Experimente online!
fonte
GNU sed , 19 + 1 = 20 bytes
+1 byte para
-r
sinalizador.Experimente online!
fonte
Pitão, 10 bytes
Um pouco atrasado para a festa.
Suíte de teste.
fonte