UTF-8 바이트 시퀀스의 길이


15

첫 번째 바이트가 주어진 UTF-8 바이트 시퀀스의 길이를 결정하십시오. 다음 표는 가능한 각 길이에 매핑되는 범위를 보여줍니다.

  Range    Length
---------  ------
0x00-0x7F    1
0xC2-0xDF    2
0xE0-0xEF    3
0xF0-0xF4    4

표의 간격에 대한 참고 사항 : 0x80-0xBF는 연속 바이트이며 0xC0-0xC1은 너무 길고 잘못된 시퀀스를 시작하며 0xF5-0xFF는 유니 코드 최대 값을 초과하는 코드 포인트를 생성합니다.

UTF-8 바이트 시퀀스의 첫 번째 바이트를 입력으로 사용하고 시퀀스의 길이를 출력하거나 리턴하는 프로그램 또는 함수를 작성하십시오. I / O는 유연합니다. 예를 들어, 입력은 숫자, 8 비트 문자 또는 1 문자 문자열 일 수 있습니다. 첫 번째 바이트가 유효한 시퀀스의 일부이고 위의 범위 중 하나에 속한다고 가정 할 수 있습니다.

이것은 코드 골프입니다. 바이트 단위의 최단 답변이 이깁니다.

테스트 사례

0x00 => 1
0x41 => 1
0x7F => 1
0xC2 => 2
0xDF => 2
0xE0 => 3
0xEF => 3
0xF0 => 4
0xF4 => 4

8 비트 목록을 입력 할 수 있습니까?
Jonathan Allan

@JonathanAllan 아니요, 유연한 I / O가 너무 많이 걸릴 것입니다.
nwellnhof

답변:


5

넷째, 6 바이트

x-size

참조 https://forth-standard.org/standard/xchar/X-SIZE를

입력 및 출력은 표준 Forth 모델을 따릅니다.

입력

단일 바이트 UTF-8 "문자열"의 메모리 주소 + 길이 (예 : 1).

산출

바이트 단위의 UTF-8 시퀀스 길이

샘플 코드

스토어 의 0xF0 메모리 셀, 그리고 X-크기 호출 :

variable v
0xF0 v !
v 1 x-size

결과를 확인하십시오 :

.s <1> 4  ok

이것이 tio.run/#forth-gforth 에서 작동한다고 가정하면 예제를 보여줄 수 있습니까? 바이트가 0xF0 인 경우 단일 바이트 UTF-8 문자열을 갖는 방법을 이해하지 못합니다.
Dennis

> 예를 보여 주시겠습니까? 바이트가 0xF0 인 경우 단일 바이트 UTF-8 문자열을 갖는 방법을 이해하지 못합니다. 방법을 보여주는 샘플 코드를 추가했습니다. 불행히도, gforth의 TIO 버전은 유니 코드 단어를 지원하지 않는 것 같습니다 ( "x-size 참조"에 따르면 1을 반환하도록 하드 코딩되었습니다).
zeppelin

내가 참조. 그러나 UTF-8과 관련하여 F0 만으로는 잘못된 바이트 시퀀스이므로 UTF-8 문자열이라고 부르지는 않습니다.
Dennis

> F0만으로는 유효하지 않은 바이트 시퀀스 True이므로 (따라서 "문자열"이라는 단어를 따옴표로 묶었 음)이 작업은 특히 첫 번째 바이트로 시퀀스를 인식하는 것과 관련이 있으며 Forth는 실제로 유효하지 않은 것을 신경 쓰지 않습니다. 이 솔루션을 차례로 사용할 수 있습니다.
zeppelin

6

Z80Golf , 19 14 바이트

00000000: 2f6f 3e10 37ed 6a3d 30fb ee07 c03c       /o>.7.j=0....<

온라인으로 사용해보십시오!

@Bubbler 덕분에 -5 바이트

입력이 0x41 인 예-온라인으로 사용해보십시오! 어셈블리

입력이 0xC2 인 예 온라인으로 사용해보십시오!

입력이 0xE0 인 예 : 온라인으로 사용해보십시오!

입력이 0xF4 인 예 온라인으로 사용해보십시오!

어셈블리:

;input: register a
;output: register a
byte_count:			;calculate 7^(log2(255^a))||1
	cpl			;xor 255
	ld l,a
	log2:
		ld	a,16
		scf
	log2loop:
		adc	hl,hl
		dec	a
		jr	nc,log2loop
	xor 7
	ret nz
	inc a

