마리오 카트 점수 승 / 넥타이


16

이 사이트를 위해 또 다른 과제를 수행하는 동안이 문제가 발생했습니다. 그 도전에서 나는 " Mario Kart 8 Scoring "을 사용합니다. k 번째 장소 에서 플레이어 가 얻는 점수는 이 1- 인덱스 배열로 표시됩니다 : [15,12,10,9,8,7,6,5,4,3,2,1]. 따라서 1 위는 15 포인트, 2 위는 12 포인트 등을 얻습니다.

이와 같은 포인트를 할당하는 것은 쉽지만 까다로운 부분은 타이를 처리하는 방법과 함께 제공됩니다. 내가하는 일은 각 동점 플레이어에게 각 동점에 주어진 평균 점수를주는 것입니다. 예를 들어, 1 위와 2 위만 묶으면 두 플레이어 모두 (15 + 12) / 2 = 13.5 포인트를 얻습니다. (참고 : 가장 가까운 정수로 반올림 할 수 있으므로 13 또는 14도 모두 허용됩니다.) 그런 다음 3-12 위는 해당 위치에 대한 정상적인 점수를 얻습니다.

도전

점차적으로 정렬되는 12 개의 음이 아닌 정수 점수가 주어지면 각 플레이어가 얻는 점수를 출력합니다. 포인트리스트 [15,12,10,9, ...]를 입력으로 사용할 수도 있습니다. 각 플레이어가 얻는 점수는 실제 점수의 값에 의존하지 않고 다른 점수와 어떻게 비교되는지에 유의하십시오.

테스트 사례

  • [21,21,15,14,12,9,6,5,4,3,2,1] => [ 14,14 , 10,9,8,7,6,5,4,3,2 , 1]
  • [20,15,15,15,10,9,8,7,6,5,4,3] => [15, 10,10,10 , 8,7,6,5,4,3,2, 1]
    • 설명 : (12 + 10 + 9) / 3 = 10.3333
  • [1,1,1,1,1,1,1,1,1,1,1,1] => [ 7,7,7,7,7,7,7,7,7,7,7, 7 ]
    • 설명 : (15 + 12 + 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1) / 12 = 6.8333
  • [20,20,20,20,10,10,10,9,8,7,6,5] => [ 12,12,12,12 , 7,7,7 , 5,4,3,2, 1]
    • 설명 : (15 + 12 + 10 + 9) / 4 = 11.5, (8 + 7 + 6) / 3 = 7
  • [100,99,98,95,95,95,94,93,93,92,91,91] => [15,12,10, 8,8,8,6 , 5,5 , 3, 2, 2 ]
    • 설명 : (9 + 8 + 7) / 3 = 8, (5 + 4) / 2 = 4.5, (2 + 1) / 2 = 1.5

관련 : "건너 뛰기"점수 목록

답변:


5

자바 스크립트 (ES6), 57 바이트

카레 구문으로 입력을 받습니다. (p)(s)여기서 p 는 포인트 목록이고 s 는 점수 목록입니다.

p=>s=>s.map(v=>s.reduce((t,x,i)=>x-v?t:t+p[n++,i],n=0)/n)

테스트 사례


5

R , 3 바이트

분명히 R에는 이것에 대한 내장 기능이 있습니다. p연고와 s코어 목록을 입력으로 사용합니다.

ave

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

예:

p=c(15,12,10,9,8,7,6,5,4,3,2,1)

> ave(p,c(20,15,15,15,10,9,8,7,6,5,4,3))
 [1] 15.00000 10.33333 10.33333 10.33333  8.00000  7.00000  6.00000  5.00000  4.00000  3.00000  2.00000  1.00000
> ave(p,c(1,1,1,1,1,1,1,1,1,1,1,1))
 [1] 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333 6.833333

작업에 적합한 도구!
geokavel

5
이것은 3 바이트 (단지 ave) 여야합니다. 그렇지 않으면 스 니펫 일뿐입니다 (허용되지 않음). 다행히 5 바이트를 절약 할 수 있습니다.
caird coinheringaahing

@caird 감사합니다, 당신은 절대적으로 맞습니다.
BLT


4

MATL , 12 10 바이트

@geokavel 덕분에 2 바이트가 줄었습니다 !

7#uti2XQw)

입력 ;값은 정수 점수 의 열 벡터 ( 구분자)와 점이있는 열 벡터입니다. 출력에는 개행으로 구분 된 결과가 포함됩니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

       % Implicitly take first input. 
       % STACK: [21;21;15;14;12;9;6;5;4;3;2;1]
7#u    % Unique consecutive integer labels
       % STACK: [1;1;2;3;4;5;6;7;8;9;10;11]
t      % Duplicate
       % STACK: [1;1;2;3;4;5;6;7;8;9;10;11], [1;1;2;3;4;5;6;7;8;9;10;11]
i      % Take second input
       % STACK: [1;1;2;3;4;5;6;7;8;9;10;11], [1;1;2;3;4;5;6;7;8;9;10;11], [15;12;10;9;8;7;6;5;4;3;2;1]
2XQ    % Average second argument as grouped by the first
       % STACK: [1;1;2;3;4;5;6;7;8;9;10;11], [13.5;10;9;8;7;6;5;4;3;2;1]
w      % Swap
       % STACK: [[13.5;10;9;8;7;6;5;4;3;2;1], [1;1;2;3;4;5;6;7;8;9;10;11]
)      % Reference indexing
       % STACK: [13.5;10;9;8;7;6;5;4;3;2;1]
       % Implicitly display

