Determine la longitud de una secuencia de bytes UTF-8 dado su primer byte. La siguiente tabla muestra qué rangos se asignan a cada longitud posible:
Range Length
--------- ------
0x00-0x7F 1
0xC2-0xDF 2
0xE0-0xEF 3
0xF0-0xF4 4
Notas sobre los espacios en la tabla: 0x80-0xBF son bytes de continuación, 0xC0-0xC1 comenzaría una secuencia demasiado larga e inválida, 0xF5-0xFF resultaría en un punto de código más allá del máximo Unicode.
Escriba un programa o función que tome el primer byte de una secuencia de bytes UTF-8 como entrada y salida o devuelva la longitud de la secuencia. I / O es flexible. Por ejemplo, la entrada puede ser un número, un carácter de 8 bits o una cadena de un carácter. Puede suponer que el primer byte es parte de una secuencia válida y cae en uno de los rangos anteriores.
Este es el código de golf. La respuesta más corta en bytes gana.
Casos de prueba
0x00 => 1
0x41 => 1
0x7F => 1
0xC2 => 2
0xDF => 2
0xE0 => 3
0xEF => 3
0xF0 => 4
0xF4 => 4
Respuestas:
Adelante, 6 bytes
ver https://forth-standard.org/standard/xchar/X-SIZE
La entrada y salida sigue un modelo estándar de Forth:
Entrada
Dirección de memoria + longitud (es decir, 1) de una "cadena" UTF-8 de un solo byte.
Salida
Longitud de secuencia UTF-8 en bytes.
Código de muestra
Almacene 0xF0 en una celda de memoria e invoque x-size:
Comprueba el resultado:
fuente
Z80Golf ,
1914 bytesPruébalo en línea!
-5 bytes gracias a @Bubbler
Ejemplo con entrada 0x41-¡Pruébelo en línea! Montaje
Ejemplo con entrada 0xC2: ¡Pruébelo en línea!
Ejemplo con entrada 0xE0-¡Pruébelo en línea!
Ejemplo con entrada 0xF4: ¡Pruébelo en línea!
Montaje:
Pruébalo en línea!
fuente
xor 0xff -> cpl
, no hay necesidad deor a
,jr nz, return -> ret nz
,ld a,1 -> inc a
.C (gcc) , 39 bytes
Pruébalo en línea!
fuente
char
y noint
?~(char)0xF0 == ~(int)0xFFFFFFF0
(se suponechar = signed char
,sizeof(int) == 4
)Jalea ,
87 bytesUn enlace monádico que acepta el byte como un entero.
Pruébalo en línea! O ver todas las entradas evaluadas .
Si una entrada de una lista de los 8 bits fuera aceptable, entonces el método es de solo 6 bytes:
1;IITḢ
sin embargo, se considera que habla de E / S flexible demasiado lejos.¿Cómo?
fuente
Haskell , 28 bytes
Pruébalo en línea!
fuente
Python 2 , 28 bytes
Pruébalo en línea!
fuente
Jalea ,
87 bytesPruébalo en línea!
Cómo funciona
fuente
JavaScript (Node.js) , 24 bytes
Pruébalo en línea!
fuente
Rubí ,
2723 bytesPruébalo en línea!
fuente
Carbón de leña , 12 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
fuente
Jalea , 7 bytes
Puerto de mi respuesta 05AB1E .
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Perl 6 , 18 bytes
Pruébalo en línea!
Puerto de la respuesta de JavaScript de user202729. Alternativas con WhateverCode:
fuente
Asamblea x86, 11 bytes
Pruébalo en línea!
Puerto de la respuesta de JavaScript de user202729. Utiliza convenciones de llamada rápida.
fuente
Laberinto , 35 bytes
Pruébalo en línea!
Versión sin envolver del código:
fuente
05AB1E ,
87 bytesPuerto de la respuesta de carbón de @Neil .
-1 byte gracias a @Grimy .
Entrada como entero.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
s)
a‚
para 7. La portabilidad de la otra respuesta de Jelly da otro 8:₁+b¥η€ËO
‚
en primer lugar ...: S Pero gracias por -1.C, 31 bytes
Pruébalo en línea!
27 bytes con gcc (-O0)
Alternativas, 31 y 33 bytes.
¡Encontré estas expresiones al jugar con el Aha! superoptimizador hace unos años .
fuente