Nota 2: Aceitei @DigitalTrauma
a resposta longa de 6 bytes. Se alguém puder vencer, mudarei a resposta aceita. Obrigado por jogar!
Nota: Aceitarei uma resposta às 18:00 MST em 14/10/15. Agradeço a todos por sua participação!
Estou muito surpreso que isso ainda não tenha sido solicitado (ou não pesquisei o suficiente). De qualquer forma, esse desafio é muito simples:
Entrada: um programa na forma de uma sequência. Além disso, a entrada pode ou não conter:
- Espaços iniciais e finais
- Trailing newlines
- Caracteres não ASCII
Saída: Dois inteiros, um representando a contagem de caracteres UTF-8 e um representando a contagem de bytes, você pode escolher qual ordem. Novas linhas à direita são permitidas. A saída pode ser STDOUT ou retornada de uma função. A TI pode estar em qualquer formato, desde que os dois números sejam distinguíveis um do outro (2327 não é uma saída válida).
Notas:
- Você pode considerar a nova linha como
\n
ou\r\n
. - Aqui está um bom contador de bytes e caracteres para seus testes. Além disso, aqui está uma meta post com a mesma coisa (obrigado a @Zereges).
E / S de amostra: (todas as saídas estão no formulário {characters} {bytes}
)
Entrada:
void p(int n){System.out.print(n+5);}
Saída: 37 37
Entrada: (~R∊R∘.×R)/R←1↓ιR
Saída: 17 27
Entrada:
friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
print "iteration {iteration} is {name}".format(iteration=i, name=name)
Saída: 156 156
Este é o código golf - o menor código em bytes vence!
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:
# [><>](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>
Respostas:
Shell + coreutils, 6
Esta resposta se torna inválida se uma codificação diferente de UTF-8 for usada.
Saída de teste:
Caso o formato de saída seja rigorosamente imposto (apenas um espaço separando os dois números inteiros), podemos fazer o seguinte:
Shell + coreutils, 12
Obrigado a @immibis por sugerir a remoção do espaço após o
echo
. Demorei um pouco para descobrir isso - o shell expandirá isso paraecho<tab>n<tab>m
e as guias por padrão estão incluídas$IFS
, assim como os separadores de token perfeitamente legais no comando resultante.fonte
GolfScript,
1412 bytesExperimente online no Web GolfScript .
Idéia
GolfScript não tem idéia do que é Unicode; todas as strings (entrada, saída, interna) são compostas de bytes. Embora isso possa ser muito chato, é perfeito para esse desafio.
UTF-8 codifica caracteres ASCII e não ASCII de maneira diferente:
Todos os pontos de código abaixo de 128 são codificados como
0xxxxxxx
.Todos os outros pontos de código são codificados como
11xxxxxx 10xxxxxx ... 10xxxxxx
.Isso significa que a codificação de cada caractere Unicode contém um
0xxxxxxx
byte único ou um11xxxxxx
byte único (e de 0 a 510xxxxxx
bytes).Ao dividir todos os bytes da entrada por 64 , transformamos
0xxxxxxx
em 0 ou 1 ,11xxxxxx
em 3 e10xxxxxx
em 2 . Tudo o que resta é contar os bytes cujo quociente não é 2 .Código
fonte
Python,
4240 bytesObrigado a Alex A. pelos dois bytes de folga.
Simples, faz o que diz. Com argumento
i
, imprime o comprimento dei
, então o comprimento dei
em UTF-8. Note-se que, a fim de aceitar a entrada de várias linhas, o argumento da função deve ser cercado por aspas triplas:'''
.Edição: Não funcionou para entrada de múltiplas linhas, então apenas fiz uma função.
Alguns casos de teste (separados por novas linhas em branco):
fonte
lambda i:[len(i),len(i.encode('utf-8'))]
.f=lambda i:[len(i),len(i.encode('utf-8'))]
, mas como você está usando uma função lambda anônima, deveria serlambda i:[len(i),len(i.encode('utf-8'))]
.U8
vez deutf-8
.Julia, 24 bytes
Isso cria uma função lambda que retorna uma tupla de números inteiros. A
length
função, quando chamada em uma sequência, retorna o número de caracteres. Asizeof
função retorna o número de bytes na entrada.Experimente online
fonte
Ferrugem, 42 bytes
fonte
Pitão -
129 bytesVai tentar ficar mais curto.
Conjunto de Teste .
fonte
floor(… / 8) + 1
, deve serceil(… / 8)
.B
. Além disso,lQlc.BQ8
corrige o erro que o Pietu1998 menciona enquanto economiza 1 byte, eu acho.Java,
2419089 bytesfonte
getBytes("UTF-8")
paragetBytes("utf8")
. E por quethrows Exception
?UnsupportedEncodingException
quando você atribui um nome de codificação inválido.PowerShell, 57 bytes
fonte
C,
6867 bytesIsso usa a mesma idéia que minha outra resposta .
Experimente online no Ideone .
fonte
R, 47 bytes
Entrada:
(~R∊R∘.×R)/R←1↓ιR
Saída:
Se a impressão de números de linhas ao lado da saída não for permitida no "qualquer formato",
cat
poderá corrigir o problema:R, 52 bytes
Entrada:
(~R∊R∘.×R)/R←1↓ιR
Saída:
17 27
fonte
function(s)c(nchar(s,"c"),nchar(s,"b"))
T
no lugar deTRUE
,=
em lugar de<-
, e de entrada pode vir descan
,readline
oufunction
, todos os quais são mais curtos do quecommandArgs
.Via Láctea 1.6.2 , 7 bytes (não concorrente)
Explicação
Uso
fonte
Perl 6, 33 bytes
Com base nesta postagem no blog Perl6Advent.
fonte
Brainfuck, 163 bytes
Com quebras de linha para facilitar a leitura:
A parte mais importante é a primeira linha. Isso conta o número de caracteres inseridos. O restante é apenas o lixo comprido necessário para imprimir um número maior que 9.
EDIT: Como o BF não pode inserir / enviar nada além de números ASCII de 1-255, não haveria como medir os caracteres UTF-8.
fonte
cera de abelha,
9987 bytesUma versão mais compacta, 12 bytes mais curta que a primeira:
O mesmo, mais fácil de seguir o layout hexagonal:
Saída como
characters
, entãobytecount
, separada por uma nova linha.Exemplo: a letra minúscula
s
no início da linha informa ao usuário que o programa deseja uma string como entrada.Exemplo de string vazia:
A cera de abelha envia os caracteres de uma sequência inserida no STDIN para a pilha global, codificada como os valores de seus pontos de código Unicode.
Para um entendimento mais fácil, aqui está a versão desembrulhada do programa acima:
Para este exemplo, o personagem
α
é inserido no STDIN (ponto de códigoU+03B1
, decimal:945
)Basicamente, este programa verifica cada valor de ponto de código quanto aos limites de 1 byte, 2 bytes, 3 bytes e 4 bytes.
Se
n
for o valor do ponto de código, esses limites para as seqüências UTF-8 apropriadas são:Você pode encontrar os números
7
,4
e5
para as instruções de mudança no código acima. Se uma verificação resultar0
, o contador lstack é incrementado adequadamente para calcular o número de bytes da string inserida. As@PP...@
construções incrementam o contador de bytes. Após cada registro, o ponto Unicode mais alto é exibido no gstack até ficar vazio. Em seguida, a contagem de bytes é enviada para STDOUT e o programa é encerrado.Não há verificações de codificação inadequada, como codificação ASCII excessiva e pontos de código ilegais além
0x10FFFF
, mas acho que está bom;)fonte
Swift 3, 37
{($0.characters.count,$0.utf8.count)}
// onde$0
estáString
Uso
Teste
{($0.characters.count,$0.utf8.count)}("Hello, world")
fonte