온라인으로 사용해보십시오!


보기 쉬운 예제와 함께 Bash TIO 를 사용 하여 어셈블리 작업을 수행하십시오. 이 링크에는 솔루션의 15 바이트 버전도 있습니다. 다음은 개선됩니다 xor 0xff -> cpl, 할 필요는 or a, jr nz, return -> ret nz, ld a,1 -> inc a.
Bubbler


4

젤리 ,  8  7 바이트

+⁹BIITḢ

바이트를 정수로 받아들이는 모나드 링크.

온라인으로 사용해보십시오! 또는 평가 된 모든 입력을 참조하십시오.

8 비트 목록의 입력이 허용되는 경우이 방법은 6 바이트에 불과 1;IITḢ하지만 유연한 I / O를 너무 많이 말하는 것으로 간주됩니다.

어떻게?

+⁹BIITḢ - Link: integer       e.g.: 127 (7f)            223 (df)            239 (ef)            244 (f4)
 ⁹      - literal 256
+       - add                       383                 479                 495                 500
  B     - to a list of bits         [1,0,1,1,1,1,1,1,1] [1,1,1,0,1,1,1,1,1] [1,1,1,1,0,1,1,1,1] [1,1,1,1,1,0,1,0,0]
   I    - increments                [-1,1,0,0,0,0,0,0]  [0,0,-1,1,0,0,0,0]  [0,0,0,-1,1,0,0,0]  [0,0,0,0,-1,1,-1,0]
    I   - increments                [2,-1,0,0,0,0,0]    [0,-1,2,-1,0,0,0]   [0,0,-1,2,-1,0,0]   [0,0,0,-1,2,-2,1]
     T  - truthy indices            [1,2]               [2,3,4]             [3,4,5]             [4,5,6,7]
      Ḣ - head                      1                   2                   3                   4



3

젤리 , 8 7 바이트

»Ø⁷Ba\S

온라인으로 사용해보십시오!

작동 원리

»Ø⁷Ba\S  Main link. Argument: n (integer)

 Ø⁷      Yield 128.
»        Take the maximum of n and 128.
   B     Yield the array of binary digits.
    a\   Cumulatively reduce by AND, replacing 1's after the first 0 with 0's.
      S  Take the sum.



1

, 12 바이트

I⌕⍘⌈⟦N¹²⁸⟧²0

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

     N          Input number
      ¹²⁸       Literal 128
   ⌈⟦    ⟧      Take the maximum
  ⍘       ²     Convert to base 2 as a string
 ⌕         0    Find the position of the first `0`
I               Cast to string
                Implicitly print



1

x86 어셈블리, 11 바이트

00000000 <f>:
   0:   f6 d1                   not    %cl
   2:   0f bd c1                bsr    %ecx,%eax
   5:   34 07                   xor    $0x7,%al
   7:   75 01                   jne    a <l1>
   9:   40                      inc    %eax
0000000a <l1>:
   a:   c3                      ret

온라인으로 사용해보십시오!

user202729의 JavaScript 응답 포트입니다. 빠른 통화 규칙을 사용합니다.



1

05AB1E , 8 7 바이트

žy‚àb0k

@Neil 의 숯불 항구 . @Grimy
덕분에 -1 바이트 .

정수로 입력하십시오.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

žy       # Push 128
        # Pair it with the (implicit) input-integer
   à     # Take the maximum of this pair (128 and input)
    b    # Convert it to a binary-string
     0k  # Get the 0-based first index of a "0" in this binary-string
         # (and output it implicitly as result)

1
s)7 포팅에 대한 다른 젤리 대답은 또 다른 8 제공 :₁+b¥η€ËO
그리미

@Grimy 내가 왜 처음에 없었는지 모르겠다 . : S 그러나 -1 주셔서 감사합니다.
Kevin Cruijssen

0

C, 31 바이트

f(x){return(x-160>>20-x/16)+2;}

온라인으로 사용해보십시오!

gcc (-O0)를 사용한 27 바이트

f(x){x=(x-160>>20-x/16)+2;}

대안, 31 및 33 바이트

f(x){return(10>>15-x/16)+7>>2;}
f(x){return x/128-(-3>>15-x/16);}

나는 아하와 함께 놀 때이 표현을 찾았습니다! 몇 년 전에 슈퍼 옵티 마이저 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.