var QUESTION_ID=127261,OVERRIDE_USER=56433;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px} /* font fix */ body {font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;} /* #language-list x-pos fix */ #answer-list {margin-right: 200px;}
<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><td>Language</td><td>Score</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
-n
Perl, учитываются в счете? Традиционно он считается как 1 байт, потому что расстояние редактирования между стандартомperl -e
иperl -ne
1 равно 1, но будет ли для этой задачиn
счет для подсчета дубликатов?n
является наиболее справедливым вариантом.how often this character has already occurred in the string
, я бы, вероятно, изменил на,how many times the character has occurred up to this point
чтобы было яснее, что первое использование стоит 1, а не 0Ответы:
MATL , оценка 4
Попробуйте онлайн!
объяснение
Рассмотрим ввод
'ABBA'
в качестве примера.источник
Питон , оценка 49
Попробуйте онлайн!
Там есть вкладка после
in
.Распределение баллов:
()Camnou
S
источник
T-SQL, оценка
775 579!580РЕДАКТИРОВАТЬ : отбросил пару переменных, немного сжаты. Сокращение до 16
@
символов вместо 22, что само по себе уменьшает мой счет на целых 117 очков!Хороший конкурс, мне нравится требование оптимизировать что-то помимо общего количества символов.
Ввод осуществляется с VARCHAR поля д в уже существующей таблице г , в соответствии с нашими правилами ввода - вывода . База данных, содержащая эту входную таблицу, должна быть настроена на регистр с учетом регистра .
отформатирован:
Ключевые слова SQL не чувствительны к регистру, поэтому я использовал смешанный регистр, чтобы минимизировать количество повторяющихся букв ( aaAA генерирует лучший / более низкий балл, чем aaaa ).
Основной цикл сравнивает длину до и после удаления всех экземпляров первого символа. Эта разница n * (n + 1) / 2 добавляется к промежуточному итогу.
Функция SQL
LEN()
досадно игнорирует завершающие пробелы, поэтому мне пришлось добавить управляющий символ и вычесть 1 в конце.РЕДАКТИРОВАТЬ : Исправлена ошибка в моем собственном счете на 2 балла (проблема с цитатами), уменьшена на 1 путем изменения регистра одного
R
. Также работая над совершенно другой стратегией, я опубликую это как собственный ответ.источник
579! ≈ 8.22 x 10^1349
C (gcc) , оценка:
1131031009691Спасибо @ugoren, @CalculatorFeline, @gastropner, @ l4m2 и @ JS1 за их советы.
Инициализирует массив нулей, затем использует значения ASCII символов в строке как индексы для этого массива, чтобы отслеживать количество экземпляров каждого символа в строке.
Попробуйте онлайн!
источник
z
,x
,c
.char
включает в себяc
...\x7f
не для печати), и, пожалуйста, добавьте пояснение.z;g(char*s){int y[238]={z=0};while(*s)z+=--y[*s++];z/=~0;}
g(char*s){int y[238]={};while(*s)*y+=--y[*s++];*y/=~0;}
JavaScript (ES6), оценка
8178Сэкономили 3 балла благодаря @Arnauld
Мое оригинальное рекурсивное решение Score-81:
источник
Хаскелл , оценка 42
Попробуйте онлайн!
Анонимизация
\l->
дает ту же оценку.источник
Желе , оценка 6
Попробуйте онлайн!
источник
Сетчатка , оценка 34
Попробуйте онлайн!
объяснение
Мы начнем с сортировки всех символов на входе, чтобы идентичные символы были сгруппированы в один прогон.
s(
Активирует SingleLine режим для всех стадий (т.е. делает.
матч перевода строки).Цель состоит в том, чтобы превратить серию из n символов в T n символов ( n- е треугольное число), потому что это количество вхождений этого символа. Для этого мы найдем перекрывающиеся совпадения. В частности, для каждого i в [1, n] мы собираемся включить в совпадение символы i-1 . Мы получаем все эти совпадения из-за перекрывающегося флага
&
. Это дает нам n * (n-1) / 2 = T n-1 = T n - n символов только из совпадений. Но стадия совпадения объединит их с переводами строки, которые являются n переводами строки для nСпички. Есть только одна проблема. После последнего совпадения не будет перевода строки, поэтому общее количество символов в выводе на один меньше, чем нам нужно. Мы исправляем это, также сопоставляя начало ввода, что дает нам один ведущий перевод строки, если есть хотя бы одно другое совпадение.Наконец, мы просто посчитаем, сколько символов в строке.
источник
Хаскелл, оценка
5251Там есть вкладка между
f
и_
.Попробуйте онлайн!
Значение пустой строки равно 0. Значение строки s, где
a
первый символ, аb
остальная часть строки - 1 плюс вхожденияa
inb
плюс рекурсивный вызов с b.источник
J , оценка 16
Попробуйте онлайн!
объяснение
Использование
1#.
вместо+/@
суммы сэкономило несколько баллов и&
может быть использовано вместо@
монадического контекста для сохранения еще одного. Повторение1
стоило мне одного дополнительного очка, но я не смог от него избавиться.источник
R , оценка: 67
8395128-61 благодаря лучшим советам от Джузеппе
Попробуйте онлайн!
Строка разбивается с использованием
utf8ToInt
и подсчитывается каждое значение asciitable
. Результат рассчитывается с использованием умножения матрицы%*%
на это + 1 и, наконец, наполовину.источник
table
вместоrle
; вы также можете избавиться отsort
(и вам не нужно[[1]]
strsplit
n
(так как оно вfunction
два раза), а также изменив(n+1)
на{n+1}
05AB1E , оценка 6
Попробуйте онлайн!
источник
Пиф , оценка 6
1 байт благодаря isaacg.
Тестирование.
Как это устроено
источник
s+0
так же, как+F
.usaShHGrScQ1 8Z
16. Ты можешь добавить объяснение?s/LQ
Оценка 4, использует ли это функции, которые датируют вызов?J , оценка:
14 1211Попробуйте онлайн!
источник
$
.1#.2!1+1#.=
Желе , оценка 7
Объяснение:
Попробуйте онлайн!
источник
C, 60 байтов, оценка
10895Попробуйте онлайн!
Обычно операторы до и после приращения отлично подходят для код-гольфа, но они действительно больно справляются с этой задачей!
РЕДАКТИРОВАТЬ: вычитая отрицательные числа вместо добавления положительных, я сохранил целую кучу очков. Замена
for()
сwhile()
устранена точкой с запятой , а также.источник
Perl 6 , оценка
61 56 53 4644Попробуй
Попробуй
Попробуй
Попробуй
Попробуй
источник
C # (.NET Core) , оценка ∞ (я имею в виду, 209)
Попробуйте онлайн!
Оценка включает в себя следующее:
источник
return w*(w+1)/2
кreturn-~w*w/2
(оценка 196). РЕДАКТИРОВАТЬ: Вы можете создать порт моего ответа Java 8 для оценки 149 :using System.Linq;b=>{int[]x=new int[256];return\nb.Select(z=>++x[z]).Sum();}
Попробуйте онлайн.b=>{var x=new int[256];return\nb.Sum(z=>++x[z]);}
Желе , оценка 5
Попробуйте онлайн!
Спасибо Leaky Nun за -2 (ранее за его ответ )
источник
ĠJ€ẎS
PowerShell, оценка 64
(Оценка основана на новой строке перевода строки, которая не является стандартом Windows, но работает в PS).
@{}
$args
является массивом параметров - в этом случае входная строка делает его единым массивом элементов;|%
выполняет цикл foreach над элементами и используетgetE*
ярлык для соответствияGetEnumerator()
строковому методу и вызывает его, чтобы превратить строку в поток символов.|%
Зацикливайте символы и увеличивайте их в хеш-таблице, добавляйте к промежуточной сумме.($x+=1)
Форма с скобками и изменяет переменную и выводит новое значение для использования.(Когда я впервые написал его, он был
$c=@{};$t=0;[char[]]"$args"|%{$c[$_]++;$t+=$c[$_]};$t
со счетом 128, и я чувствовал, что он не станет намного ниже. Половина его до 64 весьма приятна).источник
Юлия 0,6 , 45 байт, Оценка: 77
Вдохновленный решением MATL:
Попробуйте онлайн!
Менее симпатичное решение, использующее количество:
Юлия 0,6 , оценка: 82
Попробуйте онлайн!
Спасибо Guiseppe за указание на счет и за подсказки. Эти комментарии помогли мне загрузить.
источник
(x+1)
с[x+1]
целью дальнейшего снижения счет.[x+1]
вместо того,(x+1)
чтобы снизить его до 98 баллов .Java 10, оценка:
149138137134133130103102101100( Байт:
72737475646261 )Байты увеличиваются, но оценка снижается. : DОценка -28 (и -11 байт) благодаря @Nevay .
-1 оценка (и -2 байта) благодаря @ OlivierGrégoire .
-1 оценка (и -1 байт) путем преобразования Java 8 в Java 10.
Объяснение:
Попробуй это здесь.
источник
~
если вы используетеj=0
иreturn-j;
(133).x->{int[]q=new int[256];return\nx.chars().map(v->++q[v]).sum();}
j
вместоu
(return
содержитu
) и новую строку и табуляцию вместо пробелов. РЕДАКТИРОВАТЬ: Хе-хе, вы редактировали правильно, когда я сделал этот комментарий. :)F #, оценка
120118-2 спасибо Кевину Круйссену !
Попробуйте онлайн!
Принимает
string
как вход.Seq.countBy
соединяет каждый отдельный символ с его количеством (id
это функция идентичности), чтобы вы получили коллекцию, как'a' = 4, 'b' = 2
и т.д.Seq.sumBy
Берет отсчета для каждой буквы и суммирует все числа от0
графы для этого письма. Так что если'a' = 4
бы коллекция была бы0, 1, 2, 3, 4
суммированной, то есть10
. ЗатемSeq.sumBy
суммирует все эти суммы.источник
let q
наlet j
, так какq
уже используется в обоихSeq
.APL (Дьялог) , оценка 15
Попробуйте онлайн!
⍞
получить текстовый ввод∘.=⍨
таблица равенства с собой+\
накопленная сумма по1 1⍉
диагональ (буквально сворачивает оба измерения в одно измерение)+/
суммаисточник
Сетчатка , оценка
684543Попробуйте онлайн! Ссылка показывает оценку. Редактирование: Спасибо @MartinEnder, который сохранил 20 байтов, используя перекрывающиеся совпадения вместо заголовков, и еще три байта, сгруппировав этапы так, что
s
флаг нужно применять только один раз. Сохраните еще два байта, вычисляя треугольное число по-разному, избегая необходимости сортировки.источник
PHP , 45 байт, оценка 78
Попробуйте онлайн!
PHP , 46 байт, оценка 79 байт
Попробуйте онлайн!
PHP , 56 байт, оценка 92
Попробуйте онлайн!
источник
Perl 5 баллов
9183Использует
-p
флаг, который добавляет 2 из-за p в split.источник
$` is automatically
printed after each call so we can use that to store the score and
/./ g` возвращает список всех символов в$_
, который дешевле, чемsplit//
.Октава , 39 байт, оценка 69
Попробуйте онлайн!
Хотя есть и другой ответ от Octave, этот - полностью мой и другой подход, плюс он набирает меньше очков :).
Подход сводится к тому, чтобы сначала найти количество (b) каждого уникального символа, что достигается с помощью функции гистограммы. Затем для каждого элемента мы вычисляем сумму от 1 до b, что делается по формуле
(b*(b+1))/2
. Затем отдельные суммы суммируются в итоговый счет.При тестировании кажется, что скобки действительно дорогостоящие, потому что многие из них необходимы. Я оптимизировал исходную оценку около 88, переставив вопросы, чтобы свести к минимуму количество открытых / закрытых скобок - следовательно, теперь мы делаем / 2 для итоговой суммы, а не по отдельности, а также я изменил формулу, чтобы
(b^2+b)/2
поскольку это требует меньше скобок.источник
error: hist: subscript indices must be either positive integers less than 2^31 or logicals
Common Lisp, оценка
286232222Высокая оценка за счет объемного синтаксиса встроенных операторов Common Lisp.
Попробуйте онлайн!
Негольфированный код:
источник
Mathematica, оценка 54
вход
благодаря hftf
источник
Total[#(#+1)/2&@Counts@Characters@#]&
счет 54.