Bestimmen Sie die Länge einer UTF-8-Byte-Sequenz anhand ihres ersten Bytes. Die folgende Tabelle zeigt, welche Bereiche jeder möglichen Länge zugeordnet sind:
Range Length
--------- ------
0x00-0x7F 1
0xC2-0xDF 2
0xE0-0xEF 3
0xF0-0xF4 4
Hinweise zu Lücken in der Tabelle: 0x80-0xBF sind Fortsetzungsbytes, 0xC0-0xC1 würde eine überlange, ungültige Sequenz starten, 0xF5-0xFF würde zu einem Codepunkt jenseits des Unicode-Maximums führen.
Schreiben Sie ein Programm oder eine Funktion, die das erste Byte einer UTF-8-Byte-Sequenz als Ein- und Ausgabe verwendet oder die Länge der Sequenz zurückgibt. I / O ist flexibel. Die Eingabe kann zum Beispiel eine Zahl, ein 8-Bit-Zeichen oder eine 1-Zeichen-Zeichenfolge sein. Sie können davon ausgehen, dass das erste Byte Teil einer gültigen Sequenz ist und in einen der obigen Bereiche fällt.
Das ist Code Golf. Die kürzeste Antwort in Bytes gewinnt.
Testfälle
0x00 => 1
0x41 => 1
0x7F => 1
0xC2 => 2
0xDF => 2
0xE0 => 3
0xEF => 3
0xF0 => 4
0xF4 => 4
Antworten:
Viertens 6 Bytes
Siehe https://forth-standard.org/standard/xchar/X-SIZE
Input und Output folgen einem Standardmodell von Forth:
Eingang
Speicheradresse + Länge (dh 1) eines Einzelbyte-UTF-8- "Strings".
Ausgabe
UTF-8-Sequenzlänge in Bytes.
Beispielcode
Speichern Sie 0xF0 in einer Speicherzelle und rufen Sie x-size auf:
Überprüfen Sie das Ergebnis:
quelle
Z80Golf ,
1914 BytesProbieren Sie es online!
-5 Bytes dank @Bubbler
Beispiel mit Eingabe 0x41-Online ausprobieren! Versammlung
Beispiel mit Eingabe 0xC2-Online ausprobieren!
Beispiel mit Eingabe 0xE0-Online ausprobieren!
Beispiel mit Eingabe 0xF4-Online ausprobieren!
Versammlung:
Probieren Sie es online!
quelle
xor 0xff -> cpl
, keine Notwendigkeit zuor a
,jr nz, return -> ret nz
,ld a,1 -> inc a
.C (gcc) , 39 Bytes
Probieren Sie es online!
quelle
char
nichtint
?~(char)0xF0 == ~(int)0xFFFFFFF0
(angenommenchar = signed char
,sizeof(int) == 4
)Gelee ,
87 BytesEine monadische Verbindung, die das Byte als Ganzzahl akzeptiert.
Probieren Sie es online! Oder sehen Sie alle Eingänge ausgewertet .
Wenn eine Eingabe einer Liste der 8 Bits akzeptabel war, beträgt die Methode nur 6 Bytes:
1;IITḢ
wurde jedoch angenommen, dass die flexible E / A zu weit verbreitet ist.Wie?
quelle
Haskell , 28 Bytes
Probieren Sie es online!
quelle
Python 2 , 28 Bytes
Probieren Sie es online!
quelle
Gelee ,
87 BytesProbieren Sie es online!
Wie es funktioniert
quelle
JavaScript (Node.js) , 24 Byte
Probieren Sie es online!
quelle
Ruby ,
2723 BytesProbieren Sie es online!
quelle
Kohle , 12 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
quelle
Gelee , 7 Bytes
Hafen von meiner 05AB1E Antwort .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Perl 6 , 18 Bytes
Probieren Sie es online!
Port der JavaScript-Antwort von user202729. Alternativen mit WhateverCode:
quelle
x86-Assembly, 11 Byte
Probieren Sie es online!
Port der JavaScript-Antwort von user202729. Verwendet Fastcall-Konventionen.
quelle
Labyrinth , 35 Bytes
Probieren Sie es online!
Entpackte Version des Codes:
quelle
05AB1E ,
87 BytesPort of @Neil 's Charcoal Antwort .
-1 Byte dank @Grimy .
Eingabe als Ganzzahl.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
s)
zu‚
7. Portierung der anderen Gelee-Antwort ergibt weitere 8:₁+b¥η€ËO
‚
..: S Aber danke für -1.C 31 Bytes
Probieren Sie es online!
27 Bytes mit gcc (-O0)
Alternativen, 31 und 33 Bytes
Ich habe diese Ausdrücke beim Herumspielen mit der Aha gefunden! Superoptimierer vor ein paar Jahren .
quelle