Reto
Dada una lista de enteros, devuelva la lista de estos enteros después de eliminar repetidamente todos los pares de elementos iguales adyacentes.
Tenga en cuenta que si tiene una serie de números iguales de longitud impar, uno de ellos permanecerá y no formará parte de un par.
Ejemplo:
[0, 0, 0, 1, 2, 4, 4, 2, 1, 1, 0]
En primer lugar, se debe eliminar 0, 0
, 4, 4
y 1, 1
para obtener:
[0, 1, 2, 2, 0]
Ahora, debes eliminar 2, 2
:
[0, 1, 0]
Y este es el resultado final.
Casos de prueba
[] -> [] [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]
Tanteo
Este es el código de golf , por lo que gana la respuesta más corta en cada idioma.
code-golf
array-manipulation
musicman523
fuente
fuente
[14, 14, 14]
derrumba a[14]
1,2
,11,12
, etc.)-89,89,-87,-8,-88
? Tanto mi solución de Japt (sin publicar) como la solución de Retina de Fry fallan allí, produciéndose--87,8
.Respuestas:
Jalea , 10 bytes
Pruébalo en línea!
Cómo funciona
fuente
Ẏ
lugar de tambiénF
te haría admitir listas en tu lista.œ^
basa en la promoción de entero a matriz. Dado que las matrices 1D no se promocionan a matrices 2D, no funcionará para nada excepto una matriz de números.ŒgWẎ$œ^/$€ẎµÐL
... oh, espera, eso es demasiado ingenuo. : Pretina ,
1715 bytesPruébalo en línea!
¡Ahorré 2 bytes gracias a Neil y Martin!
Reemplaza cada par de números con nada. Este proceso se repite hasta que no se realizan cambios.
fuente
-89 89 -87 -88 -88
, que salidas--87
._
para denotar negativos, como es común en algunos idiomas._89 89 _87 _8 _88
, produciendo_89 89 _87 8
. Lo siento: \m
para convertir el\b
s en^
y$
.Mathematica 29 bytes
Esto elimina repetidamente pares de elementos adyacentes iguales,
a_,a_
hasta que no quede ninguno.fuente
Python 2 , 57 bytes
Pruébalo en línea!
Construye iterativamente la lista de salida agregando el siguiente elemento, luego cortando el final si el elemento anexado es igual al anterior. Verificar el penúltimo elemento
r[-2:-1]!=[x]
resulta incómodo porque es posible que la lista tenga una longitud de solo 1.fuente
Jalea , 15 bytes
Pruébalo en línea!
Explicación
-1 byte gracias a millas, y arreglado :)
fuente
ValueError: not enough values to unpack (expected 2, got 0)
para el caso de prueba[1,2,2,1]
. También tenga en cuenta que la salida vacía es diferente[]
y2
es diferente de[2]
.Œr;ṪḂ$$€ŒṙµÐL
. Para evitar el error, reemplaceŒṙ
conx/€F
ya que la decodificación de longitud de ejecución arroja un error cuando se le da una lista vacía. Para ver la salida como una lista, la viñetaŒṘ
lo mostrará.ÇŒṘ
en el pie de página para llamar al último enlace (Ç
) e imprimir una representación de Python (ŒṘ
) . Sin embargo, el error podría no ser aceptable.JavaScript (ES6),
5453 bytesGuardado 1 byte gracias a @ThePirateBay
Solución recursiva ingenua, puede ser mejorable.
fuente
i=0
coni=-2
yi-1
con eli
cual es -1 byte en total.i+1
? (Intenté esto antes con mover el++
también y no pude resolverlo, aunque solo tuve alrededor de un minuto para hacerlo)Python 2 , 73 bytes
Como no tengo suficiente reputación para comentar: acabo de cambiar la respuesta de @officialaimm para usar r! = [] En lugar de len (r) para guardar un byte. ¡Una solución muy inteligente para ti, @officialaimm!
Pruébalo en línea!
Es, de nuevo, demasiado tarde ... ¿por qué aún estoy despierto?
fuente
Python,
6058 bytesPruébalo en línea!
fuente
[a[0]]
esa[:1]
MATL , 7 bytes
Para algunos de los casos de prueba donde el resultado está vacío, el programa sale con un error, pero en cualquier caso produce la salida correcta (vacía).
Pruébalo en línea! O verifique los casos de prueba con salida no vacía .
Explicación
Considerar entrada
Cada iteración elimina pares de pares consecutivos. La primera iteración reduce la matriz a
Los dos valores
2
que ahora son adyacentes no eran adyacentes en la matriz inicial. Es por eso que se necesita una segunda iteración, que da:Otras iteraciones dejarán esto sin cambios. El número de iteraciones requeridas está limitado por el tamaño de entrada.
Un resultado intermedio vacío hace que la función de decodificación de longitud de ejecución (
Y"
) falle en la versión actual del lenguaje; pero la salida está vacía según sea necesario.fuente
Código de máquina x86 (modo protegido de 32 bits), 36 bytes
Los bytes anteriores del código de máquina definen una función que toma una matriz como entrada, contrae duplicados adyacentes en el lugar y regresa a la persona que llama sin devolver un resultado. Sigue la
__fastcall
convención de llamada , pasando los dos parámetros en los registrosECX
yEDX
, respectivamente.El primer parámetro (
ECX
) es un puntero al primer elemento en la matriz de enteros de 32 bits (si la matriz está vacía, puede apuntar a cualquier parte de la memoria). El segundo parámetro (EDX
) es un puntero a un entero de 32 bits que contiene la longitud de la matriz.La función modificará los elementos de la matriz en el lugar, si es necesario, y también actualizará la longitud para indicar la nueva longitud de la matriz contraída. Este es un método un poco inusual para tomar entradas y devolver salidas, pero realmente no tiene otra opción en lenguaje ensamblador. Como en C, las matrices se representan realmente en el lenguaje como un puntero al primer elemento y una longitud . Lo único un poco extraño aquí es tomar la longitud por referencia , pero si no lo hiciéramos, no habría forma de acortar la matriz. El código funcionaría bien, pero el resultado contendría basura, porque la persona que llama no sabría dónde detener la impresión de elementos desde la matriz contraída.
Mnemónicos de ensamblaje sin golf:
La implementación fue inspirada por mi respuesta de C ++ 11 , pero se reescribió meticulosamente en el ensamblaje, optimizando el tamaño. El ensamblaje es un lenguaje de golf mucho mejor. :-)
Nota: Debido a que este código utiliza las instrucciones de cadena, es no asumir que el indicador de dirección es clara (
DF
== 0). Esta es una suposición razonable en la mayoría de los entornos operativos, ya que el ABI generalmente requiere que el DF sea claro. Si esto no se puede garantizar, entonces se debe insertar unaCLD
instrucción de 1 byte (0xFC
) en la parte superior del código.También, como se señaló, asume el modo protegido de 32 bits, específicamente, un modelo de memoria "plano", donde el segmento adicional (
ES
) es el mismo que el segmento de datos (DS
).fuente
Lote, 133 bytes
Configuré s
.
porque Batch se confunde si solo hay duplicados. También tengo que usarshift/1
para%0%s:~1%
poder configurar la lista de argumentos en la nueva matriz y bucle.fuente
Jalea , 12 bytes
Un enlace monádico que toma y devuelve listas de números.
Pruébalo en línea! o ver un conjunto de pruebas
¿Cómo?
fuente
ṁLḂ$$€
es equivalente a loḣLḂ$$€
que es equivalente aṫḊ¿€3$
lo que puede reemplazarṫḊ¿€3
aquí para formar un par dyad / nilad.Ḋ
regresará[]
mientras que si len (x) == 0Ḋ
regresará0
, ambos valores falsos. La entrada aḊ
es, por supuesto, el valor actual, yṫ
tendrá el valor actual como argumento izquierdo y3
como derecho. Si len (x) == 4, entonces sería lo mismoṫ3ṫ3
oṫ5
dejarlo con usted[]
.x
en su descripción realmente el valor actual? Prueba esto por tamaño.Japt , 34 bytes
Recurrentemente elimina pares de números iguales hasta que no exista ninguno.
Pruébalo en línea! con el
-Q
bandera para formatear la matriz de salida.Ejecute todos los casos de prueba con mi WIP CodePen.
fuente
05AB1E , 15 bytes
Pruébalo en línea!
Explicación
fuente
05AB1E , 13 bytes
Pruébalo en línea!
Explicación:
fuente
Haskell , 33 bytes
Pruébalo en línea!
fuente
Pitón 2 ,
74 7066 bytesr
lugar delen(r)
es suficiente para verificar el vacío de la lista / pila.[i]==r[-1:]
Python 2 , 66 bytes
Pruébalo en línea!
fuente
len(r)
es solo verificar si la lista está vacía o no, debería poder reemplazarla solor
, creo.Clojure, 100 bytes
No estoy seguro si esto es lo más corto posible.
fuente
Bash, 82 bytes
Probablemente hay una salida de todos esos
cat
s, pero no lo sé.fuente
Casco , 10 bytes
Pruébalo en línea!
Explicación
fuente
PHP, 81 bytes
función, llame por referencia o pruébelo en línea .
falla por entrada vacía; insertar
$i&&
o$a&&
antes--$i
de arreglar.fuente
V , 10 bytes
Pruébalo en línea!
Regex comprimido:
:%s/\(.\+\)\n\1\n*
. La nueva línea opcional es para que también funcione al final del archivo. Si supongo que hay una nueva línea después del final, serían 8 bytes ... pero eso parece un tramofuente
cc ,
8478 bytesPruébalo en línea!
Desempacarlo un poco, fuera de orden en algún intento de claridad:
[0syzdsz1<Olydsx0<Alx1+lz>M]dsMxf
La macro principalM
restablece el contadory
a 0, recupera el número de elementos en la pila, almacena esto en el registroz
y luego ejecuta la macroO
si hay al menos dos elementos en la pila. Una vez queO
finaliza, carga el contadory
y lo copia en el registrox
antes de verificar para asegurarse de quey
no sea cero (lo que significa que la pila.
tiene datos). Si este es el caso, se ejecuta macroA
. Finalmente, comprueba si el tamaño original de la pila es mayor que el tamaño actual de la pila y, de ser así, se vuelve a ejecutar. Una vez que ha terminado, imprime la pila conf
.[dStrdStr!=Pz1<O]sO
MacroO
almacena temporalmente los dos elementos superiores en la pila en la pilat
. Luego compara los dos primeros elementos y ejecuta macroP
si no son iguales. Finalmente, verifica si hay al menos dos elementos en la pila y se ejecuta solo si es así.[LtLtS.ly1+sy]sP
MacroP
toma los dos elementos de la pilat
, empuja el superior hacia la pila principal y empuja el siguiente hacia la pila.
. Luego incrementa el contadory
.[L.ly1-dsy0<A]sA
MacroA
toma la pila.
y la vuelve a convertir en la pila primaria. Lo hace, disminuyendo el contadory
hasta que no quede nada más que empujar.Editado para explicación y para jugar golf de 6 bytes ya que estaba almacenando innecesariamente el tamaño de la pila.
fuente
C ++ 11, 161 bytes
El código anterior define una función,
f
que toma unastd::vector<int>
referencia, la modifica para colapsar los duplicados adyacentes de acuerdo con la especificación, y luego regresa.Pruébalo en línea!
Antes de verificar el recuento de bytes, pensé que este era un código bastante esbelto. Sin embargo, ¡más de 150 bytes no es tan bueno! O no soy muy bueno jugando al golf, o C ++ no es un lenguaje de golf muy bueno ...
Sin golf:
fuente
std::adjacent_find
! Me pregunto si ha implementado esta función manualmente si sería más corto, ya que se puede quitar#include <algorithm>
, asístd::unique
hacer lo que necesitaba. Pero se necesita mucho código para hacer toda la lógica, y cuando me encontréstd::adjacent_find
, era bastante obvio que ese era un ganador en términos de tamaño del código.PHP, 74 bytes
La función c llama por referencia para reducir la matriz. Pruébalo en línea .
Curiosamente, esto funciona en Php5.6 pero no en 7.
fuente
R ,
5754 bytesPruébalo en línea!
usa una codificación de longitud de ejecución para eliminar pares.
fuente
J , 38 bytes
Pruébalo en línea!
fuente
GNU sed , 19 + 1 = 20 bytes
+1 byte para
-r
bandera.Pruébalo en línea!
fuente
Pyth, 10 bytes
Un poco tarde para la fiesta.
Banco de pruebas.
fuente