Introdução
Por definição, identificadores únicos devem ser únicos. Ter vários identificadores iguais faz com que se recupere dados inesperados. Porém, com dados chegando simultaneamente de várias fontes, pode ser difícil garantir exclusividade. Escreva uma função que unifique uma lista de identificadores.
Este é possivelmente o pior quebra-cabeça que já escrevi, mas você entendeu.
Exigências
Dada uma lista de zero ou mais números inteiros positivos, aplique as seguintes regras a cada número, do primeiro ao último:
- Se o número for o primeiro desse tipo, mantenha-o.
- Se o número foi encontrado anteriormente, substitua-o pelo número inteiro positivo mais baixo que não foi encontrado em nenhum lugar da lista de entrada inteira ou em nenhuma saída existente.
Para a solução:
- A solução pode ser um programa ou uma função.
- A entrada pode ser uma sequência, uma matriz, passada como argumentos ou uma entrada do teclado.
- A saída pode ser uma sequência, uma matriz ou impressa na tela.
- Todos os números na lista de saída são distintos.
Suposições
- A lista de entrada está limpa. Ele contém apenas números inteiros positivos.
- Um número inteiro positivo tem o intervalo de 1 a 2 31 -1.
- Menos de 256 MB de memória está disponível para as variáveis do seu programa. (Basicamente, não são permitidas matrizes de 2.147.483.648 elementos.)
Casos de teste
Input: empty
Output: empty
Input: 5
Output: 5
Input: 1, 4, 2, 5, 3, 6
Output: 1, 4, 2, 5, 3, 6
Input: 3, 3, 3, 3, 3, 3
Output: 3, 1, 2, 4, 5, 6
Input: 6, 6, 4, 4, 2, 2
Output: 6, 1, 4, 3, 2, 5
Input: 2147483647, 2, 2147483647, 2
Output: 2147483647, 2, 1, 3
Pontuação
Apenas um simples código de golfe. A contagem de bytes mais baixa nesse período na próxima semana vence.
code-golf
set-theory
Mão-E-Comida
fonte
fonte
6, 6, 1, 2, 3, 4, 5
→6, 7, 1, 2, 3, 4, 5
6, 6, ...
dar6, 1, ...
?6, 6, 4, 4, 2, 2
caso de teste confirma a interpretação de Adám: a saída esperada é6, 1, 4, 3, 2, 5
e não6, 1, 4, 2, 3, 5
.Respostas:
Braquilog , 8 bytes
Experimente online!
Explicação
fonte
Java 8,
158144 bytes.contains(m+c);m++)
para.contains(++m+c);)
economizar 1 byte e simultaneamente convertido em Java 8 para economizar mais 13 bytes.Explicações:
Experimente aqui.
fonte
JavaScript (ES6), 49 bytes
fonte
Ruby , 63 bytes
Experimente online!
Explicação
fonte
05AB1E ,
171618 bytesExperimente online!
Explicação
fonte
6, 6, 1, 2, 3, 4, 5
.[6, '1', '2', '3', '4', '5', '7']
. Deveria dar[6, '7', '1', '2', '3', '4', '5']
.PHP, 121 bytes
Versão Online
Expandido
fonte
Python 2,
7779 bytesRecebe entrada do teclado, como
[3, 3, 3, 3, 3, 3]
.Basta acompanhar o menor número inteiro positivo
j
não usado até o momento. Para cada elementox
da entrada, imprimax
sex
ainda não tiver sido utilizado, caso contrário, imprimaj
. Finalmente, atualizej
cada vez que você produz algo.EDITADO: para corrigir um erro ao manipular a entrada de
[6, 6, 4, 4, 2, 2]
. Agradecemos a @Rod por apontar o erro e também uma correção. O erro foi que, no caso de uma entrada duplicada, ele produziria o menor número não utilizado para esse ponto da lista, mesmo que essa saída aparecesse posteriormente na entrada. (Isso estava errado, conforme esclarecido no post e nos comentários, mas ainda assim eu errei de alguma forma.) De qualquer forma, a correção era simplesmente adicionar a lista de entradaa
ao conjunto de valores que não poderiam ser exibidos nesse caso.fonte
[6,6,4,4,2,2]
, você pode (provavelmente) consertá-lo adicionando+a
aowhile j in u:
->while j in u+a:
Haskell ,
7976 bytesEDITAR:
head
poderia ser substituído por uma correspondência de padrão.([]#)
é uma função anônima que recebe e retorna uma lista. Use como([]#)[2147483647, 2, 2147483647, 2]
.Experimente online!
Como funciona
?
é um operador abreviado para verificar se um elemento está ausente de uma lista.s#l
lida com a lista de números inteirosl
, dada uma listas
de números inteiros já usados.x
é o próximo número inteiro a ser observado,y
os demais.z
é o número inteiro escolhido para o próximo ponto. Éx
ifx
não é um elemento des
, e o primeiro número inteiro positivo nem em,s
nem emy
contrário.(z:s)#y
em seguida, recursa comz
adicionado à lista inteira usada.n
é uma lista vazia, pois as listas não vazias foram tratadas na linha anterior.([]#)
pega uma lista e a chama#
como segundo argumento, e uma lista vazia para o primeiro argumento.fonte
|z:_<-[x|...]...
APL (Dyalog 16.0), 34 bytes
fonte
Pitão ,
2120 bytesSuíte de teste
Vou adicionar uma explicação quando tiver tempo.
fonte
C # , 135 bytes
Golfe
Ungolfed
Ungolfed legible
Código completo
Lançamentos
135 bytes
- Solução inicial.Notas
fonte
Python 2 , 101 bytes
Experimente online! ou Experimente todos os casos de teste
fonte
R , 39
46bytesCria um vetor da entrada e substitui os valores duplicados por um intervalo de 1 a um milhão que remove os valores de entrada. Retorna um vetor numérico. Nenhuma entrada retornará o vetor numérico vazio (0).
Experimente online!
Isso emitirá um aviso sobre o comprimento do vetor de substituição
fonte
C,
169 bytes133 bytesentrada = matriz a, saída = matriz modificada a
formatado
Muitos bytes desperdiçados para esses loop. Alguém pensa em encurtar o código inventando um novo algoritmo (que usa menos loop)? Eu estava pensando, mas ainda não encontrei um.
fonte
C # 7, 116 bytes
Recuado
Explicado
[1, 2, 3, ...]
, ignorando os valores presentes na entrada.Versão Online
fonte
Clojure, 72 bytes
Uma redução básica. Se
i
estiver contido na lista de saída até agora, pegaremos o segundo elemento (1 quando indexado com 0) da lista infinita de números inteiros(range)
da qual removemos os números que já foram usados. O intervalo começa do zero, portanto não podemos pegar o primeiro elemento, mas o segundo.fonte
R, 74 bytes
lê a lista de stdin; retorna NULL para uma entrada vazia.
explicação:
1:length(n)
pode ser usado, pois garantimos que nunca precisamos de uma substituição fora desse intervalo.Experimente online!
fonte
Axioma, 169 bytes
ungolf e resultado
fonte