Określ długość sekwencji bajtów UTF-8, biorąc pod uwagę jej pierwszy bajt. Poniższa tabela pokazuje, które zakresy mapują na każdą możliwą długość:
Range Length
--------- ------
0x00-0x7F 1
0xC2-0xDF 2
0xE0-0xEF 3
0xF0-0xF4 4
Uwagi na temat braków w tabeli: 0x80-0xBF są bajtami kontynuacyjnymi, 0xC0-0xC1 uruchomiłoby zbyt długą, niepoprawną sekwencję, 0xF5-0xFF spowodowałoby, że punkt kodowy przekroczyłby maksimum Unicode.
Napisz program lub funkcję, która pobiera pierwszy bajt sekwencji bajtów UTF-8 jako dane wejściowe i wyjściowe lub zwraca długość sekwencji. I / O jest elastyczny. Na przykład wejściem może być liczba, znak 8-bitowy lub ciąg jednego znaku. Możesz założyć, że pierwszy bajt jest częścią prawidłowej sekwencji i należy do jednego z powyższych zakresów.
To jest kod golfowy. Najkrótsza odpowiedź w bajtach wygrywa.
Przypadki testowe
0x00 => 1
0x41 => 1
0x7F => 1
0xC2 => 2
0xDF => 2
0xE0 => 3
0xEF => 3
0xF0 => 4
0xF4 => 4
Odpowiedzi:
Dalej, 6 bajtów
patrz https://forth-standard.org/standard/xchar/X-SIZE
Dane wejściowe i wyjściowe są zgodne ze standardowym modelem Forth:
Wejście
Adres pamięci + długość (tj. 1) jednobajtowego „ciągu” UTF-8.
Wynik
Długość sekwencji UTF-8 w bajtach.
Przykładowy kod
Zapisz 0xF0 w komórce pamięci i wywołaj rozmiar x:
Sprawdź wynik:
źródło
Z80Golf ,
1914 bajtówWypróbuj online!
-5 bajtów dzięki @Bubbler
Przykład z wejściem 0x41 - Wypróbuj online! montaż
Przykład z wejściem 0xC2 - Wypróbuj online!
Przykład z wejściem 0xE0 - Wypróbuj online!
Przykład z wejściem 0xF4 - Wypróbuj online!
Montaż:
Wypróbuj online!
źródło
xor 0xff -> cpl
, nie ma potrzebyor a
,jr nz, return -> ret nz
,ld a,1 -> inc a
.C (gcc) , 39 bajtów
Wypróbuj online!
źródło
char
nieint
?~(char)0xF0 == ~(int)0xFFFFFFF0
(zakładamychar = signed char
,sizeof(int) == 4
)Galaretka ,
87 bajtówŁącze monadyczne akceptujące bajt jako liczbę całkowitą.
Wypróbuj online! Lub zobacz wszystkie ocenione dane wejściowe .
Jeśli wejście listy 8 bitów jest akceptowalne, wówczas metoda ma tylko 6 bajtów:
1;IITḢ
jednak za daleko została uznana za mówiącą elastyczne we / wy.W jaki sposób?
źródło
Haskell , 28 bajtów
Wypróbuj online!
źródło
Python 2 , 28 bajtów
Wypróbuj online!
źródło
Galaretka ,
87 bajtówWypróbuj online!
Jak to działa
źródło
JavaScript (Node.js) , 24 bajty
Wypróbuj online!
źródło
Ruby ,
2723 bajtówWypróbuj online!
źródło
Węgiel drzewny , 12 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
źródło
Galaretka , 7 bajtów
Port mojej odpowiedzi 05AB1E .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Perl 6 , 18 bajtów
Wypróbuj online!
Port odpowiedzi JavaScript użytkownika user202729. Alternatywy z dowolnym kodem:
źródło
Zestaw x86, 11 bajtów
Wypróbuj online!
Port odpowiedzi JavaScript użytkownika user202729. Korzysta z konwencji szybkiego połączenia.
źródło
Labirynt , 35 bajtów
Wypróbuj online!
Nieopakowana wersja kodu:
źródło
05AB1E ,
87 bajtówPort odpowiedzi na węgiel drzewny @Neil .
-1 bajt dzięki @Grimy .
Wprowadź jako liczbę całkowitą.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
s)
do‚
do 7. Przenoszenie druga odpowiedź Jelly daje inny 8:₁+b¥η€ËO
‚
w ogóle ..: S Ale dzięki za -1.C, 31 bajtów
Wypróbuj online!
27 bajtów z gcc (-O0)
Alternatywy, 31 i 33 bajty
Znalazłem te wyrażenia podczas zabawy z Aha! superoptimizer kilka lat temu .
źródło