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, contam para a pontuação? Tradicionalmente conta como 1 byte, porque a distância de edição entre o padrãoperl -e
eperl -ne
é 1, mas para esse desafio, an
contagem será contada com o objetivo de contar duplicatas?n
é a opção mais justa.how often this character has already occurred in the string
, eu provavelmente iria mudar parahow many times the character has occurred up to this point
torná-lo mais claro que os primeiros custos de utilização 1, não 0Respostas:
MATL , pontuação 4
Experimente online!
Explicação
Considere a entrada
'ABBA'
como um exemplo.fonte
Python , pontuação 49
Experimente online!
Há uma guia depois
in
.Classificação da pontuação:
()Camnou
S
fonte
T-SQL, pontuação
775 579!580EDIT : Soltou algumas variáveis, compactou um pouco. Até 16
@
símbolos em vez de 22, isso por si só reduz minha pontuação em 117 pontos!Bom concurso, eu gosto do requisito de otimizar algo além da contagem total de caracteres.
A entrada é via campo varchar q na tabela z pré-existente , de acordo com nossas regras de IO . O banco de dados que contém esta tabela de entrada deve ser definido como um agrupamento que diferencia maiúsculas de minúsculas .
Formatado:
As palavras-chave SQL não diferenciam maiúsculas de minúsculas, por isso usei maiúsculas e minúsculas para minimizar a contagem de letras duplicadas ( aaAA gera uma pontuação melhor / menor que aaaa ).
O loop principal compara o comprimento antes e depois de remover todas as instâncias do primeiro caractere. Essa diferença n * (n + 1) / 2 é adicionada ao total em execução.
A
LEN()
função SQL irrita irritantemente os espaços à direita, então tive que acrescentar um caractere de controle e subtrair 1 no final.EDIT : Corrigido um erro de cálculo da minha própria pontuação em 2 pontos (problema com as aspas), reduzido em 1 ao alterar a caixa de um
R
. Também trabalhando em uma estratégia completamente diferente, postarei isso como sua própria resposta.fonte
579! ≈ 8.22 x 10^1349
C (gcc) , pontuação:
1131031009691Obrigado a @ugoren, @CalculatorFeline, @gastropner, @ l4m2 e @ JS1 pelas dicas.
Inicializa uma matriz de zeros e, em seguida, usa os valores ASCII dos caracteres na sequência como índices para essa matriz para acompanhar o número de instâncias de cada caractere na sequência.
Experimente online!
fonte
z
,x
,c
.char
incluic
...\x7f
não é imprimível) e adicione uma explicação.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), pontuação
8178Guardado 3 pontos graças a @Arnauld
Minha solução recursiva original score-81:
fonte
Haskell , pontuação 42
Experimente online!
Anonimizar
\l->
dá a mesma pontuação.fonte
Geléia , pontuação 6
Experimente online!
fonte
Retina , pontuação 34
Experimente online!
Explicação
Começamos classificando todos os caracteres na entrada para que caracteres idênticos sejam agrupados em uma única execução. A
s(
ativa o modo Singleline para todas as fases (ou seja, faz.
linefeeds jogo).O objetivo é transformar uma corrida de n caracteres em T n caracteres (o n º número triangular) porque essa é a pontuação das ocorrências desta natureza. Para fazer isso, encontramos correspondências sobrepostas. Em particular, para cada i em [1, n] , vamos incluir caracteres i-1 na partida. Recebemos todas essas correspondências devido à bandeira sobreposta
&
. Isso nos dá n * (n-1) / 2 = T n-1 = T n - n caracteres apenas das correspondências. Mas a fase de partida juntará esses itens aos feeds de linha, que são n feeds de linha para nfósforos. Só tem um problema. Não haverá avanço de linha após a última correspondência, portanto, o número total de caracteres na saída é um a menos do que precisamos. Corrigimos isso combinando também o início da entrada, o que nos fornece um único avanço de linha principal se houver pelo menos uma outra correspondência.Finalmente, contamos apenas quantos caracteres existem na string.
fonte
Haskell, pontuação
5251Há uma guia entre
f
e_
.Experimente online!
O valor da cadeia vazia é 0. O valor da cadeia s, onde
a
é o primeiro caractere eb
o restante da cadeia é 1 mais as ocorrências dea
inb
mais uma chamada recursiva com b.fonte
J , pontuação 16
Experimente online!
Explicação
Usar em
1#.
vez de+/@
para a soma economizou alguns pontos e&
poderia ser usado em vez de@
em um contexto monádico para salvar mais um. O repetido1
me custa um ponto extra, mas não consegui me livrar dele.fonte
R , pontuação: 67
8395128-61 graças às principais dicas de Giuseppe
Experimente online!
A cadeia é dividida usando
utf8ToInt
e cada valor ascii é contadotable
. O resultado é calculado usando uma multiplicação de matrizes%*%
sobre isso em si + 1 e, finalmente, metade.fonte
table
vez derle
; você pode se livrar dosort
bem (e você não tem o índice[[1]]
para o resultado destrsplit
)n
(uma vez que é emfunction
duas vezes) e também mudando(n+1)
para{n+1}
05AB1E , pontuação 6
Experimente online!
fonte
Pyth , pontuação 6
1 byte graças a isaacg.
Suíte de teste.
Como funciona
fonte
s+0
é o mesmo que+F
.usaShHGrScQ1 8Z
por 16. Você pode adicionar uma explicação?s/LQ
é a pontuação 4, isso usa recursos que pós-datam o desafio?J , pontuação:
14 1211Experimente online!
fonte
$
.1#.2!1+1#.=
Geléia , pontuação 7
Explicação:
Experimente online!
fonte
C, 60 bytes, pontuação
10895Experimente online!
Normalmente, os operadores de pré e pós-incremento são ótimos para o golfe de código, mas realmente prejudicam esse desafio!
Edição: subtraindo contagens negativas em vez de adicionar positivas, salvei um monte de pontuação. Substituindo
for()
porwhile()
eliminou um ponto-e-vírgula também.fonte
Perl 6 , pontuação
61 56 53 4644Tente
Tente
Tente
Tente
Tente
fonte
C # (.NET Core) , pontuação ∞ (quero dizer, 209)
Experimente online!
A pontuação inclui o seguinte:
fonte
return w*(w+1)/2
parareturn-~w*w/2
(pontuação 196). EDIT: Você pode criar uma porta da minha resposta Java 8 para obter uma pontuação de 149 :using System.Linq;b=>{int[]x=new int[256];return\nb.Select(z=>++x[z]).Sum();}
Experimente online.b=>{var x=new int[256];return\nb.Sum(z=>++x[z]);}
Geléia , pontuação 5
Experimente online!
Obrigado a Leaky Nun por -2 (anteriormente em sua resposta )
fonte
ĠJ€ẎS
PowerShell, pontuação 64
(A pontuação é baseada em uma nova linha de alimentação de linha única, que não é padrão do Windows, mas funciona no PS).
@{}
$args
é uma matriz de parâmetros - nesse caso, a string de entrada a torna uma única matriz de itens;|%
faz um loop foreach sobre os itens e usa ogetE*
atalho para corresponder aoGetEnumerator()
método string e chame-o para transformar a string em um fluxo de caracteres.|%
faça um loop sobre os caracteres e aumente sua entrada de hashtable, adicione-a ao total em execução. O($x+=1)
formulário com parens modifica a variável e gera o novo valor para uso.(Quando o escrevi pela primeira vez, era
$c=@{};$t=0;[char[]]"$args"|%{$c[$_]++;$t+=$c[$_]};$t
com uma pontuação de 128 e parecia que não iria diminuir muito. Reduzir para 64 é bastante agradável).fonte
Julia 0.6 , 45 bytes, Pontuação: 77
Inspirado na solução MATL:
Experimente online!
Uma solução menos bonita, usando contagens:
Julia 0.6 , pontuação: 82
Experimente online!
Agradecemos a Guiseppe por apontar a pontuação e obter dicas. Esses comentários me ajudaram muito.
fonte
(x+1)
por[x+1]
para reduzir ainda mais a pontuação.[x+1]
vez de(x+1)
reduz para uma pontuação de 98 .Java 10, score:
149138137134133130103102101100( Bytes:
72737475646261 ) Osbytes aumentam, mas a pontuação diminui. : DPontuação de -28 (e -11 bytes) graças a @Nevay .
-1 pontos (e -2 bytes) graças a @ OlivierGrégoire .
-1 pontuação (e -1 byte) convertendo o Java 8 em Java 10.
Explicação:
Experimente aqui.
fonte
~
se você usarj=0
ereturn-j;
(133).x->{int[]q=new int[256];return\nx.chars().map(v->++q[v]).sum();}
j
vez deu
(return
contému
) e uma nova linha e guia em vez dos espaços. EDIT: Hehe, você editou quando fiz este comentário. :)F #, pontuação
120118-2 graças a Kevin Cruijssen !
Experimente online!
Tira a
string
como entrada.Seq.countBy
emparelha cada caractere distinto com sua contagem (id
é a função de identidade) para que você termine com uma coleção como'a' = 4, 'b' = 2
etc.Ele
Seq.sumBy
pega a contagem para cada letra e soma todos os números da0
contagem para essa letra. Portanto, se'a' = 4
a coleção seria o0, 1, 2, 3, 4
que é somado em conjunto10
. Em seguida,Seq.sumBy
soma todos esses totais.fonte
let q
paralet j
, pois oq
já é usado em ambosSeq
.APL (Dyalog) , pontuação 15
Experimente online!
⍞
obter entrada de texto∘.=⍨
tabela de igualdade com auto+\
soma acumulada entre1 1⍉
diagonal (lit. recolher duas dimensões na dimensão um)+/
somafonte
Retina , pontuação
684543Experimente online! O link mostra a pontuação. Editar: obrigado a @MartinEnder que salvou 20 bytes usando correspondências sobrepostas em vez de lookaheads e mais três bytes agrupando os estágios para que o
s
sinalizador precise ser aplicado apenas uma vez. Economizou mais dois bytes calculando o número triangular de maneira diferente, evitando a necessidade de uma classificação.fonte
PHP , 45 bytes, Pontuação 78
Experimente online!
PHP , 46 bytes, Pontuação: 79 bytes
Experimente online!
PHP , 56 bytes, Pontuação 92
Experimente online!
fonte
Perl 5 pontos
9183Usa a
-p
bandeira que adiciona 2 por causa de p na divisão.fonte
$` is automatically
printed after each call so we can use that to store the score and
/./ g` retorna uma lista de todos os caracteres$_
, mais baratos quesplit//
.Oitava , 39 bytes, Pontuação 69
Experimente online!
Embora exista outra resposta do Oitava, essa é totalmente minha e tem uma abordagem diferente, além de ter uma pontuação menor :).
A abordagem se resume a encontrar primeiro a contagem (b) de cada caractere único, que é alcançado usando a função de histograma. Então, para cada elemento, calculamos a soma de 1 a b, que é feita usando a fórmula
(b*(b+1))/2
. Em seguida, as somas individuais são todas somadas na pontuação final.Nos testes, parece que os colchetes são realmente caros na pontuação, porque muitos são necessários. Otimizei a partir de uma pontuação inicial de cerca de 88, reorganizando as perguntas para minimizar o número de colchetes de abrir / fechar - portanto, agora fazemos o / 2 no total final em vez de individualmente, e também modifiquei a fórmula para
(b^2+b)/2
pois isso requer menos colchetes.fonte
error: hist: subscript indices must be either positive integers less than 2^31 or logicals
Lisp comum, pontuação
286232222Pontuação de alto valor devido à sintaxe prolífica dos operadores internos do Common Lisp.
Experimente online!
O código não destruído:
fonte
Mathematica, pontuação 54
entrada
graças a hftf
fonte
Total[#(#+1)/2&@Counts@Characters@#]&
pontuação 54.