ความยาวของลำดับ 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 จะส่งผลให้ codepoint เกิน Unicode สูงสุด

เขียนโปรแกรมหรือฟังก์ชั่นที่รับไบต์แรกของลำดับ UTF-8 เป็นอินพุตและเอาต์พุตหรือส่งคืนความยาวของลำดับ I / O ยืดหยุ่นได้ ตัวอย่างเช่นการป้อนข้อมูลอาจเป็นตัวเลขตัวอักษร 8 บิตหรือสตริงอักขระหนึ่งตัว คุณสามารถสันนิษฐานได้ว่าไบต์แรกเป็นส่วนหนึ่งของลำดับที่ถูกต้องและอยู่ในช่วงใดช่วงหนึ่งข้างต้น

นี่คือรหัสกอล์ฟ คำตอบที่สั้นที่สุดเป็นไบต์ชนะ

กรณีทดสอบ

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

อินพุตของรายการ 8 บิตยอมรับได้หรือไม่?
Jonathan Allan

@JanathanAllan ไม่นั่นจะทำให้ I / O มีความยืดหยุ่นมากเกินไป
nwellnhof

คำตอบ:


5

มา 6 ไบต์

x-size

ดูhttps://forth-standard.org/standard/xchar/X-SIZE

อินพุทและเอาท์พุทเป็นไปตามรูปแบบมาตรฐาน

อินพุต

ที่อยู่หน่วยความจำ + ความยาว (เช่น 1) ของ UTF-8 "สตริง" ไบต์เดียว

เอาท์พุต

ความยาวของลำดับ UTF-8 เป็นไบต์

รหัสตัวอย่าง

เก็บ0xF0ในเซลล์หน่วยความจำและเรียกใช้ x-size:

variable v
0xF0 v !
v 1 x-size

ตรวจสอบผลลัพธ์:

.s <1> 4  ok

สมมติว่าใช้งานได้ในtio.run/#forth-gforthคุณสามารถแสดงตัวอย่างได้หรือไม่? ฉันไม่เข้าใจว่าคุณจะมีสตริง UTF-8 ไบต์เดียวได้อย่างไรถ้าไบต์เป็น 0xF0
เดนนิส

> คุณสามารถแสดงตัวอย่างได้หรือไม่ ฉันไม่เข้าใจว่าคุณจะมีสตริง UTF-8 ไบต์เดียวได้อย่างไรถ้าไบต์เป็น 0xF0 ฉันได้เพิ่มรหัสตัวอย่างบางส่วนที่แสดงให้เห็นถึงวิธีการทำ น่าเสียดายที่รุ่น TIO ของ gforth ดูเหมือนจะไม่สนับสนุนคำ Unicode (ตามที่ "เห็นขนาด x" มันเป็นรหัสยากที่จะส่งคืน 1 ที่นั่น)
Zeppelin

ฉันเห็น. นั่นไม่ใช่สิ่งที่ฉันเรียกว่าสตริง UTF-8 แต่เนื่องจากF0เพียงอย่างเดียวนั้นเป็นลำดับไบต์ที่ไม่ถูกต้องเท่าที่ UTF-8 เกี่ยวข้อง
เดนนิส

> เนื่องจาก F0 เพียงอย่างเดียวเป็นลำดับไบต์ที่ไม่ถูกต้อง True (นั่นคือสาเหตุที่ฉันใส่คำว่า "string" ในเครื่องหมายคำพูด) แต่งานนี้เกี่ยวกับการรับรู้ลำดับโดยเป็นไบต์แรกโดยเฉพาะและ Forth ไม่สนใจว่ามันจะไม่ถูกต้อง ซึ่งทำให้โซลูชันนี้เป็นไปได้
Zeppelin

6

Z80Golf , 19 14 ไบต์

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

ลองออนไลน์!

-5 ไบต์ขอบคุณ @Bubbler

ตัวอย่างกับอินพุต 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

5

C (gcc) , 39 ไบต์

t(char x){x=(__builtin_clz(~x)-24)%7u;}

ลองออนไลน์!



@R .. เพราะพวกเขาได้รับการขยายสัญญาณ ตัวอย่างเช่น~(char)0xF0 == ~(int)0xFFFFFFF0(สมมติchar = signed char, sizeof(int) == 4)
user202729

อ่าสมมติว่ามีการเซ็นชอร์
. GitHub หยุดช่วยน้ำแข็ง

4

เยลลี่ ,  8  7 ไบต์

+⁹BIITḢ

ลิงก์ monadic ยอมรับไบต์เป็นจำนวนเต็ม

ลองออนไลน์! หรือดูปัจจัยการผลิตทั้งหมดได้รับการประเมิน

หากอินพุตของรายการของ 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






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

เยลลี่ขนาด 7 ไบต์

»Ø⁷Bi0’

ท่าเรือคำตอบ 05AB1E ของฉัน

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

 Ø⁷        # Push 128
»          # Take the max of 128 and the input
   B       # Convert it to binary
    i0     # Get the 1-indexed first index of a 0
          # Decrease it by 1 to make it 0-indexed (and output it implicitly)


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

ลองออนไลน์!

คำตอบ JavaScript ของพอร์ต user202729 ใช้การประชุม fastcall



1

05AB1E , 8 7 ไบต์

žy‚àb0k

พอร์ตของ@ถ่านคำตอบของNeilคำตอบถ่าน
-1 ขอบคุณไบต์@Grimy

อินพุตเป็นจำนวนเต็ม

ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ž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 สำหรับการย้ายคำตอบอื่น ๆ ของ Jelly ให้อีก 8:₁+b¥η€ËO
Grimmy

@Grimy ไม่มีความคิดว่าทำไมฉันไม่ได้เป็นครั้งแรก .. : S แต่ขอบคุณสำหรับ -1
Kevin Cruijssen

0

C, 31 ไบต์

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

ลองออนไลน์!

27 ไบต์ด้วย gcc (-O0)

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);}

ฉันพบคำเหล่านี้เมื่อเล่นกับ Aha! superoptimizer ไม่กี่ปีที่ผ่านมา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.