Найти процент

15

У нас не было приятных, простых задач за последнее время, так что мы здесь.

Учитывая список целых чисел, каждое из которых больше и индекс в качестве входных данных, выведите процентное содержание элемента по указанному индексу от общей суммы списка.0

Вывод должен быть любым естественным представлением для числа с плавающей запятой / целых чисел на вашем языке (унарное, десятичное, церковные цифры и т. Д.) Если вы решите округлить вывод любым способом, он должен иметь как минимум 2 десятичных знака (когда это целесообразно. не нужно округлять, но также вполне приемлемо).1.21,20

Индексы могут быть либо 1-индексированными, либо 0-индексированными и всегда будут находиться в пределах массива.

Это , поэтому выигрывает самый короткий код в байтах!

Примеры

Используя 1-индексированный и округленный до 2 дп

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]
Кэрд
источник
Сообщение песочницы (теперь удалено)
caird coinheringaahing
3
как именно можно выводить нецелые числа в виде одинарных / церковных чисел?
Ручка двери
1
@ Doorknob Может быть, унарное число, точка и другое унарное число?
СильноРадиоактивный
Поскольку выходные данные могут быть округлены до двух десятичных разрядов, также может быть допустимо вывести округленные значения 100?
Несвязанная строка
1
контрольный пример 4 должен быть 20/2410
attinat

Ответы:

6

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

Анонимная функция молчаливого инфикса. Принимает индекс в качестве левого аргумента и список в качестве правого аргумента.

100×⌷÷1⊥⊢

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

100 сто

× раз

 индексированный элемент

÷ деленное на

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

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

Адам
источник
6

Python 3 , 26 байт

lambda i,a:a[i]/sum(a)*100

Безымянная функция, принимающая целое число (индекс с 0 индексами) и список, который возвращает процент.

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

Джонатан Аллан
источник
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
5

05AB1E , 6 байтов

è²O/т*

Полная программа, берущая индекс, затем список. Использует 0-индексацию.

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

Как?

è²O/т*
è      - index (input 1) into (input 2)
 ²     - push 2nd input
  O    - sum
   /   - divide
    т  - push 100
     * - multiply
       - print top of stack
Джонатан Аллан
источник
4

R 28 байт

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

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

Niko
источник
Я не знаю R, но это не похоже на то, как это работает (не уверен, как протестировать его на TIO с произвольными массивами), так как вы должны извлекать элемент из lиндекса n, а не просто делить на n(см. [7, 3, 19], 1Тестовый пример )
Caird Coneheringaahing
@cairdcoinheringaahing Мой плохой, опечатка (забыл l[]во всем n)
Нико
На странице ссылок TIO есть вещь, которая может отформатировать это для вас.
SS Anne
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 Да, они обязательны , и, как правило, короче, чтобы написать полное имя класса вместо импорта, вот что я делаю здесь
Оливье Грегуар,
3

Haskell ,  20  18 байтов

i?a=a!!i/sum a*100

Диадический оператор (? ) принимает индекс (0-indexed) слева и список справа, который возвращает процент.

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

Джонатан Аллан
источник
2

Красный , 31 29 байт

-2 байта благодаря ErikF

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

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

Гален Иванов
источник
1
(-2 байта) предлагают использовать 1e2вместо 100.0: Попробуйте онлайн! , Довольно неплохо, сколько языков может использовать этот трюк!
ErikF
@ErikF Спасибо! Я знаю это в теории, но, похоже, я забыл им пользоваться :)
Гален Иванов
2

Скретч 3.0 24 23 блока / 239 228 байт

-11 байт благодаря @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

Попробуй это с нуля

История ответов

Ох, скретчблоки, почему так долго?

В качестве альтернативы в синтаксисе 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

Я действительно должен прекратить делать это с собой. Но это очень весело!

Lyxal
источник
Вы можете изменить , repeat length of mчтобы length of m-1и сохранить себя delete n?
Джо Кинг,
Нет, потому что если бы я это сделал, это не соответствовало бы последнему пункту.
Lyxal
Ну, если вы удалите то, 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
pizzapants184
источник
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

Icon , 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, добавьте половину суммы и разделите на сумму. Наконец, выполните divmod на 10 дважды, чтобы получить десятичные разряды. ( %Арифметический оператор имеет особое значение в пакетном режиме и обычно должен быть удвоен, ноcall тогда требуется дальнейшее удвоение.)

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

Выведите результат и десятичные разряды.

Нил
источник