Знайдіть відсоток


15

У нас не було жодних приємних, легких викликів протягом певного часу, тому ми йдемо.

Враховуючи список цілих чисел, кожне з яких перевищує 0 та індекс як вхідний, виведіть відсоток елемента за вказаним індексом від загальної суми списку.

Вихід має бути незалежним від того, яке природне представлення для плавців / цілих чисел у вашій мові (одинарні, десяткові, церковні цифри тощо). Якщо ви вирішите будь-яким способом округлювати результат, він повинен містити як мінімум 2 десяткових знаки (коли розумно. 1.2 не потрібно округляти, але 1.20 також цілком прийнятно).

Індекси можуть бути або 1-індексованими, або 0-індексованими, і завжди будуть знаходитись у межах масиву.

Це , тому найкоротший код у байтах виграє!

Приклади

Використовуючи 1-індексований і округлий до 2 dp

list, index                    =>         output
[1, 2, 3, 4, 5], 5             => 5 / 15    => 33.33
[7, 3, 19], 1                  => 7 / 29    => 24.14
[1, 1, 1, 1, 1, 1, 1, 1, 1], 6 => 1 / 9     => 11.11
[20, 176, 194, 2017, 3], 1     => 20 / 2410 => 0.83
[712], 1                       => 712 / 712 => 100

Або, як три списки:

[[1, 2, 3, 4, 5], [7, 3, 19], [1, 1, 1, 1, 1, 1, 1, 1, 1], [20, 176, 194, 2017, 3], [712]]
[5, 1, 6, 1, 1]
[33.33, 24.14, 11.11, 0.83, 100]


3
як саме можуть бути виведені нецілі числа як одинарні / церковні цифри?
— Дверна ручка

1
@Doorknob Може бути одинарне число, крапка та інше одинарне число?
— ВисокоРадіоактивний

Оскільки вихід може бути округлений до двох знаків після коми, можливо, також буде дозволено вивести округлений раз 100?
— Непов’язана струна

1
тестовий випадок 4 має бути 20/2410
— attinat

Відповіді:


6

APL (Dyalog Unicode) , 9 байт SBCS

Функція анонімного мовчання. Приймає індекс як лівий аргумент і список як аргумент правого.

100×⌷÷1⊥⊢

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

100 сто

× разів

⌷ індексований елемент

÷ ділиться на

1⊥ сума (літ. база-1 оцінка)

⊢ правильний аргумент




5

Желе , 7 байт

ị÷S}ȷ2×

Дьядична посилання, що приймає ціле число, одноосновний індекс зліва та список чисел праворуч, який дає відсоток.

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

Як?

ị÷S}ȷ2× - Link: integer, i; list, L
ị       - (i) index into (L)
   }    - use right argument:
  S     -   sum (L)
 ÷      - divide
    ȷ2  - literal 10^2 = 100
      × - multiply

1
Приємно! Це байт для байта, що я мав: P
— caird coinheringaahing


4

R 28 байт

function(n,l)100*l[n]/sum(l)

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


Я не знаю R, але це виглядає не так, як він працює (не впевнений, як протестувати його на TIO за допомогою довільних масивів), оскільки ви повинні отримати елемент lв індексі n, а не просто розділити n(див. [7, 3, 19], 1Тестовий зразок )
— caird coinheringaahing

@cairdcoinheringaahing Моє погано, був друкарський помилок (забув l[]навколо n)
— niko

На сторінці посилання TIO є щось, що може відформатувати це для вас.
— СС Енн


4

Java (JDK) , 47 байт

a->i->1e2*a[i]/java.util.Arrays.stream(a).sum()

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


Чому ви писали 1e2замість 100? Це тому, що 100є цілим числом і 1e2вважається числом з плаваючою точкою?
— Ісмаїл Мігель

1
@IsmaelMiguel Так: 1e2є подвійний тип, який a[i]і сума не відповідають. Оскільки виклик вимагає повернути числа з плаваючою комою, саме тут я можу його використовувати.
— Олів'є

Змініть його на BiFunction <ІНТ [], Integer, Double> і ви можете заощадити 10 байт з цим: (a,i)->1e2*a[i]/IntStream.of(a).sum(). Редагувати:> :( моя бідна стрілка лямбда
— Аві

@Avi Імпорт все ще потрібен, тому мені доведеться написати:, (a,i)->1e2*a[i]/java.util.stream.IntStream.of(a).sum()який становить 54 байти. Моя поточна відповідь - лише 47 байт. Крім того, a->i->на один байт коротший, ніж (a,i)->.
— Олів'є

1
@Avi Так, вони потрібні , і зазвичай коротше писати повне ім’я класу замість імпорту, так що я тут роблю
— Олів'є








2

Червоний , 31 29 байт

-2 байти завдяки ErikF

func[b i][1e2 * b/:i / sum b]

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


1
(-2 байти) пропонуємо використовувати 1e2замість 100.0: Спробуйте в Інтернеті! . Досить акуратно, скільки мов можуть використовувати цей трюк!
— ErikF

@ErikF Дякую! Я це знаю теоретично, але як здається, я забув його використати :)
— Гален Іванов


2

Scratch 3.0 24 23 блоки / 239 228 байт

-11 bytes thanks to @JoKing

Як варіант у синтаксисі SB

