¡Filtra los pseudoelementos!

15

Definimos el hiper-promedio de una matriz / lista (de números) la media aritmética de las sumas de sus prefijos.

Por ejemplo, el hiper-promedio de la lista [1, 4, -3, 10]se calcula de la siguiente manera:

  • Obtenemos los prefijos: [1], [1, 4], [1, 4, -3], [1, 4, -3, 10].

  • Resumiendo cada uno: [1, 5, 2, 12].

  • Y ahora obtener la media aritmética de los elementos de esta lista: (1 + 5 + 2 + 12) / 4 = 5.

Un pseudo-elemento de una matriz es un elemento cuyo valor es estrictamente más bajo que su hiper-promedio. Por lo tanto, los pseudoelementos de nuestra lista de ejemplos son 1, 4y -3.


Dada una lista de números de punto flotante, su tarea es devolver la lista de pseudoelementos.

  • No tiene que preocuparse por las imprecisiones de punto flotante.

  • La lista de entrada nunca estará vacía y puede contener números enteros y flotantes. Si se menciona, los enteros se pueden tomar como flotantes (con <integer>.0)

  • Puede suponer que los números se ajustan a su idioma de elección, pero no abuse de eso de ninguna manera.

  • Opcionalmente, también puede tomar la longitud de la matriz como entrada.

  • Este es el , por lo que se aplican las reglas estándar para la etiqueta. ¡El código más corto en bytes ( en cada idioma ) gana!


Casos de prueba

Entrada -> Salida

[10.3] -> []
[5.4, 5.9] -> [5.4, 5.9]
[1, 4, -3, 10] -> [1, 4, -3]
[-300, -20.9, 1000] -> [-300, -20.9]
[3.3, 3.3, 3.3, 3.3] -> [3.3, 3.3, 3.3, 3.3]
[-289.93, 912.3, -819.39, 1000] -> [-289.93, -819.39]
Sr. Xcoder
fuente
Si se permite que algunos idiomas tomen la longitud de la matriz como entrada adicional, entonces se debe permitir para todos los idiomas .
ngenisis
1
@ngenisis Es para todos los idiomas. Si tomar el tiempo también acorta su programa, siéntase libre de hacerlo. Esa especificación no es restrictiva del idioma en absoluto.
Sr. Xcoder

Respuestas:

7

MATL , 8 bytes

ttYsYm<)

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

tt    % Implicitly input array. Duplicate twice
Ys    % Cumulative sum
Ym    % Arithmetic mean
<     % Less than? (element-wise). Gives an array containing true / false
)     % Reference indexing : use that array as a mask to select entries 
      % from the input. Implicitly display
Luis Mendo
fuente
7

05AB1E , 9 8 bytes

-1 bytes gracias a Magic Octopus Urn

ηOO¹g/‹Ï

Pruébalo en línea!

η        # Get prefixes
 O       # Sum each
  O¹g/   # Get the mean ( length(prefix list) equals length(original list) )
      ‹Ï # Keep only the value that are less than the mean

05AB1E , 6 bytes

Usando el nuevo ÅAcomando.

ηOÅA‹Ï

Pruébalo en línea!

η      # Get prefixes
 O     # Sum each
  ÅA   # Get the mean
    ‹Ï #  Keep only the value that are less than the mean
Riley
fuente
2
ηOO¹g/›Ïpara 8; También comienza con nOO!.
Urna de pulpo mágico
5

Japt v2.0a0, 12 11 10 bytes

f<Uå+ x÷Ul

Pruébalo

  • 1 byte guardado gracias a que ETH señala un carácter redundante.

Explicación

Entrada implícita de matriz U.

f<

Filtre ( f) la matriz comprobando si cada elemento es menor que ...

Uå+

Ureducido acumulativamente ( å) sumando ...

x

Con la matriz resultante a su vez reducida sumando ...

/Ul

Y dividido por la longitud ( l) de U.

Salida implícita de la matriz resultante.

Lanudo
fuente
4

Python 3 con Numpy , 48 bytes

lambda x:x[x<mean(cumsum(x))]
from numpy import*

La entrada y la salida son matrices Numpy. Pruébalo en línea!

Luis Mendo
fuente
1
+1 Finalmente, alguien usa cumsum!
Sr. Xcoder
3

Jalea , 9 bytes

+\S÷L<Ðf@

Pruébalo en línea!

