Индекс Симпсона является мерой разнообразия коллекции предметов с дубликатами. Это просто вероятность нарисовать два разных предмета при случайном выборе без замены.
С n
предметами в группах n_1, ..., n_k
одинаковых предметов, вероятность двух разных предметов
Например, если у вас есть 3 яблока, 2 банана и 1 морковь, индекс разнообразия
D = 1 - (6 + 2 + 0)/30 = 0.7333
В качестве альтернативы, количество неупорядоченных пар различных элементов 3*2 + 3*1 + 2*1 = 11
в общем из 15 пар, и 11/15 = 0.7333
.
Входные данные:
Строка символов A
для Z
. Или список таких персонажей. Его длина будет как минимум 2. Вы не можете предполагать, что он отсортирован.
Выход:
Индекс разнообразия Симпсона символов в этой строке, т. Е. Вероятность того, что два символа, взятых случайным образом с заменой, различны. Это число от 0 до 1 включительно.
При выводе числа с плавающей запятой отображать не менее 4 цифр, хотя точные выводы выводятся как 1
или, 1.0
или 0.375
все в порядке.
Вы не можете использовать встроенные модули, которые специально вычисляют индексы разнообразия или меры энтропии. Фактическая случайная выборка - это хорошо, если вы получаете достаточную точность в тестовых примерах.
Контрольные примеры
AAABBC 0.73333
ACBABA 0.73333
WWW 0.0
CODE 1.0
PROGRAMMING 0.94545
Leaderboard
Вот список лидеров по языкам, любезно предоставленный Мартином Бюттнером .
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/53455/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);i=i.replace("{{PLACE}}",t++ +".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=45497;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*((?:[^,\s]|\s+[^-,\s])*)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
1/
вместо1-
. [статистик-любитель разглагольствовать шляпу]Ответы:
Python 2, 72
Входные данные могут быть строкой или списком.
Я уже знаю, что в Python 3 это будет на 2 байта короче, поэтому, пожалуйста, не советуйте мне :)
источник
<>
в положении 36? Я никогда не видел этот синтаксис раньше.!=
.from __future__ import barry_as_FLUFL
l=len(s);
тамPyth -
19131211 байтСпасибо @isaacg за рассказ о
Использование грубой силы подход с
.c
функцией комбинации.Попробуйте здесь онлайн .
Набор тестов .
источник
.{
сn
- они эквивалентны здесь.SQL (PostgreSQL), 182 байт
Как функция в postgres.
объяснение
Использование и тестовый прогон
источник
J, 26 байт
прохладная часть
Я нашел количество каждого символа, набрав
</.
строку против себя (~
для отражения), а затем посчитав буквы каждого ящика.источник
(#&:>@</.~)
может быть(#/.~)
и(<:*])
может быть(*<:)
. Если вы используете правильную функцию это дает(1-(#/.~)+/@:%&(*<:)#)
. Так как окружающие скобки здесь вообще не учитываются (оставляя1-(#/.~)+/@:%&(*<:)#
тело функции), это дает 20 байтов.Python 3,
6658 байтЭто используя формулу простого подсчета, приведенную в вопросе, ничего слишком сложное нет. Это анонимная функция лямбды, поэтому использовать его, вы должны дать ему имя.
Сохранено 8 байт (!) Благодаря Sp3000.
Использование:
или
источник
APL,
3936 байтЭто создает безымянную монаду.
Вы можете попробовать его в Интернете !
источник
Pyth, 13 байт
Практически буквальный перевод решения @ feersum.
источник
CJam, 25 байт
Попробуйте онлайн
Достаточно прямая реализация формулы в вопросе.
Объяснение:
источник
J 37 байт
но я верю, что это все еще можно сократить.
пример
Это просто молчаливая версия следующей функции:
источник
(1-(%&([:+/]*<:)+/)@(+/"1@=))
дает 29 байтов. 27, если мы не будем считать фигурные скобки, окружающие функцию,(1-(%&([:+/]*<:)+/)@(+/"1@=))
как это принято здесь. Примечания:=y
именно так(~.=/])y
и составная конъюнкция (x u&v y
=(v x) u (v y)
) тоже была очень полезна.С, 89
Оценка только для функции
f
и исключает ненужные пробелы, которые включены только для ясности.main
функция только для тестирования.Он просто сравнивает каждый символ с любым другим символом, а затем делит на общее количество сравнений.
источник
Python 3, 56
Подсчитывает пары неравных элементов, затем делит на количество таких пар.
источник
Haskell, 83 байта
Я знаю, что опоздал, нашел это, забыл опубликовать. В некотором роде нехорошо с Haskell, требующим от меня преобразовать целые числа в числа, которые вы можете разделить друг на друга.
источник
CJam, 23 байта
В целом, это очень незначительное улучшение по сравнению с ответом @ RetoKoradi , но в нем используется хитрый трюк:
Сумма первых n неотрицательных целых чисел равна n (n - 1) / 2 , которую мы можем использовать для вычисления числителя и знаменателя, оба разделенных на 2 , дроби в формуле вопроса.
Попробуйте онлайн в интерпретаторе CJam .
Как это устроено
источник
APL, 26 байт
Объяснение:
≢⍵
: получить длину первого измерения⍵
. Учитывая, что⍵
предполагается, что это строка, это означает длину строки.{⍴⍵}⌸⍵
: для каждого уникального элемента в⍵
, получить длины каждого измерения в списке вхождений. Это дает количество раз, когда элемент встречается для каждого элемента, в виде1×≢⍵
матрицы.,
: объединить два вдоль горизонтальной оси. Так≢⍵
как это скаляр, а другое значение является столбцом, мы получаем2×≢⍵
матрицу, в которой в первом столбце указано количество раз, которое элемент встречается для каждого элемента, а во втором столбце - общее количество элементов.{⍵×⍵-1}
: для каждой ячейки в матрице рассчитатьN(N-1)
.÷/
: уменьшить ряды делением. Это делит значение для каждого элемента на значение для общей суммы.+/
: суммировать результат для каждой строки.1-
: вычтите это из 1источник