카테고리 보관물: 코딩

코딩

중앙값 계산 인 경우 중앙값은 정렬 된 목록의 중앙에있는

도전

비어 있지 않은 실수 목록이 주어지면 중앙값을 계산하십시오.

정의

중앙값은 다음과 같이 계산됩니다. 먼저 목록을 정렬하고

  • 항목 수가 홀수 인 경우 중앙값은 정렬 된 목록의 중앙에있는 값입니다.
  • 그렇지 않으면 중앙값은 정렬 된 목록의 중심에 가장 가까운 두 값의 산술 평균입니다.

[1,2,3,4,5,6,7,8,9] -> 5
[1,4,3,2] -> 2.5
[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,-5,100000,1.3,1.4] -> 1.5
[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,-5,100000,1.3,1.4] -> 1.5


답변

파이썬 2 , 48 바이트

결과를 반환하는 명명되지 않은 함수입니다. xnor 덕분에 -1 바이트

lambda l:l.sort()or(l[len(l)/2]+l[~len(l)/2])/2.

첫 단계는를 사용하여 배열을 정렬하는 것 l.sort()입니다. 그러나 우리는 람다에 하나의 문장 만 가질 수 있으므로 파이썬에서 거짓을 -를 None추가 하여 정렬 함수가 반환한다는 사실을 활용 하여 명령문의 다음 부분을 평가하고 반환하도록 지시합니다.orNone

이제 우리는 정렬 된리스트를 가지게됩니다. 중간 또는 중간 2 값을 찾아야합니다.

조건을 사용하여 그래서 대신에 우리가 인덱스를 얻을 길이의 패리티가 너무 자세한 것 확인 len(l)/2하고 ~len(l)/2:

  • 첫 번째는 floor (length / 2) 이며, 길이가 홀수 인 경우 중간 요소를 가져 오거나 길이가 짝수 인 경우 중앙 쌍의 왼쪽 항목을 가져옵니다.
  • 두 번째는 목록 길이의 이진 반전으로 -1-floor (length / 2)로 평가됩니다 . 파이썬의 네거티브 인덱싱으로 인해 이것은 기본적으로 첫 번째 인덱스와 동일하지만 배열 끝에서 거꾸로 수행됩니다.

목록의 길이가 홀수 인 경우 이러한 인덱스는 동일한 값을 가리 킵니다. 길이가 짝수이면 중앙 두 항목을 가리 킵니다.

이제이 두 인덱스가 있으므로 목록에서이 값을 찾아 합산 한 다음 2로 나눕니다. 소수점 이하 자릿수 /2.는 정수 나누기보다는 부동 나누기입니다.

람다 함수이므로 결과가 암시 적으로 반환됩니다.

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


답변

Python3 – 31 30 바이트

@Dennis 덕분에 바이트를 절약했습니다!

나는 기본 답변을 계획하지 않았지만 이 모듈을 발견 하고 그것이 정말 멋진 cuz라고 생각했습니다.

from statistics import*;median

여기에서 온라인으로 사용해보십시오 .


답변


답변

젤리 , 9 바이트

L‘HịṢµ÷LS

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

설명

나는 아직도 Jelly를 중단하고 있습니다 … 중간 값이나 목록의 평균을위한 내장 기능을 찾을 수 없었지만 Jelly가 정수가 아닌 인덱스를 목록으로 허용하는 것은이 도전에 매우 편리합니다. 이 경우 가장 가까운 두 값의 쌍을 반환합니다. 즉, 입력 길이의 절반을 인덱스로 사용하여 평균을 구할 때 한 쌍의 값을 얻을 수 있습니다.

L          Get the length of the input.
 ‘         Increment it.
  H        Halve it. This gives us the index of the median for an odd-length list
           (Jelly uses 1-based indexing), and a half-integer between the two indices
           we need to average for even-length lists.
   ịṢ      Use this as an index into the sorted input. As explained above this will
           either give us the median (in case of an odd-length list) or a pair of
           values we'll now need to average.
     µ     Starts a monadic chain which is then applied to this median or pair...
      ÷L     Divide by the length. L treats atomic values like singleton lists.
        S    Sum. This also treats atomic values like singleton lists. Hence this
             monadic chain leaves a single value unchanged but will return the
             mean of a pair.

