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
cuentan los indicadores del programa como Perl para la puntuación? Tradicionalmente cuenta como 1 byte porque la distancia de edición entre el estándarperl -e
yperl -ne
es 1, pero para este desafío, ¿n
contará con el propósito de contar duplicados?n
es la opción más justa.how often this character has already occurred in the string
, probablemente cambiaría parahow many times the character has occurred up to this point
aclarar que el primer uso cuesta 1, no 0Respuestas:
MATL , puntaje 4
Pruébalo en línea!
Explicación
Considere la entrada
'ABBA'
como un ejemplo.fuente
Python , puntaje 49
Pruébalo en línea!
Hay una pestaña después
in
.Desglose del puntaje:
()Camnou
S
fuente
T-SQL, puntuación
775 579!580EDITAR : Se descartaron un par de variables, se compactaron un poco. ¡Hasta 16
@
símbolos en lugar de 22, eso por sí solo reduce mi puntaje en la friolera de 117 puntos!Bonito concurso, me gusta el requisito de optimizar para algo además del recuento total de personajes.
La entrada es a través del campo varchar q en la tabla z preexistente , según nuestras reglas de IO . La base de datos que contiene esta tabla de entrada debe establecerse en una intercalación entre mayúsculas y minúsculas .
Formateado:
Las palabras clave SQL no distinguen entre mayúsculas y minúsculas, por lo que utilicé mayúsculas y minúsculas para minimizar el recuento de letras duplicadas ( aaAA genera una puntuación mejor / menor que aaaa ).
El bucle principal compara la longitud antes y después de eliminar todas las instancias del primer carácter. Esa diferencia n * (n + 1) / 2 se agrega a un total acumulado.
La
LEN()
función SQL ignora molestamente los espacios finales, por lo que tuve que agregar un carácter de control y restar 1 al final.EDITAR : Se corrigió un error de cálculo de mi propia puntuación en 2 puntos (problema con las citas entre comillas), reducido en 1 al cambiar la carcasa de uno
R
. También trabajando en una estrategia completamente diferente, lo publicaré como su propia respuesta.fuente
579! ≈ 8.22 x 10^1349
C (gcc) , puntuación:
1131031009691Gracias a @ugoren, @CalculatorFeline, @gastropner, @ l4m2 y @ JS1 por sus consejos.
Inicializa una matriz de ceros, luego usa los valores ASCII de los caracteres en la cadena como índices de esa matriz para realizar un seguimiento del número de instancias de cada carácter en la cadena.
Pruébalo en línea!
fuente
z
,x
,c
.char
incluyec
...\x7f
no se puede imprimir) y agregue una explicación.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), puntaje
8178Ahorró 3 puntos gracias a @Arnauld
Mi solución recursiva original score-81:
fuente
Haskell , puntaje 42
Pruébalo en línea!
Anonimizar
\l->
da la misma puntuación.fuente
Jalea , puntaje 6
Pruébalo en línea!
fuente
Retina , puntaje 34
Pruébalo en línea!
Explicación
Comenzamos clasificando todos los caracteres en la entrada para que los caracteres idénticos se agrupen en una sola ejecución. La
s(
activa el modo SingleLine para todas las etapas (es decir, hace.
avances de línea de partido).El objetivo es convertir a una racha de n caracteres en T n caracteres (el n ésimo número triangular) porque esa es la puntuación de las apariciones de este personaje. Para hacerlo, encontramos coincidencias superpuestas. En particular, para cada i en [1, n] , vamos a incluir caracteres i-1 en la coincidencia. Obtenemos todos esos partidos debido a la bandera superpuesta
&
. Eso nos da n * (n-1) / 2 = T n-1 = T n - n caracteres solo de las coincidencias. Pero la etapa de coincidencia los unirá con saltos de línea, que son n saltos de línea para npartidos. Solo hay un problema. No habrá un salto de línea después de la última coincidencia, por lo que el número total de caracteres en la salida es uno menos de lo que necesitamos. Arreglamos esto haciendo coincidir también el comienzo de la entrada, lo que nos da un salto de línea principal si hay al menos otra coincidencia.Finalmente, solo contamos cuántos caracteres hay en la cadena.
fuente
Haskell, puntaje
5251Hay una pestaña entre
f
y_
.Pruébalo en línea!
El valor de la cadena vacía es 0. El valor de la cadena s, donde
a
es el primer carácter yb
el resto de la cadena es 1 más las apariciones dea
inb
más una llamada recursiva con b.fuente
J , puntaje 16
Pruébalo en línea!
Explicación
Usar en
1#.
lugar de+/@
para la suma ahorró algunos puntos, y&
podría usarse en lugar de@
en un contexto monádico para guardar uno más. La repetición1
me cuesta un punto extra, pero no he podido deshacerme de él.fuente
R , puntuación: 67
8395128-61 gracias a los mejores consejos de Giuseppe
Pruébalo en línea!
La cadena se divide usando
utf8ToInt
y se cuenta cada valor ASCIItable
. El resultado se calcula haciendo una multiplicación de matriz%*%
sobre eso en sí mismo + 1 y finalmente se reduce a la mitad.fuente
table
lugar derle
; también puedes deshacerte de élsort
(y no tienes que indexar[[1]]
el resultadostrsplit
)n
(ya que está enfunction
dos veces) y también cambiando(n+1)
a{n+1}
05AB1E , puntaje 6
Pruébalo en línea!
fuente
Pyth , puntaje 6
1 byte gracias a isaacg.
Banco de pruebas.
Cómo funciona
fuente
s+0
es el mismo que+F
.usaShHGrScQ1 8Z
por 16. ¿Puedes agregar una explicación?s/LQ
es el puntaje 4, ¿esto usa características que son posteriores al desafío?J , puntuación:
14 1211Pruébalo en línea!
fuente
$
.1#.2!1+1#.=
Jalea , puntaje de 7
Explicación:
Pruébalo en línea!
fuente
C, 60 bytes, puntaje
10895Pruébalo en línea!
Por lo general, los operadores antes y después del incremento son excelentes para el golf de código, ¡pero realmente duelen en este desafío!
EDITAR: Al restar los recuentos negativos en lugar de sumar los positivos, ahorré un montón de puntaje. Reemplazar
for()
conwhile()
eliminado un punto y coma también.fuente
Perl 6 , puntaje
61 56 53 4644Intentalo
Intentalo
Intentalo
Intentalo
Intentalo
fuente
C # (.NET Core) , puntaje ∞ (quiero decir, 209)
Pruébalo en línea!
La puntuación incluye lo siguiente:
fuente
return w*(w+1)/2
areturn-~w*w/2
(puntaje 196). EDITAR: Puede crear un puerto de mi respuesta Java 8 para una puntuación de 149 :using System.Linq;b=>{int[]x=new int[256];return\nb.Select(z=>++x[z]).Sum();}
Pruébelo en línea.b=>{var x=new int[256];return\nb.Sum(z=>++x[z]);}
Jalea , puntaje 5
Pruébalo en línea!
Gracias a Leaky Nun por -2 (anteriormente en su respuesta )
fuente
ĠJ€ẎS
PowerShell, puntaje 64
(La puntuación se basa en una nueva línea de salto de línea, que no es estándar de Windows pero funciona en PS).
@{}
$args
es una matriz de parámetros; en este caso, la cadena de entrada la convierte en una matriz de un solo elemento;|%
realiza un bucle foreach sobre los elementos y utiliza elgetE*
acceso directo para hacer coincidir elGetEnumerator()
método de cadena y llamarlo para convertir la cadena en una secuencia de caracteres.|%
recorrer los caracteres e incrementar su entrada de tabla hash, agregarlo a un total acumulado. El($x+=1)
formulario con parens modifica la variable y genera el nuevo valor para su uso.(Cuando lo escribí por primera vez, tenía
$c=@{};$t=0;[char[]]"$args"|%{$c[$_]++;$t+=$c[$_]};$t
un puntaje de 128, y sentí que no iría mucho más bajo. Reducirlo a 64 es bastante agradable).fuente
Julia 0.6 , 45 bytes, Puntuación: 77
Inspirado en la solución MATL:
Pruébalo en línea!
Una solución menos bonita, usando recuentos:
Julia 0.6 , puntuación: 82
Pruébalo en línea!
Gracias a Guiseppe por señalar la puntuación y por los consejos. Estos comentarios me ayudaron mucho.
fuente
(x+1)
con[x+1]
reducir aún más el marcador.[x+1]
lugar de reducirlo(x+1)
a un puntaje de 98 .Java 10, puntuación:
149138137134133130103102101100( Bytes:
72737475646261 ) Losbytes suben, pero el puntaje baja. :RE-28 puntaje (y -11 bytes) gracias a @Nevay .
-1 puntuación (y -2 bytes) gracias a @ OlivierGrégoire .
-1 puntaje (y -1 byte) al convertir Java 8 a Java 10.
Explicación:
Pruébalo aquí.
fuente
~
si usaj=0
yreturn-j;
(133).x->{int[]q=new int[256];return\nx.chars().map(v->++q[v]).sum();}
j
lugar deu
(return
contieneu
) y una nueva línea y pestaña en lugar de los espacios. EDITAR: Jeje, has editado justo cuando hice este comentario. :)F #, puntaje
120118-2 gracias a Kevin Cruijssen !
Pruébalo en línea!
Toma a
string
como entrada.Seq.countBy
empareja cada carácter distinto con su recuento (id
es la función de identidad) para que termines con una colección como'a' = 4, 'b' = 2
etc.La
Seq.sumBy
toma del recuento para cada letra y resume todos los números de0
la cuenta para esa letra. Entonces, si'a' = 4
la colección sería la0, 1, 2, 3, 4
que sumada es10
. LuegoSeq.sumBy
suma todos esos totales.fuente
let q
alet j
, ya que elq
ya se usa en ambosSeq
.APL (Dyalog) , puntaje 15
Pruébalo en línea!
⍞
obtener entrada de texto∘.=⍨
tabla de igualdad con uno mismo+\
suma acumulativa a través de1 1⍉
diagonal (iluminado. contraiga ambas dimensiones en la dimensión uno)+/
sumafuente
Retina , puntaje
684543Pruébalo en línea! El enlace muestra la puntuación. Editar: Gracias a @MartinEnder que ahorró 20 bytes al usar coincidencias superpuestas en lugar de lookaheads y otros tres bytes al agrupar las etapas para que la
s
bandera solo se aplique una vez. Ahorró otros dos bytes calculando el número triangular de manera diferente, evitando la necesidad de una clasificación.fuente
PHP , 45 bytes, puntaje 78
Pruébalo en línea!
PHP , 46 bytes, puntuación 79 bytes
Pruébalo en línea!
PHP , 56 bytes, puntaje 92
Pruébalo en línea!
fuente
Perl 5 puntaje
9183Utiliza la
-p
bandera que agrega 2 debido a la p en la división.fuente
$` is automatically
printed after each call so we can use that to store the score and
/./ g` devuelve una lista de todos los caracteres en$_
, que es más barato quesplit//
.Octava , 39 bytes, puntaje 69
Pruébalo en línea!
Si bien hay otra respuesta de Octave, esta es completamente mía y tiene un enfoque diferente, además, obtiene menos puntajes :).
El enfoque se reduce a encontrar primero el recuento (b) de cada carácter único, que se logra utilizando la función de histograma. Luego, para cada elemento, calculamos la suma de 1 a b que se realiza utilizando la fórmula
(b*(b+1))/2
. Luego, las sumas individuales se suman en la puntuación final.En las pruebas, parece que los corchetes son realmente costosos en la calificación porque se necesitan muchos. He optimizado desde un puntaje inicial de aproximadamente 88 al reorganizar las preguntas para minimizar el número de paréntesis de apertura / cierre; por lo tanto, ahora hacemos el / 2 en el total final en lugar de individualmente, y también he modificado la fórmula para
(b^2+b)/2
ya que requiere menos paréntesis.fuente
error: hist: subscript indices must be either positive integers less than 2^31 or logicals
Common Lisp, puntaje
286232222Puntaje de alto valor debido a la sintaxis verbal de los operadores integrados de Common Lisp.
Pruébalo en línea!
El código sin golf:
fuente
Mathematica, puntaje 54
entrada
gracias a hftf
fuente
Total[#(#+1)/2&@Counts@Characters@#]&
puntajes 54.