Determine o comprimento de uma sequência de bytes UTF-8, considerando o primeiro byte. A tabela a seguir mostra quais intervalos são mapeados para cada comprimento possível:
Range Length
--------- ------
0x00-0x7F 1
0xC2-0xDF 2
0xE0-0xEF 3
0xF0-0xF4 4
Observações sobre lacunas na tabela: 0x80-0xBF são bytes de continuação, 0xC0-0xC1 iniciaria uma sequência inválida excessiva; 0xF5-0xFF resultaria em um ponto de código além do máximo do Unicode.
Escreva um programa ou função que aceite o primeiro byte de uma sequência de bytes UTF-8 como entrada e saída ou retorne o comprimento da sequência. A E / S é flexível. Por exemplo, a entrada pode ser um número, um caractere de 8 bits ou uma cadeia de um caractere. Você pode assumir que o primeiro byte faz parte de uma sequência válida e se enquadra em um dos intervalos acima.
Isso é código de golfe. A resposta mais curta em bytes vence.
Casos de teste
0x00 => 1
0x41 => 1
0x7F => 1
0xC2 => 2
0xDF => 2
0xE0 => 3
0xEF => 3
0xF0 => 4
0xF4 => 4
Respostas:
Quarto, 6 bytes
consulte https://forth-standard.org/standard/xchar/X-SIZE
A entrada e a saída seguem um modelo Forth padrão:
Entrada
Endereço de memória + comprimento (isto é, 1) de uma "sequência" de UTF-8 de byte único.
Resultado
Comprimento da sequência UTF-8 em bytes.
Código de amostra
Armazene 0xF0 em uma célula de memória e chame o tamanho x:
Veja o resultado:
fonte
Z80Golf ,
1914 bytesExperimente online!
-5 bytes graças a @Bubbler
Exemplo com entrada 0x41-Experimente online! Montagem
Exemplo com entrada 0xC2-Experimente online!
Exemplo com a entrada 0xE0-Experimente online!
Exemplo com entrada 0xF4-Experimente online!
Montagem:
Experimente online!
fonte
xor 0xff -> cpl
, não há necessidade deor a
,jr nz, return -> ret nz
,ld a,1 -> inc a
.C (gcc) , 39 bytes
Experimente online!
fonte
char
e nãoint
?~(char)0xF0 == ~(int)0xFFFFFFF0
(assumechar = signed char
,sizeof(int) == 4
)Geléia ,
87 bytesUm link monádico que aceita o byte como um número inteiro.
Experimente online! Ou veja todas as entradas avaliadas .
Se uma entrada de uma lista dos 8 bits for aceitável, o método terá apenas 6 bytes:
1;IITḢ
no entanto, foi considerado como falando de E / S flexível demais.Quão?
fonte
Haskell , 28 bytes
Experimente online!
fonte
Python 2 , 28 bytes
Experimente online!
fonte
Geléia ,
87 bytesExperimente online!
Como funciona
fonte
JavaScript (Node.js) , 24 bytes
Experimente online!
fonte
Ruby ,
2723 bytesExperimente online!
fonte
Carvão , 12 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
fonte
Geléia , 7 bytes
Porta da minha resposta 05AB1E .
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Perl 6 , 18 bytes
Experimente online!
Porta da resposta JavaScript do user202729. Alternativas ao WhateverCode:
fonte
Montagem x86, 11 bytes
Experimente online!
Porta da resposta JavaScript do user202729. Usa convenções de ligação rápida.
fonte
Labirinto , 35 bytes
Experimente online!
Versão desembrulhada do código:
fonte
05AB1E ,
87 bytesResposta do porto de @Neil 's Charcoal .
-1 byte graças a @Grimy .
Entrada como inteiro.
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
s)
para‚
a 7. Portando a outra resposta Jelly dá outra 8:₁+b¥η€ËO
‚
em primeiro lugar ..: S Mas obrigado por -1.C, 31 bytes
Experimente online!
27 bytes com gcc (-O0)
Alternativas, 31 e 33 bytes
Eu encontrei essas expressões ao brincar com o Aha! superoptimizador há alguns anos atrás .
fonte