답변

Brain-Flak , 914 + 1 = 915 바이트

([]){({}[()]<(([])<{({}[()]<([([({}<(({})<>)<>>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<>)<>>)<>({}<>)>)}{}({}<>)<>>)}{}<>{}>[()]){({}[()]<({}<>)<>>)}{}<>>)}{}([]<(()())>(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{}<(())>){((<{}{}([[]]()){({}()()<{}>)}{}(({}){}<([]){{}{}([])}{}>)>))}{}{(<{}([[]]()()){({}()()<{}>)}{}({}{}<([]){{}{}([])}{}>)>)}{}([(({}<((((((()()()){}){}){}()){})[()()()])>)<(())>)](<>)){({}())<>}{}<>{}{}<>(({})){{}{}<>(<(())>)}{}(({}<>)<{(<{}([{}])>)}{}{(({})<((()()()()()){})>)({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})({}<({}<>)<>>((((()()()){}){}){}){})((()()()()()){})<>({}<>)(()()){({}[()]<([([({})](<()>))](<>())){({}())<>}{}<>{}{}<>(({})){{}{}<>(<(())>)}{}(({})<>)<>{(<{}([{}])>)}{}({}<>)<>({}<><({}<>)>)>)}{}({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>)<>(({}{}[(())])){{}{}(((<{}>)))}{}{}{(<{}<>([{}])><>)}{}<>}{}>){(<{}(((((()()()()())){}{})){}{})>)}{}

필요 -A실행 플래그를.

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

설명

이 알고리즘의 중추는 얼마 전에 쓴 버블입니다.

([]){({}[()]<(([])<{({}[()]<([([({}<(({})<>)<>>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<>)<>>)<>({}<>)>)}{}({}<>)<>>)}{}<>{}>[()]){({}[()]<({}<>)<>>)}{}<>>)}{}

나는 이것이 어떻게 작동하는지 기억하지 못하므로 나에게 묻지 마십시오. 하지만 스택을 정렬하고 네거티브에 대해서도 작동한다는 것을 알고 있습니다.

모든 것이 정렬 된 후 다음 청크가있는 중앙값의 2 배를 찾습니다.

([]<(()())>(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{}<(())>)  #Stack height modulo 2
{((<{}{}          #If odd
 ([[]]())         #Push negative stack height +1
 {                #Until zero
  ({}()()<{}>)    #add 2 to the stack height and pop one
 }{}              #Get rid of garbage
 (({}){}<         #Pickup and double the top value
 ([]){{}{}([])}{} #Remove everything on the stack
 >)               #Put it back down
>))}{}            #End if
{(<{}                     #If even
  ([[]]()())              #Push -sh + 2
  {({}()()<{}>)}{}        #Remove one value for every 2 in that value
  ({}{}<([]){{}{}([])}{}>)#Add the top two and remove everything under them
>)}{}                     #End if

이제 남은 것은 ASCII로 변환하는 것입니다

([(({}<((((((()()()){}){}){}()){})[()()()])>)<(())>)](<>)){({}())<>}{}<>{}{}<>(({})){{}{}<>(<(())>)}{}(({}<>)<
{(<{}([{}])>)}{}  #Absolute value (put "/2" beneath everything)

{                 #Until the residue is zero
(({})<            #|Convert to base 10
((()()()()()){})  #|
>)                #|...
({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})
({}<({}<>)<>>((((()()()){}){}){}){})((()()()()()){})<>({}<>)
                  #|
(()()){({}[()]<([([({})](<()>))](<>())){({}())<>}{}<>{}{}<>(({})){{}{}<>(<(())>)}{}(({})<>)<>{(<{}([{}])>)}{}({}<>)<>({}<><({}<>)>)>)}{}({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>)<>(({}{}[(())])){{}{}(((<{}>)))}{}{}{(<{}<>([{}])><>)}{}<>
}{}               #|
>)
{(<{}(((((()()()()())){}{})){}{})>)}{}  #If it was negative put a minus sign

답변

R, 6 바이트

median

통계 프로그래밍 언어 인 R에이 기능이 내장되어 있다는 것은 놀라운 일이 아닙니다.


답변

MATL , 4 바이트

.5Xq

이것은 중앙값 인 0.5-quantile을 찾습니다.

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