Filtra gli pseudo-elementi!


15

Definiamo l' iper-media di un array / elenco (di numeri) la media aritmetica delle somme dei suoi prefissi.

Ad esempio, l'iper-media dell'elenco [1, 4, -3, 10]viene calcolata nel modo seguente:

  • Otteniamo i prefissi: [1], [1, 4], [1, 4, -3], [1, 4, -3, 10].

  • Somma ciascuno: [1, 5, 2, 12].

  • Ed ora ottenere la media aritmetica degli elementi in questo elenco: (1 + 5 + 2 + 12) / 4 = 5.

Uno pseudo-elemento di un array è un elemento il cui valore è strettamente inferiore alla sua iper-media. Quindi, gli pseudo-elementi della nostra lista di esempi sono 1, 4e -3.


Dato un elenco di numeri in virgola mobile, il tuo compito è quello di restituire l'elenco di pseudo-elementi.

  • Non devi preoccuparti di imprecisioni in virgola mobile.

  • L'elenco di input non sarà mai vuoto e può contenere numeri interi e float. Se menzionato, gli interi possono essere presi come float (con <integer>.0)

  • Puoi presumere che i numeri corrispondano alla tua lingua preferita, ma per favore non abusarne in alcun modo.

  • Facoltativamente, è possibile prendere anche la lunghezza dell'array come input.

  • Questo è , quindi si applicano le regole standard per il tag. Vince il codice più breve in byte ( in ogni lingua )!


Casi test

Ingresso -> Uscita

[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]

Se ad alcune lingue è consentito assumere la lunghezza dell'array come input aggiuntivo, dovrebbe essere consentito per tutte le lingue .
ngenisi,

1
@ngenisis È per tutte le lingue. Se anche la lunghezza riduce il programma, sentiti libero di farlo. Quella specifica non è affatto restrittiva della lingua.
Mr. Xcoder,

Risposte:


7

MATL , 8 byte

ttYsYm<)

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

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

7

05AB1E , 9 8 byte

-1 byte grazie a Magic Octopus Urn

ηOO¹g/‹Ï

Provalo online!

η        # 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 byte

Utilizzando il nuovo ÅAcomando.

ηOÅA‹Ï

Provalo online!

η      # Get prefixes
 O     # Sum each
  ÅA   # Get the mean
    ‹Ï #  Keep only the value that are less than the mean

2
ηOO¹g/›Ïper 8; anche inizia con nOO!.
Magic Octopus Urn

5

Japt v2.0a0, 12 11 10 byte

f<Uå+ x÷Ul

Provalo

  • 1 byte salvato grazie all'ETH che indica un carattere ridondante.

Spiegazione

Input implicito di array U.

f<

Filtra ( f) l'array controllando se ogni elemento è inferiore a ...

Uå+

Ucumulativamente ridotto ( å) sommando ...

x

Con l'array risultante a sua volta ridotto sommando ...

/Ul

E diviso per la lunghezza ( l) di U.

Emette implicitamente l'array risultante.



3

Gelatina , 9 byte

+\S÷L<Ðf@

Provalo online!


Forse <Ðf@invece dovrebbe essere <Ðḟ@?
Erik the Outgolfer

@EriktheOutgolfer ma supera tutti i test.
Leaky Nun,

Qualcosa non mi sembra ancora buono ... prima di tutto +\S÷Lcalcola l'ipermedia, quindi la <Ðf@mette come argomento giusto e <ritornerà 1se un elemento è uno pseudo-elemento, essenzialmente filtrando per gli pseudo-elementi invece di filtrare li fuori.
Erik the Outgolfer

@EriktheOutgolfer In questo contesto, filtrare significa filtrare per.
Leaky Nun,

3

Python 2 , 78 76 71 66 byte

-7 byte grazie a Mr. Xcoder.

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

Provalo online!


Penso che tu possa fare range(len(l))e l[:i+1]per -2 byte (non testato)
Mr. Xcoder

Golfato e offuscato. ;) Grazie!
totalmente umano il

Tuttavia, la tua soluzione non è valida. Cambiare x>sum(...)per x<sum(...)per essere valida, ancora 76 byte
Mr. Xcoder

Dov'è ... Risolto. >.>
totalmente umano il


