의사 요소를 필터링하십시오!


15

우리는 정의 하이퍼 평균 (숫자) 배열 / 목록의 접두사의 합계의 산술 평균을.

예를 들어, 목록의 하이퍼 평균은 [1, 4, -3, 10]다음과 같은 방식으로 계산됩니다.

  • 우리는 접두사를 얻는다 : [1], [1, 4], [1, 4, -3], [1, 4, -3, 10].

  • 각각을 요약하십시오 : [1, 5, 2, 12].

  • 이제이 목록에있는 요소의 산술 평균을 얻으십시오 (1 + 5 + 2 + 12) / 4 = 5.

배열 의 의사 요소는 값이 하이퍼 평균보다 엄격하게 낮은 요소입니다 . 따라서, 우리의 실시 예에서의 가상 요소는 1, 4-3.


부동 소수점 숫자 목록이 제공되면 의사 요소 목록을 반환해야합니다.

  • 부동 소수점 부정확성에 대해 걱정할 필요가 없습니다.

  • 입력 목록은 절대로 비어 있지 않으며 정수와 부동 소수점을 모두 포함 할 수 있습니다. 언급 한 경우, 정수는 (와 수레로 할 수있다 <integer>.0)

  • 숫자가 선택한 언어에 맞는 것으로 가정 할 수 있지만 어떤 식 으로든 그것을 남용하지 마십시오.

  • 선택적으로 배열의 길이를 입력으로 사용할 수도 있습니다.

  • 이것은 이므로 태그의 표준 규칙이 적용됩니다. 바이트 단위의 짧은 코드 ( 각 언어로 )가 이깁니다!


테스트 사례

입력-> 출력

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

일부 언어에서 배열의 길이를 추가 입력 으로 사용할 수 있으면 모든 언어에 허용되어야합니다 .
ngenisis

1
@ngenisis 모든 언어에 적용됩니다. 길이가 길어지고 프로그램이 단축되는 경우 자유롭게 수행하십시오. 이 사양은 언어 제한이 아닙니다.
Mr. Xcoder

답변:



7

05AB1E , 9 8 바이트

Magic Octopus Urn 덕분에 -1 바이트

ηOO¹g/‹Ï

온라인으로 사용해보십시오!

η        # 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 바이트

새로운 ÅA명령을 사용합니다 .

ηOÅA‹Ï

온라인으로 사용해보십시오!

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

2
ηOO¹g/›Ï8; 또한로 시작합니다 nOO!.
Magic Octopus Urn

5

Japt v2.0a0, 12 11 10 바이트

f<Uå+ x÷Ul

그것을 테스트

  • ETH 가 중복 문자를 가리켜 1 바이트가 절약되었습니다 .

설명

배열의 암시 적 입력 U.

f<

필터 ( f)의 각 요소 미만인지 확인하여 배열 ...

Uå+

Uå합산하여 누적 감소 ( ) ...

x

결과 배열을 합산하면 감소합니다 ...

/Ul

그리고의 길이 ( l)로 나눕니다 U.

결과 배열을 내재적으로 출력합니다.



3

아마도 <Ðf@대신해야 <Ðḟ@합니까?
아웃 골퍼 Erik

@EriktheOutgolfer 그러나 모든 테스트 케이스를 통과합니다.
Leaky Nun

그래도 뭔가 나에게 좋지 않은 것처럼 보입니다 ... 먼저 +\S÷L하이퍼 평균을 계산 한 다음 <Ðf@올바른 인수로 놓고 요소가 의사 요소 인 경우 기본적으로 필터링 대신 의사 요소를 필터링하여 <반환 1합니다 그들을 밖으로.
아웃 골퍼 Erik

@EriktheOutgolfer이 문맥에서 필터링은 필터링을 의미합니다.
Leaky Nun

3

파이썬 2 , 78 76 71 66 바이트

Mr. Xcoder 덕분에 -7 바이트.

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

온라인으로 사용해보십시오!


나는 당신이 할 수 있다고 생각 range(len(l))하고 l[:i+1]-2 바이트 (테스트되지 않음)
Mr. Xcoder

골프와 난독 화. ;) 감사!
완전히 인간적인

귀하의 솔루션은 유효하지 않습니다. 변경 x>sum(...)x<sum(...)가 유효하기는 여전히 76 바이트
씨 Xcoder

...... 수정되었습니다. >.>
완전히 인간적인


3

하스켈, 39 바이트

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

온라인으로 사용해보십시오!