Monja permeable
fuente
Tal vez <Ðf@debería ser en su lugar <Ðḟ@?
Erik the Outgolfer
@EriktheOutgolfer pero pasa todos los casos de prueba.
Leaky Nun
Aún así, algo no me parece bueno ... primero que nada +\S÷Lcalcula el hiper-promedio, luego lo <Ðf@coloca como su argumento correcto y <regresará 1si un elemento es un pseudo-elemento, esencialmente filtrando los pseudo-elementos en lugar de filtrarlo. ellos afuera.
Erik the Outgolfer
@EriktheOutgolfer En este contexto, filtrar significa filtrar por.
Leaky Nun
3

Python 2 , 78 76 71 66 bytes

-7 bytes gracias al Sr. Xcoder.

lambda l:[x for x in l if x<sum(sum(l[:i])for i in range(len(l)))]

Pruébalo en línea!

totalmente humano
fuente
Creo que puedes hacerlo range(len(l))y l[:i+1]por -2 bytes (no probado)
Sr. Xcoder
Golfizado y ofuscado. ;) ¡Gracias!
totalmente humano
Sin embargo, su solución no es válida. Cambie x>sum(...)a x<sum(...)para que sea válido, todavía 76 bytes
Sr. Xcoder
Wherps ... Fijo. >.>
totalmente humano
3

Haskell, 39 bytes

f l=filter(<sum(scanl1(+)l)/sum(1<$l))l

Pruébalo en línea!

Por desgracia lengthes de tipo Int, así que no puedo usarlo con división de coma flotante /y tengo que usar una solución: sum(1<$l).

nimi
fuente
3

Casco , 10 9 bytes

¡Gracias @Zgarb por jugar golf en 1 byte!

f</L⁰Σ∫⁰⁰

Pruébalo en línea!

Ungolfed / Explicación

           -- argument is ⁰ (list) 
f       ⁰  -- filter the original list with
 <         --   element strictly smaller than
     Σ∫⁰   --   sum of all prefixes
  /L⁰      --   averaged out
ბიმო
fuente
2
f</L⁰Σ∫⁰⁰es de 9 bytes, pero tres argumentos lambda se sienten torpes.
Zgarb
3

JavaScript (ES6), 56 55 52 bytes

a=>a.filter(x=>x<t/a.length,a.map(x=>t+=s+=x,s=t=0))

Pruébalo

o.innerText=(f=

a=>a.filter(x=>x<t/a.length,a.map(x=>t+=s+=x,s=t=0))

)(i.value=[1,4,-3,10]);oninput=_=>o.innerText=f(i.value.split`,`.map(eval))
<input id=i><pre id=o>

Lanudo
fuente
3

Java 8, 81 bytes