3

Haskell, 39 byte

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

Provalo online!

Purtroppo lengthè di tipo Int, quindi non posso usarlo con galleggianti divisione punto /e devo usare una soluzione: sum(1<$l).


3

Buccia , 10 9 byte

Grazie @Zgarb per il golf off 1 byte!

f</L⁰Σ∫⁰⁰

Provalo online!

Ungolfed / Spiegazione

           -- argument is ⁰ (list) 
f       ⁰  -- filter the original list with
 <         --   element strictly smaller than
     Σ∫⁰   --   sum of all prefixes
  /L⁰      --   averaged out

2
f</L⁰Σ∫⁰⁰è di 9 byte, ma tre argomenti lambda sembrano goffi.
Zgarb,

3

JavaScript (ES6), 56 55 52 byte

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

Provalo

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>


3

Java 8, 81 byte

Questa espressione lambda accetta a List<Float>e la muta. L'iteratore dell'elenco di input deve supportare la rimozione ( ArrayListad esempio, lo fa). Assegna 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 ungolfed

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

Provalo online

Ringraziamenti

  • -3 byte grazie a Kevin Cruijssen
  • -17 byte grazie a Nevay

1
È possibile salvare 3 byte rimuovendoli t/=l;e modificandoli if(n<t)in if(n<t/l).
Kevin Cruijssen,

1
È possibile utilizzare un elenco anziché un array per poter modificare l'argomento fornito anziché stampare i valori risultanti 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 byte).
Nevay,



2

Python 3 , 76 byte

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

Ingresso e uscita sono elenchi di numeri. Provalo online!

Funziona anche in Python 2 (con l'ovvio sostituto di print sintassi nel piè di pagina).


Devi invertire la lista?
officialaimm,

@officialaimm Penso di sì, perché i valori di enumerazione 1,2,3, ... devono andare con x [0], x [-1], x [-2]. Ma in tutti i casi il risultato sembra essere lo stesso, hmm ...
Luis Mendo

1
Ho trovato un controesempio che dimostra che è davvero necessario invertire
Luis Mendo il

Ah, non importa .. L'ho pensato solo perché ha superato tutti i casi di test ...: P
officialaimm





1

PHP, 84 byte

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

accetta input dagli argomenti della riga di comando. Corri con -nro provalo online .


sommare gli elenchi parziali equivale a sommare ogni elemento moltiplicato per il numero di elementi seguenti +1 → nessuna necessità di destreggiarsi con funzioni di array voluminose. È ancora lungo, però.



1

J, 15 byte

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

Provalo online!Si aspetta una matrice di tipo J (negativi rappresentati usando al _posto di -e elementi separati da spazi - vedere il collegamento TIO per esempi).

Non so se c'è un modo per rimuovere le parentesi attorno alla media (+/%# ), ma rimuoverlo e il tappo sarebbe la prima cosa che proverei a fare per giocare a golf ulteriormente.

Spiegazione

A volte J legge come l'inglese (offuscato).

#~ [ < [: (+/ % #) +/\
                   +/\  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

1
mi hai battuto per 3 minuti :)
Giona

12 byte con#~]<1#.+/\%#
miglia

@miles A meno che tu non pensi che sia abbastanza simile, penso che il tuo commento potrebbe giustificare la propria risposta. EDIT: Penso che sia molto intelligente me stesso.
Cole


1

Mathematica, 35 byte

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

Functionche prevede un elenco di numeri come primo argomento #e la lunghezza dell'elenco come secondo argomento #2. #.Range[#2,1,-1]/#2prende il prodotto punto dell'elenco di input #e dell'elencoRange[#2,1,-1] == {#2,#2-1,...,1} , quindi si divide per la lunghezza #2. Quindi restituiamo i Cases x_nella lista di input #che sono inferiori alla media media.

Senza la lunghezza come secondo argomento, abbiamo bisogno di 6più byte:

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

0

K (oK) , 26 byte

Soluzione:

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

Provalo online!

Esempi:

> 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

Spiegazione:

Interpretato da destra a sinistra. Lottato con un modo breve per estrarre i prefissi:

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)

Appunti:

Versione alternativa che prende la lunghezza dell'input come parametro ( soluzione da 25 byte):

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.