불행히도 length유형 Int이므로 부동 소수점 나누기 /와 함께 사용할 수 없으며 해결 방법을 사용해야합니다 sum(1<$l).


3

껍질 , 10 9 바이트

1 바이트를 골라 내고 @Zgarb에게 감사드립니다!

f</L⁰Σ∫⁰⁰

온라인으로 사용해보십시오!

언 골프 / 설명

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

2
f</L⁰Σ∫⁰⁰9 바이트이지만 3 개의 람다 인수는 어지럽습니다.
Zgarb

3

자바 스크립트 (ES6), 56 55 52 바이트

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

그것을 테스트

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

자바 8, 81 바이트

이 람다 식은 a를 받아들이고 List<Float>변형합니다. 입력 목록의 반복자는 제거를 지원해야합니다 ( ArrayList예 :의 경우). 에 할당하십시오 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);}

언 골프 람다

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

온라인 시도

감사의 말

  • Kevin Cruijssen 덕분에 -3 바이트
  • Nevay 덕분에 -17 바이트

1
를 제거 t/=l;하고로 변경 if(n<t)하여 3 바이트를 절약 할 수 있습니다 if(n<t/l).
Kevin Cruijssen

1
결과 값 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 바이트)을 인쇄하는 대신 제공된 인수를 수정할 수 있도록 배열 대신 목록을 사용할 수 있습니다 .
Nevay



2

파이썬 3 , 76 바이트

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

입력 및 출력은 숫자 목록입니다. 온라인으로 사용해보십시오!

이것은 Python 2에서도 작동 print합니다 (바닥 글의 구문을 분명히 대체 함 ).


목록을 되돌려 야합니까?
officialaimm

@officialaimm 나는 열거 값 1,2,3, ...이 x [0], x [-1], x [-2]와 함께 가야하기 때문에 그렇게 생각합니다. 그러나 모든 경우에 결과는 똑같아 보입니다.
Luis Mendo

1
나는 반전이 정말로 필요하다는 것을 보여주는 반례 를 발견 했다
Luis Mendo

아, 신경 쓰지 마 .. 모든 테스트 사례를 통과했기 때문에 그렇게 생각했다 ... : P
officialaimm





1

PHP, 84 바이트

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

명령 행 인수에서 입력을받습니다. 온라인으로 실행 -nr하거나 사용해보십시오 .


부분리스트를 합산하는 것은 각 원소를 합산하는 것과 동일하며, 다음 원소의 수 +1 → 부피가 큰 배열 함수로 저글링 할 필요가 없습니다. 그래도 여전히 길다.



1

J, 15 바이트

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

온라인으로 사용해보십시오! J 스타일 배열을 기대합니다 (음표 _대신- 공백으로 구분 된 요소 요소를 -예제는 TIO 링크 참조).

평균 주위의 괄호를 제거하는 방법이 있는지 모르겠습니다.+/%# ) 못하지만 모자를 제거하면 골프를 치기 위해 가장 먼저 시도 할 것입니다.

설명

때로는 J는 (난독 화 된) 영어처럼 읽습니다.

#~ [ < [: (+/ % #) +/\
                   +/\  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
당신은 3 분까지 나를 이겼습니다 :)
Jonah

12 바이트#~]<1#.+/\%#
마일

@miles 당신은 그것이 충분히 비슷하다고 생각하지 않으면, 당신의 의견은 그 자신의 대답을 보증 할 수 있다고 생각합니다. 편집 : 나는 그것이 매우 영리하다고 생각합니다.
Cole


1

Mathematica, 35 바이트

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

Function이것은 첫 번째 인수로 숫자 #목록을, 두 번째 인수로 목록의 길이 를 예상합니다 #2. #.Range[#2,1,-1]/#2입력 목록 #과 목록의 내적을 취한 Range[#2,1,-1] == {#2,#2-1,...,1}다음 길이로 나눕니다 #2. 그런 다음 하이퍼 평균보다 작은 Cases x_입력 목록에 입력 을 반환합니다 #.

두 번째 인수로 길이가 없으면 6더 많은 바이트 가 필요 합니다.

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

0

K (oK) , 26 바이트

해결책:

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

온라인으로 사용해보십시오!

예 :

> 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

설명:

오른쪽에서 왼쪽으로 해석됩니다. 접두사를 추출하는 간단한 방법으로 어려움을 겪었습니다.

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)

노트:

입력 길이를 매개 변수로 사용하는 대체 버전 ( 25 바이트 솔루션) :

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.