when gf clicked
set[s v]to(0
ask()and wait
repeat until<(answer)=(
add(answer)to[m v
ask()and wait
end
set[n v]to(item(length of(n))of(m
repeat(length of((m)-(1
change[s v]by(item(1)of[m v
delete (1)of[m v
end
say(((n)/(s))*(100

Збережено 11 байт завдяки @JoKing

Спробуйте на нулі

Історія відповідей

Oh Scratchblocks, why so long?

Як варіант у синтаксисі SB

when gf clicked
set[s v]to(0
ask()and wait
repeat until<(answer)=(
add(answer)to[m v
ask()and wait
end
set[n v]to(item(length of(n))of(m
delete(n)of[m v
repeat(length of(m
change[s v]by(item(1)of[m v
delete (1)of[m v
end
say(((n)/(s))*(100

Спробуйте на нулі

Введення здійснюється у вигляді:

item1
item2
...
itemN
index

Я дійсно повинен перестати це робити собі. Але це дуже весело!


Ви можете змінити , repeat length of mщоб length of m-1і зберегти себе delete n?
— Джо Кінг

Ні, тому що, якби я це зробив, це не підрахував би останній елемент.
— Ліксал

Що ж, якщо ви видалите так, delete n of mяк я запропонував, то це було б
— Джо Кінг

2

Pyth , 13 байт

c*100@hQeQshQ

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

Перший раз, коли я використовував Pyth, можливо, тут були досить великі оптимізації, але я не знаю, де вони знаходяться ...

0-індекс, приймає введення як list, index




1

TI-Basic , 12 байт (12 жетонів)

Prompt X
Ans(X)E2/sum(Ans

1-індексований

Займає список Ansі запитує користувача на індекс

Приклад виконання

Пояснення:

Prompt X         # Prompt the user for the index
Ans(X)E2/sum(Ans
Ans(X)           # The value at the Xth index in the list
      E2         # times 100
        /sum(Ans # Divided by the sum of the list
                 # The result of the last expression in a program is implicitly returned

1

Сітківка 0,8,2 , 102 байти

\d+
$*
^(1)+((?<-1>.(1+))+)
$3$2
,

\G1
10000$*
;(1+)\1
$1;$1$1
r`.*(\2)*;(1+)
$#1
+`^..?$
0$&
..$
.$&

Спробуйте в Інтернеті! Посилання включає тестові випадки. Вводиться як " index;list,.... Пояснення:

\d+
$*

Перетворити в одинарне.

^(1)+((?<-1>.(1+))+)
$3$2

Індексуйте до списку.

,

Підсумуйте список.

\G1
10000$*
;(1+)\1
$1;$1$1
r`.*(\2)*;(1+)
$#1

Помножте бажане значення на 10000 і розділіть на суму з округленням, додавши спочатку половину суми.

+`^..?$
0$&

Переконайтесь, що результат має принаймні три цифри.

..$
.$&

Вставте десяткову крапку на другій останній позиції.



1

Perl 6 , 21 байт

{100*@^a[$^b]/@a.sum}

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

Просте рішення, оскільки я не можу використовувати криві параметри з $bіндексованим параметром. Прикольне рішення, яке не має обробляти два параметри, використовуючи rotateзамість нього функцію:

{100*.[0]/.sum}o&rotate

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

Але це, на жаль, на два байти довше



1

MathGolf , 7 6 байт

§\Σ/♀*

Індексація на основі 0.

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

Пояснення:

§       # Index the (implicit) second input-integer into the first (implicit) input-list,
        # which apparently doesn't pop the list
 \      # Swap so this list is at the top of the stack now
  Σ     # Take the sum of that list
   /    # Divide the earlier number we indexed by this sum
    ♀*  # Multiply it by 100
        # (after which the entire stack joined together is output implicitly as result)

1

Ікона , 53 байти

procedure f(L,i)
s:=0;s+:=!L&\z
return 1e2*L[i]/s
end

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

Єдине цікаве тут - знайти суму. Ікона була однією з перших мов, яка мала генератори. !генерує всі значення списку L, які накопичуються s. Зазвичай нам потрібно писати every s+:=!L, але я використовував зворотний трекінг &\z, який перевіряє, чи немає неіснуючої zзмінної non-null, а ні, і отримує наступне значення зі списку до вичерпання.



1

Пакетна, 111 байт

@shift
@set s=%*
@call set/as=%s: =+%-%0,s=(%%%0*10000+s/2)/s,h=s%%%%10,t=s/10%%%%10,s/=100
@echo %s%.%t%%h%

Вводить дані як індекс та список як аргументи командного рядка. Примітка: працює лише для значень індексу від 1до 9через обмеження Batch; може бути записана версія з індексом 0, яка могла б індексувати перші 10 елементів. Пояснення:

@shift

Перемістіть індекс %0і список на %1... %9(або менше). Зауважте, що партія shiftне впливає %*.

@set s=%*

Отримайте всі параметри, розділені пробілом

@call set/as=%s: =+%-%0,s=(%%%0*10000+s/2)/s,h=s%%%%10,t=s/10%%%%10,s/=100

Змініть пробіли на +s і оцінюйте арифметично, беручи таким чином суму, але віднімайте індекс. Потім індексуйте список, помножте на 10000, додайте половину суми і діліть на суму. Нарешті виконайте дівмод на 10 разів, щоб створити десяткові знаки. ( %Арифметичний оператор має особливе значення в Batch і зазвичай його потрібно подвоїти, але callтоді потрібне подальше подвоєння.)

@echo %s%.%t%%h%

Виведіть результат і десяткові знаки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.