Определите длину последовательности байтов UTF-8, учитывая ее первый байт. В следующей таблице показано, какие диапазоны соответствуют каждой возможной длине:
Range Length
--------- ------
0x00-0x7F 1
0xC2-0xDF 2
0xE0-0xEF 3
0xF0-0xF4 4
Примечания к пробелам в таблице: 0x80-0xBF - это байты продолжения, 0xC0-0xC1 запускает слишком длинную недопустимую последовательность, 0xF5-0xFF - кодовую точку, превышающую максимум Unicode.
Напишите программу или функцию, которая принимает первый байт последовательности байтов UTF-8 в качестве входных данных и выводит или возвращает длину последовательности. Ввод / вывод является гибким. Например, ввод может быть числом, 8-битным символом или односимвольной строкой. Вы можете предположить, что первый байт является частью допустимой последовательности и попадает в один из диапазонов выше.
Это код гольф. Самый короткий ответ в байтах побеждает.
Контрольные примеры
0x00 => 1
0x41 => 1
0x7F => 1
0xC2 => 2
0xDF => 2
0xE0 => 3
0xEF => 3
0xF0 => 4
0xF4 => 4
Ответы:
Далее 6 байт
см. https://forth-standard.org/standard/xchar/X-SIZE
Вход и выход соответствуют стандартной модели Forth:
вход
Адрес памяти + длина (т. Е. 1) однобайтовой «строки» UTF-8.
Выход
Длина последовательности UTF-8 в байтах.
Образец кода
Сохраните 0xF0 в ячейке памяти и вызовите размер x:
Проверьте результат:
источник
Z80Golf ,
1914 байтовПопробуйте онлайн!
-5 байт благодаря @Bubbler
Пример с вводом 0x41 - Попробуйте онлайн! сборочный
Пример с вводом 0xC2 - Попробуйте онлайн!
Пример с вводом 0xE0-Попробуйте онлайн!
Пример с вводом 0xF4 - Попробуйте онлайн!
Монтаж:
Попробуйте онлайн!
источник
xor 0xff -> cpl
, нет необходимостиor a
,jr nz, return -> ret nz
,ld a,1 -> inc a
.C (gcc) , 39 байт
Попробуйте онлайн!
источник
char
и нетint
?~(char)0xF0 == ~(int)0xFFFFFFF0
(предположимchar = signed char
,sizeof(int) == 4
)Желе ,
87 байтМонадическая ссылка, принимающая байт как целое число.
Попробуйте онлайн! Или посмотреть все входы оценены .
Если входные данные из списка из 8 битов были приемлемы, тогда метод составляет всего 6 байтов:
1;IITḢ
однако он считается слишком гибким для ввода-вывода.Как?
источник
Haskell , 28 байт
Попробуйте онлайн!
источник
Python 2 , 28 байт
Попробуйте онлайн!
источник
Желе ,
87 байтПопробуйте онлайн!
Как это устроено
источник
JavaScript (Node.js) , 24 байта
Попробуйте онлайн!
источник
Рубин ,
2723 байтаПопробуйте онлайн!
источник
Древесный уголь , 12 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
источник
Желе , 7 байт
Порт моего ответа 05AB1E .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Perl 6 , 18 байт
Попробуйте онлайн!
Порт ответа пользователя user202729. Альтернативы с WhwhatCode:
источник
Сборка x86, 11 байт
Попробуйте онлайн!
Порт ответа пользователя user202729. Использует соглашения FastCall.
источник
Лабиринт , 35 байт
Попробуйте онлайн!
Развернутая версия кода:
источник
05AB1E ,
87 байтПорт ответа @Neil 's Charcoal .
-1 байт благодаря @Grimy .
Введите как целое число.
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
s)
в‚
течение 7 Портирование другой желе ответ дает еще один 8:₁+b¥η€ËO
‚
..: S Но спасибо за -1.C, 31 байт
Попробуйте онлайн!
27 байт с gcc (-O0)
Альтернативы, 31 и 33 байта
Я нашел эти выражения, когда играл с Ага! супероптимизатор несколько лет назад .
источник