Déterminez la longueur d'une séquence d'octets UTF-8 en fonction de son premier octet. Le tableau suivant montre quelles plages correspondent à chaque longueur possible:
Range Length
--------- ------
0x00-0x7F 1
0xC2-0xDF 2
0xE0-0xEF 3
0xF0-0xF4 4
Remarques sur les lacunes dans le tableau: 0x80-0xBF sont des octets de continuation, 0xC0-0xC1 démarrerait une séquence trop longue et invalide, 0xF5-0xFF entraînerait un point de code au-delà du maximum Unicode.
Écrivez un programme ou une fonction qui prend en entrée le premier octet d'une séquence d'octets UTF-8 et renvoie ou renvoie la longueur de la séquence. Les E / S sont flexibles. Par exemple, l'entrée peut être un nombre, un caractère à 8 bits ou une chaîne à un caractère. Vous pouvez supposer que le premier octet fait partie d'une séquence valide et appartient à l'une des plages ci-dessus.
C'est le golf de code. La réponse la plus courte en octets l'emporte.
Cas de test
0x00 => 1
0x41 => 1
0x7F => 1
0xC2 => 2
0xDF => 2
0xE0 => 3
0xEF => 3
0xF0 => 4
0xF4 => 4
Réponses:
Quatrième, 6 octets
voir https://forth-standard.org/standard/xchar/X-SIZE
L'entrée et la sortie suivent un modèle Forth standard:
Contribution
Adresse mémoire + longueur (c'est-à-dire 1) d'une "chaîne" UTF-8 à un octet.
Production
Longueur de séquence UTF-8 en octets.
Exemple de code
Stockez 0xF0 dans une cellule mémoire et appelez x-size:
Vérifiez le résultat:
la source
Z80Golf ,
1914 octetsEssayez-le en ligne!
-5 octets grâce à @Bubbler
Exemple avec entrée 0x41-Essayez-le en ligne! Assemblée
Exemple avec entrée 0xC2-Essayez-le en ligne!
Exemple avec entrée 0xE0-Essayez-le en ligne!
Exemple avec entrée 0xF4-Essayez-le en ligne!
Assemblée:
Essayez-le en ligne!
la source
xor 0xff -> cpl
, pas besoin deor a
,jr nz, return -> ret nz
,ld a,1 -> inc a
.C (gcc) , 39 octets
Essayez-le en ligne!
la source
char
et nonint
?~(char)0xF0 == ~(int)0xFFFFFFF0
(supposezchar = signed char
,sizeof(int) == 4
)Gelée ,
87 octetsUn lien monadique acceptant l'octet comme un entier.
Essayez-le en ligne! Ou voyez toutes les entrées évaluées .
Si une entrée d'une liste des 8 bits était acceptable, alors la méthode n'est que de 6 octets:
1;IITḢ
cependant, elle a été jugée trop parlante d'E / S flexibles.Comment?
la source
Haskell , 28 octets
Essayez-le en ligne!
la source
Python 2 , 28 octets
Essayez-le en ligne!
la source
Gelée ,
87 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
JavaScript (Node.js) , 24 octets
Essayez-le en ligne!
la source
Rubis ,
2723 octetsEssayez-le en ligne!
la source
Fusain , 12 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
la source
Gelée , 7 octets
Port de ma réponse 05AB1E .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Perl 6 , 18 octets
Essayez-le en ligne!
Port de la réponse JavaScript de user202729. Alternatives avec WwhatCode:
la source
Assemblage x86, 11 octets
Essayez-le en ligne!
Port de la réponse JavaScript de user202729. Utilise les conventions d'appel rapide.
la source
Labyrinthe , 35 octets
Essayez-le en ligne!
Version non emballée du code:
la source
05AB1E ,
87 octetsRéponse de Port of @Neil Charcoal .
-1 octet grâce à @Grimy .
Entrez comme entier.
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
s)
à‚
pour 7. Porter l'autre réponse Jelly donne un autre 8:₁+b¥η€ËO
‚
en premier lieu ..: S Mais merci pour -1.C, 31 octets
Essayez-le en ligne!
27 octets avec gcc (-O0)
Alternatives, 31 et 33 octets
J'ai trouvé ces expressions en jouant avec les Aha! superoptimizer il y a quelques années .
la source