Маріо Карт, забиваючи ж / краватки


16

Я зіткнувся з цією проблемою, працюючи над іншим завданням, яке я роблю для цього сайту. У цьому виклику я використовую " Маріо Карт 8 очок ". Сума балів, яку отримує гравець у 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 балів. (Примітка. Вам дозволяється кругообіг до найближчого int, тому 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 байт

Приймає введення в синтаксисі currying (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 байт

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! Я думаю, що ви можете зберегти кілька байт, не округляючи до найближчого int (це не потрібно).
geokavel

@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 байт для ~-пасиву, щоб перевернути порядок, у який приймаються вхідні дані.

До гольфу може бути кілька речей, до яких належить

  • Моє використання боксу
  • Шапка в кінці

Пояснення

Я розділю це на пару функцій.

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, але я думаю, що сторінка wiki пояснює це досить добре.


Зауважте, що ОР додано, You can also take the points list [15,12,10,9,...] as input.якщо це економить вам будь-які байти
Стівен


2

Желе , 11 байт

ṁ⁴Œg¤Æmṁ$€F

Спробуйте в Інтернеті!

-3 байти завдяки fireflame за те, що помітили нові функції желе: D


Так, напевно, занадто довго дивимось на те, наскільки короткими є рішення, пов'язані з цим завданням.
geokavel

@geokavel дратує те, що код для створення списку довший, ніж рішення J на ​​цьому; _;
HyperNeutrino

Я забув сказати, що ви також можете взяти список балів як вхід. Я збираюся додати це.
geokavel

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





1

Діалог APL, 14 байт

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

Приймає список балів як лівий аргумент, а список балів - як аргумент. Додайте 2 байти для його завершення, ()якщо викликається безпосередньо, а не як названа функція.

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

⊂≢⍴+/÷≢ - це виделка, де:

+/÷≢ - середній бал для групи (сума, поділена на підрахунок)

≢⍴ табл. переформатувати (копіювати середнє, щоб відповідати кількості елементів у групі)

Показує результат (це протидіє змішуванню результату, який застосовується ключовим оператором)

включає список і вирівнює результат оператора ключа (який є вкладеним вектором) у простий список.

Спробуйте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.