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


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.