Nota 2: acepté @DigitalTrauma
la respuesta larga de 6 bytes. Si alguien puede vencer eso, cambiaré la respuesta aceptada. ¡Gracias por jugar!
Nota: aceptaré una respuesta a las 6:00 pm MST del 14/10/15. ¡Gracias a todos los participantes!
Estoy muy sorprendido de que esto aún no se haya preguntado (o no he buscado lo suficiente). De cualquier manera, este desafío es muy simple:
Entrada: un programa en forma de cadena. Además, la entrada puede o no contener:
- Espacios iniciales y finales
- Nuevas líneas finales
- Caracteres no ASCII
Salida: Dos enteros, uno que representa el recuento de caracteres UTF-8 y otro que representa el recuento de bytes, puede elegir qué orden. Se permiten nuevas líneas al final. La salida puede ser STDOUT o devuelta desde una función Puede estar en cualquier formato siempre que los dos números sean distinguibles entre sí (2327 no es una salida válida).
Notas:
- Puede considerar la nueva línea como
\n
o\r\n
. - Aquí hay un buen contador de bytes y caracteres para sus pruebas. Además, aquí hay una meta publicación con lo mismo (Gracias a @Zereges).
Muestra de E / S: (Todas las salidas están en el formulario {characters} {bytes}
)
Entrada:
void p(int n){System.out.print(n+5);}
Salida: 37 37
Entrada: (~R∊R∘.×R)/R←1↓ιR
Salida: 17 27
Entrada:
friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
print "iteration {iteration} is {name}".format(iteration=i, name=name)
Salida: 156 156
Este es el código de golf: ¡el código más corto en bytes gana!
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=60733,OVERRIDE_USER=36670;function answersUrl(e){return"http://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"http://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}
<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>Size</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>
Respuestas:
Shell + coreutils, 6
Esta respuesta deja de ser válida si se usa una codificación distinta de UTF-8.
Prueba de salida:
En caso de que el formato de salida se aplique estrictamente (solo un espacio que separa los dos enteros), entonces podemos hacer esto:
Shell + coreutils, 12
Gracias a @immibis por sugerir eliminar el espacio después de
echo
. Me tomó un tiempo darme cuenta: el shell expandirá estoecho<tab>n<tab>m
, y las pestañas por defecto están dentro$IFS
, por lo que son separadores de tokens perfectamente legales en el comando resultante.fuente
GolfScript,
1412 bytesPruébelo en línea en Web GolfScript .
Idea
GolfScript no tiene idea de qué es Unicode; Todas las cadenas (entrada, salida, interna) están compuestas de bytes. Si bien eso puede ser bastante molesto, es perfecto para este desafío.
UTF-8 codifica los caracteres ASCII y no ASCII de manera diferente:
Todos los puntos de código por debajo de 128 están codificados como
0xxxxxxx
.Todos los demás puntos de código están codificados como
11xxxxxx 10xxxxxx ... 10xxxxxx
.Esto significa que la codificación de cada carácter Unicode contiene un solo
0xxxxxxx
byte o un solo11xxxxxx
byte (y de 0 a 510xxxxxx
bytes).Al dividir todos los bytes de la entrada por 64 , nos convertimos
0xxxxxxx
en 0 o 1 ,11xxxxxx
en 3 y10xxxxxx
en 2 . Todo lo que queda es contar los bytes cuyo cociente no es 2 .Código
fuente
Python,
4240 bytesGracias a Alex A. por los dos bytes de descuento.
Directo, hace lo que dice. Con argumento
i
, imprime la longitud dei
, luego la longitud dei
en UTF-8. Tenga en cuenta que para aceptar entradas de varias líneas, el argumento de la función debe estar rodeado de comillas triples:'''
.EDITAR: No funcionó para la entrada multilínea, así que simplemente lo convertí en una función.
Algunos casos de prueba (separados por líneas nuevas en blanco):
fuente
lambda i:[len(i),len(i.encode('utf-8'))]
.f=lambda i:[len(i),len(i.encode('utf-8'))]
, pero como estás usando una función lambda anónima, debería serlolambda i:[len(i),len(i.encode('utf-8'))]
.U8
lugar deutf-8
.Julia, 24 bytes
Esto crea una función lambda que devuelve una tupla de enteros. La
length
función, cuando se llama en una cadena, devuelve el número de caracteres. Lasizeof
función devuelve el número de bytes en la entrada.Pruébalo en línea
fuente
Óxido, 42 bytes
fuente
Pyth -
129 bytesIntentará acortarse.
Test Suite .
fuente
floor(… / 8) + 1
, debería serceil(… / 8)
.B
. Además,lQlc.BQ8
creo que corrige el error que menciona @ Pietu1998 al guardar 1 byte.Java,
2419089 bytesfuente
getBytes("UTF-8")
agetBytes("utf8")
. Y por quéthrows Exception
?UnsupportedEncodingException
cuando le das un nombre de codificación no válido.PowerShell, 57 bytes
fuente
C,
6867 bytesEsto usa la misma idea que mi otra respuesta .
Pruébelo en línea en Ideone .
fuente
R, 47 bytes
Entrada:
(~R∊R∘.×R)/R←1↓ιR
Salida:
Si la impresión de números de línea junto con la salida no está permitida en "cualquier formato",
cat
puede solucionar el problema:R, 52 bytes
Entrada:
(~R∊R∘.×R)/R←1↓ιR
Salida:
17 27
fuente
function(s)c(nchar(s,"c"),nchar(s,"b"))
T
en lugar deTRUE
,=
en lugar de<-
, y la entrada pueden provenir descan
,readline
ofunction
, todo lo cual es más corto quecommandArgs
.Vía Láctea 1.6.2 , 7 bytes (no competitiva)
Explicación
Uso
fuente
Perl 6, 33 bytes
Basado en esta publicación de blog en Perl6Advent.
fuente
Brainfuck, 163 bytes
Con saltos de línea para facilitar la lectura:
La parte más importante es la primera línea. Esto cuenta el número de caracteres ingresados. El resto es solo la basura larga requerida para imprimir un número mayor que 9.
EDITAR: Dado que BF no puede ingresar / emitir nada más que números ASCII del 1-255, no habría forma de medir los caracteres UTF-8.
fuente
cera de abejas,
9987 bytesUna versión más compacta, 12 bytes más corta que la primera:
Lo mismo, ya que es más fácil seguir el diseño hexagonal:
Salida como
characters
, entoncesbytecount
, separada por una nueva línea.Ejemplo: la letra minúscula
s
al comienzo de la línea solo le dice al usuario que el programa quiere una cadena como entrada.Ejemplo de cadena vacía:
La cera de abejas empuja los caracteres de una cadena que se ingresa en STDIN en la pila global, codificada como los valores de sus puntos de código Unicode.
Para una comprensión más fácil, aquí está la versión sin envolver del programa anterior:
Para este ejemplo, el personaje
α
se introduce en STDIN (punto de códigoU+03B1
, decimales:945
)Básicamente, este programa verifica cada valor de punto de código para los límites de punto de código de 1 byte, 2 byte, 3 byte y 4 byte.
Si
n
es el valor del punto de código, estos límites para las cadenas UTF-8 adecuadas son:Puede encontrar los números
7
,4
y5
de las instrucciones de cambio en el código de seguridad. Si se produce una verificación0
, el contador lstack se incrementa adecuadamente para contar el número de bytes de la cadena ingresada. los@PP...@
construcciones incrementan el contador de bytes. Después de cada recuento, el punto Unicode superior se saca del gstack hasta que esté vacío. Luego, el recuento de bytes se envía a STDOUT y el programa finaliza.No hay comprobaciones de codificación incorrecta, como codificación ASCII demasiado larga y puntos de código ilegales más allá
0x10FFFF
, pero creo que está bien;)fuente
Swift 3, 37
{($0.characters.count,$0.utf8.count)}
// donde$0
estaString
Uso
Prueba
{($0.characters.count,$0.utf8.count)}("Hello, world")
fuente