Introducción
Por definición, los identificadores únicos deberían ser únicos. Tener múltiples identificadores que son iguales hace que uno recupere datos inesperados. Pero con los datos que llegan simultáneamente de múltiples fuentes, puede ser difícil garantizar la unicidad. Escriba una función que uniquifique una lista de identificadores.
Esta es posiblemente la peor pelusa de rompecabezas que he escrito, pero entiendes la idea.
Requisitos
Dada una lista de cero o más enteros positivos, aplique las siguientes reglas a cada número de principio a fin:
- Si el número es el primero de su tipo, consérvelo.
- Si el número se ha encontrado previamente, reemplácelo con el entero positivo más bajo que no se encuentre en ninguna parte de la lista de entrada completa o en cualquier salida existente.
Para la solucion:
- La solución puede ser un programa o una función.
- La entrada puede ser una cadena, una matriz, pasada como argumentos o entrada de teclado.
- La salida puede ser una cadena, una matriz o imprimirse en la pantalla.
- Todos los números en la lista de salida son distintos.
Supuestos
- La lista de entrada está limpia. Solo contiene enteros positivos.
- Un entero positivo tiene el rango de 1 a 2 31 -1.
- Hay menos de 256 MB de memoria disponibles para las variables de su programa. (Básicamente, no se permiten matrices de 2,147,483,648 elementos).
Casos de prueba
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
Tanteo
Solo un simple código de golf. El conteo de bytes más bajo para esta fecha la próxima semana gana.
code-golf
set-theory
Hand-E-Food
fuente
fuente
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 prueba confirma la interpretación de Adám: el resultado esperado es6, 1, 4, 3, 2, 5
, y no6, 1, 4, 2, 3, 5
.Respuestas:
Brachylog , 8 bytes
Pruébalo en línea!
Explicación
fuente
Java 8,
158144bytes.contains(m+c);m++)
para.contains(++m+c);)
guardar 1 byte, y simultáneamente convertido a Java 8 para guardar 13 bytes más.Explicaciones:
Pruébalo aquí.
fuente
JavaScript (ES6), 49 bytes
fuente
Ruby , 63 bytes
Pruébalo en línea!
Explicación
fuente
05AB1E ,
171618 bytesPruébalo en línea!
Explicación
fuente
6, 6, 1, 2, 3, 4, 5
.[6, '1', '2', '3', '4', '5', '7']
. Debería dar[6, '7', '1', '2', '3', '4', '5']
.PHP, 121 bytes
Versión en línea
Expandido
fuente
Python 2,
7779 bytesToma entrada de teclado, como
[3, 3, 3, 3, 3, 3]
.Simplemente realice un seguimiento del entero positivo más pequeño que
j
no se haya utilizado hasta ahora. Para cada elementox
de la entrada, salidax
six
aún no se ha utilizado, de lo contrario salidaj
. Finalmente, actualicej
cada vez que envíe algo.EDITADO: para corregir un error al manejar la entrada de
[6, 6, 4, 4, 2, 2]
. Gracias a @Rod por señalar el error y una solución. El error fue que, en el caso de una entrada duplicada, generaría el número más pequeño sin usar hasta ese punto de la lista, incluso si esa salida apareciera más tarde en la entrada. (Esto estaba mal, como se aclaró en la publicación y los comentarios, pero aún así lo estropeé de alguna manera.) De todos modos, la solución fue simplemente agregar la lista de entradaa
, al conjunto de valores que no se podrían generar en ese caso.fuente
[6,6,4,4,2,2]
, puede (probablemente) solucionarlo agregando+a
awhile j in u:
->while j in u+a:
Haskell ,
7976 bytesEDITAR:
head
podría ser reemplazado por una coincidencia de patrón.([]#)
es una función anónima que toma y devuelve una lista. Utilizar como([]#)[2147483647, 2, 2147483647, 2]
.Pruébalo en línea!
Cómo funciona
?
es un operador abreviado para verificar si un elemento está ausente de una lista.s#l
maneja la lista de enterosl
, dada una listas
de enteros ya utilizados.x
es el siguiente entero a mirar,y
los restantes.z
es el entero elegido para el próximo lugar. Esx
six
no es un elemento des
, y el primer entero positivo ni ens
ni dey
otra manera.(z:s)#y
luego se repite conz
agregado a la lista entera utilizada.n
es una lista vacía, ya que las listas no vacías se han manejado en la línea anterior.([]#)
toma una lista y la llama#
como segundo argumento, y una lista vacía para el primer argumento.fuente
|z:_<-[x|...]...
APL (Dyalog 16.0), 34 bytes
fuente
Pyth ,
2120 bytesBanco de pruebas
Agregaré una explicación cuando tenga tiempo.
fuente
C # , 135 bytes
Golfed
Sin golf
Legible sin golf
Código completo
Lanzamientos
135 bytes
- Solución inicial.Notas
fuente
Python 2 , 101 bytes
Pruébalo en línea! o Pruebe todos los casos de prueba
fuente
R , 39
46bytesCrea un vector a partir de la entrada, luego reemplaza los valores duplicados con un rango de 1 a un millón que tiene los valores de entrada eliminados. Devuelve un vector numérico. Ninguna entrada devolverá el vector numérico vacío (0).
Pruébalo en línea!
Esto arrojará una advertencia sobre la longitud del vector de reemplazo
fuente
C,
169 bytes133 bytesentrada = matriz a, salida = matriz modificada a
formateado
Demasiados bytes desperdiciados para estos bucles. ¿Alguien piensa en acortar el código inventando un nuevo algoritmo (que usa menos bucle)? Estaba pensando pero no he encontrado uno.
fuente
C # 7, 116 bytes
Sangrado
Explicado
[1, 2, 3, ...]
, omitiendo los valores presentes en la entrada.Versión en línea
fuente
Clojure, 72 bytes
Una reducción básica. Si hasta ahora
i
está contenido en la lista de salida, tomaremos el segundo elemento (1 cuando está indexado a 0) de la lista infinita de enteros(range)
de los que hemos eliminado aquellos números que ya se han utilizado. El rango comienza desde cero, por lo que no podemos tomar el primer elemento sino el segundo.fuente
R, 74 bytes
lee la lista de stdin; devuelve NULL para una entrada vacía.
explicación:
1:length(n)
puede usarse ya que estamos garantizados de que nunca necesitaremos un reemplazo fuera de ese rango.Pruébalo en línea!
fuente
Axioma, 169 bytes
ungolf y resultado
fuente