닉스 솔루션! 가장 가까운 int로 반올림하지 않으면 바이트를 절약 할 수 있다고 생각합니다 (필수는 아님).
geokavel

@geokavel 아, 맞아! 반올림을 다시 시도하는 것으로 도전을 잘못 읽었습니다. 감사!
Luis Mendo

3

05AB1E , 12 바이트

γ€g£vygFyÅAˆ

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

설명

γ              # group the scores into chunks of consecutive equal elements
 €g            # get the length of each chunk
   £           # split the points list into chunks of these sizes
    v          # for each chunk y in the points list
     ygF       # len(y) times do:
        yÅA    # get the arithmetic mean of y
           ˆ   # add to global list
               # implicitly output global list

2

C # (. NET 코어) 154 바이트

x=>s=>{for(int i=0;i<12;){int b=0,j=i,a=0,c=0;for(;j<12&&x[i]==x[j];j++,b++){a+=s[j];}a=(int)Math.Round(a/(b+.0));for(;c<b;c++){x[i+c]=a;}i+=b;}return x;}

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

C # (. NET 코어) + Linq 사용, 170 + 23 바이트

x=>s=>x.GroupBy(z=>z).Select(y=>Enumerable.Repeat(Math.Round(s.Skip(Array.IndexOf(x,y.Key)).Take(y.Count()).Average()),y.Count())).Aggregate((a,b)=>a.Concat(b)).ToArray()

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


2

J, 15 바이트

[:;<@(##+/%#)/.

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

점수 목록을 가져옵니다 (1 2 ... 12 15 )을 오른쪽 인수로 값을 왼쪽 인수로 . 논리적 입력이 아닌 경우 1 바이트를 추가하십시오.~ -passive에 하여 입력 순서를 반전시킵니다.

골프에는 몇 가지가 있습니다. 여기에는 다음이 포함됩니다.

  • 권투의 나의 사용법
  • 끝에 캡

설명

이것을 몇 가지 기능으로 나누겠습니다.

avg_and_dupe =. # # +/ % #
score        =. [: ; <@avg_and_dupe/.
  • avg_and_dupe 목록의 평균을 취하여 목록의 길이만큼 여러 번 복제
  • score 점수 목록이 주어진 입력 (왼쪽 인수)에 점수를 매 깁니다 (오른쪽 인수).

avg_and_dupe

# # +/ % #
#           Length
  #         Copy as many times as the left argument
    +/ % #  Average
    +/       Sum
       %     Divided by
         #   Length

포크 로 취급되기 때문에 아주 잘 작동 합니다. . 여전히 머리를 긁고 있다면 (처음에는 알고 있음) 물어보고 이것이 왜 효과가 있는지에 대해 더 자세히 설명 할 수 있습니다.

점수

[: ; <@avg_and_dupe/.
                   /.  Key: using the values given, partition the scores
     <@avg_and_dupe     For each partition:
       avg_and_dupe      Average and duplicate
     <                   Then box
   ;                   Raze the boxes into a single list

여전히 혼란 스럽다면 /.-key 에 대한 설명을 추가 할 수는 있지만 위키 페이지에 설명이 잘되어 있다고 생각합니다 .


You can also take the points list [15,12,10,9,...] as input.바이트가 절약되면 OP가 추가 됩니다.
Stephen


2

젤리 , 11 바이트

ṁ⁴Œg¤Æmṁ$€F

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

새로운 Jelly 기능을 인식하는 fireflame 덕분에 -3 바이트 : D


예, 관련 과제에 대한 솔루션이 얼마나 짧은 지 살펴 보는 것이 너무 길 것입니다.
geokavel

@geokavel 성가신 것은 목록을 생성하는 코드가 J 솔루션보다 길다는 것입니다.
HyperNeutrino

포인트 목록을 입력으로 사용할 수 있다는 것을 잊었습니다. 나는 그것을 추가 할 것입니다.
geokavel

11 바이트 새 산술 평균 모나드 대신을 사용 S÷L하고 대신을 사용하여 두 개 대신 xL사용할 수 있습니다 . $µ
fireflame241241 년





1

Dyalog APL, 14 바이트

∊{(⊂≢⍴+/÷≢)⍵}⌸

점수 목록을 왼쪽 인수로, 포인트 목록을 오른쪽 인수로 취합니다. 래핑을 위해 2 바이트 추가()명명 된 함수가 아닌 직접 호출 경우 .

{...}⌸ 왼쪽 인수에서 키로 오른쪽 인수를 그룹화하고 각 그룹 (키 연산자)에 중괄호로 함수를 적용하십시오.

⊂≢⍴+/÷≢ 포크입니다.

+/÷≢ 그룹의 평균 점수입니다 (합을 탈리로 나눈 값).

≢⍴ 집계 변경 (그룹의 항목 수와 일치하도록 평균 복제)

결과를 상자에 넣습니다 (핵심 연산자가 적용한 결과의 혼합을 막기위한 것입니다)

는 주요 연산자 (벡터의 중첩 벡터)의 결과를 간단한 목록으로 편입시키고 병합합니다.

TryAPL 온라인


1

하스켈, 152 바이트

f::[Int]->[Int]
f=concat.g(15:12:[10,9..1])[]
g[q]t _=[q:t]
g(q:r)t(x:z)|x>head z=(replicate(l(q:t))(sum(q:t)`div`l(q:t))):g r[]z|1<2=g 
r(q:t)z
l=length

수입이 어렵다 groupByon 내 자신을해야했다, 그래서.

평균화 기능이 곧 단축됩니다.

컴파일러 플래그를 사용하면 서명이 필요하지 않을 수 있습니다.

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