Марио Kart забил ж / галстуки


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

JavaScript (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

Правильный инструмент для работы!
геокавель

5
Это должно быть 3 байта (просто ave), иначе это просто фрагмент (который не разрешен). К счастью, это экономит 5 байтов.
Caird Coneheringaahing

@caird спасибо, ты абсолютно прав.
BLT

4

Perl 5 , 109 +1 (-a) = 110 байт

@p=(1..10,12,15);while(@F){$/=$,=0;do{$,++;$/+=pop@p}while($w=shift@F)==$F[0];push@r,(int.5+$//$,)x$,}say"@r"

Попробуйте онлайн!

Включает 17 байтов для жесткого кодирования значений точек.


4

MATL , 12 10 байт

2 байта, благодаря @geokavel !

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

Решение Nics! Я думаю, что вы можете сохранить несколько байтов, не округляя до ближайшего целого (это не обязательно).
геокавель

@geokavel О, ты прав! Я неправильно истолковал задачу как требующую округления. Благодарность!
Луис Мендо

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 Core) , 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 Core) + с использованием 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, но я думаю, что страница вики объясняет это довольно хорошо.


Обратите внимание, что OP добавлен, You can also take the points list [15,12,10,9,...] as input.если это спасет вас от байтов
Стивен


2

Желе , 11 байт

ṁ⁴Œg¤Æmṁ$€F

Попробуйте онлайн!

-3 байта благодаря fireflame за то, что он заметил новые возможности Jelly: D


Да, наверное, слишком долго смотреть на то, насколько короткими являются решения по соответствующей проблеме.
геокавель

@geokavel раздражает то, что код для генерации списка длиннее, чем J-решение для этого; _;
HyperNeutrino

Я забыл поставить, что вы можете взять список точек в качестве входных данных. Я собираюсь добавить это.
геокавель

11 байт. Использует новую среднюю арифметическую монаду вместо S÷Lи вместо формы xL, что позволяет $вместо двух µ.
fireflame241





1

Dyalog APL, 14 байтов

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

Принимает список баллов в качестве левого аргумента и список баллов в качестве правого аргумента. Добавьте 2 байта для упаковки() если вызывается напрямую, а не как именованная функция.

{... }⌸группировать правый аргумент по ключу в левом аргументе и применять функцию в фигурных скобках к каждой группе (ключевой оператор).

⊂≢⍴+/÷≢ это вилка, где:

+/÷≢ среднее количество баллов за группу (сумма, поделенная на подсчет)

≢⍴ изменить форму (повторить среднее, чтобы соответствовать количеству элементов в группе)

блокирует результат (это должно противодействовать смешиванию результата, к которому применяется ключевой оператор)

is enlist и сводит результат ключевого оператора (который является вложенным вектором векторов) в простой список.

Попробуй APL онлайн


1

Haskell, 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

Это боль для импорта groupByиon поэтому я должен был сделать свой собственный.

Функция усреднения будет сокращена в ближайшее время.

Необходимости подписи, вероятно, можно избежать с помощью флагов компилятора.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.