Inspirado por una pregunta en Stack Overflow. El título aquí es completamente mi culpa.
El reto
Dada una lista de enteros positivos que contiene al menos dos entradas, reemplace cada número por el mínimo de todas las entradas, excluyéndose a sí mismo.
Casos de prueba
[4 3 2 5] -> [2 2 3 2]
[4 2 2 5] -> [2 2 2 2]
[6 3 5 5 8] -> [3 5 3 3 3]
[7 1] -> [1 7]
[9 9] -> [9 9]
[9 8 9] -> [8 9 8]
Reglas
El algoritmo debería funcionar teóricamente para cualquier tamaño de entrada (mayor que uno) y valores (enteros positivos). Se acepta si el programa está limitado por el tiempo, la memoria o los tipos de datos y, por lo tanto, solo funciona para números de hasta un valor determinado o para un tamaño de entrada de hasta un valor determinado.
Se permiten programas o funciones , en cualquier lenguaje de programación . Las lagunas estándar están prohibidas.
La entrada puede tomarse por cualquier medio razonable ; y con cualquier formato Lo mismo para la salida. Los formatos de entrada y salida pueden ser diferentes.
El código más corto en bytes gana.
fuente
[4 3 2 2 5]
salir?[4 3 2 2 5]
la salida sería[2 2 2 2 2]
(esto es similar al segundo caso de prueba)Respuestas:
Jalea ,
965 bytesPruébalo en línea!
¡Verifíquelos todos a la vez! (ligeramente modificado)
Estoy bastante seguro de que Dennis puede superar esto.
Cómo funciona
El algoritmo es bastante complicado. Observemos lo que esto hace
[4,2,2,5]
.En primer lugar, utilizamos
J
para obtener[1,2,3,4]
. Tenga en cuenta que Jelly utiliza la indexación 1.Entonces, ya vemos
ṙ
. Se necesitan dos argumentos: una matriz y un número entero. Gira la matriz a la izquierda en una cantidad especificada por el entero. Aquí,ṙ
vería[4,2,2,5]
a su izquierda y[1,2,3,4]
a su derecha (puede encontrar más información sobre cómo funciona esto en el tutorial ). En Jelly, los comandos vectorizan implícitamente. Por lo tanto, este comando se ejecutará sobre cada elemento individual de la derecha, por lo que crearíamos una matriz 2D:Por lo tanto, se
[4,2,2,5]ṙ[1,2,3,4]
convierte[[4,2,2,5]ṙ1,[4,2,2,5]ṙ2,[4,2,2,5]ṙ3,[4,2,2,5]ṙ4]
, que se convierte en:Observe que los elementos originales están en la última fila, ya que en esa fila giramos a la izquierda en una cantidad igual a la longitud de la matriz, por lo que usamos
Ṗ
next para eliminar esa fila, de modo que las columnas son las colecciones de Los elementos de la matriz que no están en el índice actual:La siguiente operación,
«/
también es bastante complicada. En primer lugar,«
devuelve el mínimo de los dos números que ve a su izquierda y a su derecha. Por ejemplo,5«3
vuelve3
. Ahora, si los dos argumentos son matrices, entonces se vectorizaría como he dicho anteriormente. Lo que esto significa es que[1,5,2,3]«[4,1,5,2]
se convertiría en lo[1«4,5«1,2«5,3«2]
que es[1,1,2,2]
. Ahora,/
esreduce
, lo que significa que hacemos la operación sobre cada fila hasta el final. Por ejemplo,[1,2,3,4]+/
se convertiría en((1+2)+3)+4
la suma de la matriz[1,2,3,4]
.Entonces, si aplicamos
«/
a la matriz 2D que acabamos de obtener, obtendríamos:que, debido a la vectorización, sería equivalente a:
que calcula el mínimo de cada matriz sin el elemento en el índice.
fuente
Python 2 , 41 bytes
Pruébalo en línea!
Para cada elemento
x
verificamos six==min(l)
. Si no, esto esFalse
, que se trata como0
cuando se usa como un índice de listasorted(l)
, dando el elemento más pequeño. De lo contrario, esTrue
aka1
, dando el segundo elemento más pequeño, ya que ese elemento en sí mismo es el más pequeño y debe ignorarse.fuente
False
se convierte0
yTrue
se convierte en1
realidad genial y debería presumir de ^ W ^ WexplainedJalea , 5 bytes
Pruébalo en línea!
¿Cómo?
fuente
Haskell ,
424139 bytesEDITAR:
f
toma una lista de enteros (o cualquierOrd
tipo) y devuelve una lista.Pruébalo en línea!
f
recurre mientras gira la lista.x
es el primer elemento de la lista yy
el resto. Como la recursividad es infinita, la lista de resultados debe cortarse:fst<$>zip...y
es una forma más corta de decirtake(length y)...
.fuente
@
y voltear las listas para ser comprimido:f l@(x:y)=fst<$>zip(minimum...)l
.f(h:t)=minimum t:(fst<$>zip(f(t++[h]))t)
Octava, 26 bytes
Un enfoque similar al utilizado en esta respuesta , que resulta ser el mismo que este .
Realmente no soy fanático de solo portar otras respuestas, por eso me gustaría señalar que tuve una idea similar antes de ver las otras.
Explicación:
Jonathan Allan ya ha proporcionado una buena explicación para el código Jelly, por lo que cubre el bit de octava y por qué funciona (y no funcionaría en MATLAB).
Esto no funciona en MATLAB, ya que las asignaciones en línea y la indexación directa no funcionan.
sort(x)(1)
da un error en MATLAB, no el primer elemento en el vector ordenado.fuente
Haskell, 41 bytes
Ejemplo de uso:
([]#) [4,3,2,5]
->[2,2,3,2]
. Pruébalo en línea!Comience con un acumulador vacío
a
y recorra la lista de entrada. El siguiente elemento en la lista de salida es el mínimo del acumuladora
y todos menos el primer elemento de la lista de entrada (->c
) seguido de una llamada recursiva con el primer elementob
agregado al acumulador yc
. Deténgase cuando llegue al final de la lista de entrada.fuente
JavaScript (ES6),
5046 bytesEditar: Guardado 4 bytes gracias a @Arnauld.
fuente
a=>a.map(x=>Math.min(...a.filter(y=>x!=y)))
por 43 bytes.3,3,3,3
a=>a.map((_,i)=>Math.min(...a.filter(_=>i--)))
por 46.Brachylog ,
1312 bytesPruébalo en línea!
Guardado un byte gracias a @ ais523.
Explicación
Explotamos el hecho de que
⊇
unifica subconjuntos de mayor a menor. Por ejemplo para[1,2,3]
los subconjuntos que recibimos son en este orden:[1,2,3], [1,2], [1,3], [2,3], [1], [2], [3], []
.Podemos ver que los subconjuntos
[1,2], [1,3], [2,3]
son de los que queremos el mínimo, pero están en el orden inverso en comparación con la lista de entrada (de ahí el↔
). Podemos seleccionar esos subconjuntos solo encontrando los primeroslength(Input) + 1
subconjuntos, que contendrán todos ellos + toda la lista primero. Descartamos toda esa lista conb
.fuente
Actualmente , 13 bytes
Utiliza la misma técnica que xnor también descubrió .
Pruébalo en línea!
Explicación:
fuente
R,
4631 bytesimplementa la solución de Stewie Griffin en R, ¡ay, mi idea original es un 50% más larga! todavía lee la lista de stdin, pero ahora devuelve un vector numérico mucho más legible.
Pruébalo en línea!
implementación anterior:
lee en la lista de stdin. Un índice negativo
l[-x]
excluye el elemento de la lista ymatch(l,l)
devuelve el índice de la primera aparición de cada elemento de la lista. Devuelve una lista.fuente
Python 2, 51 bytes
Sé que ya hay una mejor solución de Python, pero aún quiero publicar la mía.
Pruébalo en línea
fuente
Mathematica 34 Bytes
fuente
PowerShell ,
6859 bytesPruébalo en línea!
Estoy bastante seguro de que se puede acortar, continuaré mirándolo
fuente
C, 85 bytes
El primer argumento es la matriz de enteros de entrada. El segundo argumento es la matriz de enteros de salida. El tercer argumento es el recuento de elementos para ambas matrices.
Véalo trabajar en línea .
fuente
Perl 6 ,
26 2419 bytes26
Tenga en cuenta que es
∖
U + 2216 no\
U + 5CIntentalo
Intentalo
24
Intentalo
19
Intentalo
26
Usé los operadores unicode "elegantes" lugar de los equivalentes ascii porque habrían requerido un espacio antes de ellos para que no fueran analizados como parte de la
.Bag
llamada al método.24
19
(Los campos de golf de 24 y 19 bytes se inspiraron en una implementación de Jelly )
fuente
Clojure,
36816271 bytesLo más nuevo (realmente no debería enviar esto con prisa):
Pruébalo en línea .
Aaa y este tiene un error (62 bytes), zipmap produce un mapa desordenado para que esto no produzca la secuencia correcta en entradas más grandes.
v
en realidad no se usa para nada, pero esto es más corto quei (keys c)
.Anterior a 81 bytes:
Pruébalo en línea .
Pruébalo en línea .
Oh, maldita sea, el original (36 bytes) no funciona cuando se repite el número mínimo, como
[4 2 2 5]
resultado se eliminan[2 4 4 2]
ambos2
s :(#{i}
es el conjunto que contiene soloi
, devuelve verdad parai
y falso para otros, lo que significa que el mínimo se calcula a partir de todos los demás números dentro de la lista de entrada.Pruébalo en línea .
fuente
Pyth,
87 bytes-1 Byte gracias a @isaacg
¡Intentalo!
fuente
d
al final, está implícitamente rellenado.PHP, 72 bytes
Versión en línea
fuente
PHP, 47 bytes
fuente
Scala, 37 bytes
l
es cualquier colección de int.Casos de prueba:
Esto probablemente todavía se pueda jugar al golf, no pude encontrar una forma más corta de eliminar un elemento de una lista que
l diff Seq(l(i))
fuente
C #, 36 bytes
Toma los elementos (i) y busca en los elementos sin el elemento actual el valor mínimo.
Es un poco triste que otros intentos no funcionen, ya que trabajamos con tipos primitivos y, por lo tanto, no tenemos listas con referencias para comparar los elementos.
fuente
PowerShell ,
4938 bytes-11 bytes gracias a mazzy
Pruébalo en línea!
Mejora de la encantadora respuesta de Sinusoid . Ahorra 10 bytes utilizando una salida explícita en lugar de construir una matriz. Índices en la matriz ordenada para detectar el punto 0 (es decir, el valor más pequeño) o el punto 1 si el condicional es verdadero.
fuente
Perl 5, 43 bytes
Equivalente a la solución Python.
sort
Lamentablemente , Perl tiene un valor predeterminado incorrecto para los números (que requiere un comparador explícito) ymin
no está integrado, pero casi lo compensasub
siendo más corto quelambda
,map$_,
más corto quex for x in
, y la implícita de las listas de retorno y argumentos.fuente
Rubí, 30 bytes.
Para cada elemento, ordene la matriz, elimine el elemento actual y tome el primer elemento de la matriz restante.
Es una función anónima que se puede usar así:
fuente
CJam, 15 bytes
Esencialmente una traducción del algoritmo de xnor a CJam.
Este es un bloque sin nombre que toma una matriz de la pila y deja el resultado en la pila.
Explicación:
fuente
05AB1E , 5 bytes
Puerto de la respuesta Python 2 de @xnor .
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Java 8, 119 bytes
Puerto de la respuesta Python 2 de @xnor .
Modifica la matriz de entrada en lugar de devolver una nueva para guardar bytes.
Pruébalo en línea.
Explicación:
fuente
APL (Dyalog Extended) , 7 bytes
Port of xnor's Python 2 respuesta. Requiere
⎕IO←0
:Pruébalo en línea!
Explicación:
fuente
Haskell , 76 bytes
Esto es considerablemente más largo que las entradas anteriores de Haskell, pero es el primero que solo realiza un número lineal de comparaciones y una cantidad lineal de trabajo adicional.
Pruébalo en línea!
Explicación
!
toma dos argumentos: un mínimo de ejecución y una lista no vacía. Devuelve el valor mínimo en la lista y el resultado de procesar la lista dada usando el mínimo en ejecución.fuente
MathGolf ,
97 bytesPruébalo en línea!
Explicación
Básicamente un puerto de la respuesta 05AB1E de Kevin Cruijssen, pero pierdo 2 bytes gracias a tener que hacer las cosas explícitamente.
fuente