Esta expresión lambda acepta a List<Float>y la muta. El iterador de la lista de entrada debe admitir la eliminación ( ArrayList's lo hace, por ejemplo). Asignar a Consumer<List<Float>>.

a->{float l=0,t=0,u;for(float n:a)t+=n*(a.size()-l++);u=t/l;a.removeIf(n->n>=u);}

Lambda sin golf

a -> {
    float l = 0, t = 0, u;
    for (float n : a)
        t += n * (a.size() - l++);
    u = t / l;
    a.removeIf(n -> n >= u);
}

Pruébalo en línea

Expresiones de gratitud

  • -3 bytes gracias a Kevin Cruijssen
  • -17 bytes gracias a Nevay
Jakob
fuente
1
Puede guardar 3 bytes eliminando t/=l;y cambiando if(n<t)a if(n<t/l).
Kevin Cruijssen
1
Puede usar una lista en lugar de una matriz para poder modificar el argumento proporcionado en lugar de imprimir los valores resultantes a->{float l=0,t=0,u;for(float n:a)t+=n*(a.size()-l++);u=t/l;a.removeIf(n->n>=u);}(81 bytes).
Nevay
2

Python 3 , 72 bytes

lambda x:[*filter((sum(-~a*b for a,b in enumerate(x))/len(x)).__gt__,x)]

Pruébalo en línea!

Halvard Hummel
fuente
¡Una solución muy inteligente! Nunca pensé filterque ganaría la comprensión habitual de la lista.
Sr. Xcoder
2

Python 3 , 76 bytes

lambda x:[w for w in x if w<sum(u*v+v for u,v in enumerate(x[::-1]))/len(x)]

Entrada y salida son listas de números. Pruébalo en línea!

Esto también funciona en Python 2 (con el reemplazo obvio de la printsintaxis en el pie de página).

Luis Mendo
fuente
¿Necesitas revertir la lista?
officialaimm
@officialaimm Creo que sí, porque los valores de enumeración 1,2,3, ... deben ir con x [0], x [-1], x [-2]. Pero en todos los casos el resultado parece ser el mismo, hmm ...
Luis Mendo
1
Encontré un contraejemplo que muestra que invertir es realmente necesario
Luis Mendo
Ah, no importa ... Solo lo pensé porque pasó todos los casos de prueba ...: P
officialaimm
1

PHP, 84 bytes

for($i=--$argc;$i;)$s+=$i--/$argc*$r[]=$argv[++$k];foreach($r as$x)$x<$s&&print$x._;

toma datos de los argumentos de la línea de comandos. Corre -nro pruébalo en línea .


resumir las listas parciales es lo mismo que resumir cada elemento multiplicado por el número de elementos siguientes +1 → no es necesario hacer malabarismos con funciones de matriz voluminosas. Sin embargo, todavía es largo.

Titus
fuente
1

J, 15 bytes

#~[<[:(+/%#)+/\

Pruébalo en línea! Espera una matriz de estilo J (negativos representados usando en _lugar de -elementos separados por espacios; consulte el enlace TIO para ver ejemplos).

No sé si hay una manera de eliminar los paréntesis alrededor de la media (+/%# ), pero eliminar eso y la gorra sería lo primero que trataría de hacer para seguir jugando al golf.

Explicación

A veces J lee como (ofuscado) inglés.

#~ [ < [: (+/ % #) +/\
                   +/\  Sum prefixes
                     \   Get prefixes
                   +/    Sum each
          (+/ % #)      Mean
           +/            Sum of array
              %          Divided by
                #        Length of array
   [ <                  Input array is less than?
                         (gives boolean array of pairwise comparisons)
#~                      Filter by
col
fuente
1
me ganaste por 3 minutos :)
Jonah
12 bytes con#~]<1#.+/\%#
millas
@miles A menos que piense que es lo suficientemente similar, creo que su comentario podría justificar su propia respuesta. EDITAR: Creo que yo mismo soy muy inteligente.
cole
1

Mathematica, 35 bytes

Cases[#,x_/;x<#.Range[#2,1,-1]/#2]&

Functionque espera una lista de números como primer argumento #y la longitud de la lista como segundo argumento #2. #.Range[#2,1,-1]/#2toma el producto punto de la lista de entrada #y la lista Range[#2,1,-1] == {#2,#2-1,...,1}, luego se divide por la longitud #2. Luego devolvemos el Cases x_en la lista de entrada# que son menores que el hiper-promedio.

Sin la longitud como segundo argumento, necesitamos 6más bytes:

Cases[#,x_/;x<#.Range[h=Tr[1^#],1,-1]/h]&
ngenisis
fuente
0

K (oK) , 26 bytes

Solución:

x@&x<(+/+/'x@!:'1+!#x)%#x:

Pruébalo en línea!

Ejemplos:

> x@&x<(+/+/'x@!:'1+!#x)%#x:1 4 -3 10
1 4 -3
> x@&x<(+/+/'x@!:'1+!#x)%#x:-289.93 912.3 -819.39 1000
-289.93 -819.39

Explicación:

Interpretado de derecha a izquierda. Luchó con una forma corta de extraer prefijos:

x@&x<(+/+/'x@!:'1+!#x)%#x: / the solution
                        x: / store input in x, x:1 4 -3 10
                       #   / count, return length of x, #1 4 -3 10 => 4
     (               )     / do everything in the brackets together
                   #x      / count x
                  !        / til, range 0..x, !4 => 0 1 2 3
                1+         / add 1 vectorised, 1+0 1 2 3 => 1 2 3 4
             !:'           / til each, e.g. !1, !2, !3, !4
           x@              / index into x at these indices (now we have the prefixes)
        +/'                / sum (+ over) each, e.g. 1 5 2 12
      +/                   / sum over, e.g. 20
                      %    / right divided by left, 20%4 => 5 (now we have the hyper average)
   x<                      / boolean list where x less than 5
  &                        / indices where true, &0111b => 1 2 3
x@                         / index into x at these indices (now we have the filtered list)

Notas:

Versión alternativa que toma la longitud de entrada como parámetro ( solución de 25 bytes):

> {x@&x<(+/+/'x@!:'1+!y)%y}[1 4 -3 10;4]
1 4 -3
callejero
fuente
0

TI-Basic, 9 bytes

Ans*(Ans<mean(cumSum(Ans
Timtech
fuente