UTF-8 bayt dizisinin uzunluğu


15

İlk baytı verilen bir UTF-8 bayt dizisinin uzunluğunu belirleyin. Aşağıdaki tabloda hangi aralıkların her olası uzunluğa eşlendiği gösterilmektedir:

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

Tablodaki boşluklarla ilgili notlar: 0x80-0xBF devam baytlarıdır, 0xC0-0xC1 aşırı uzun, geçersiz bir sıra başlatır, 0xF5-0xFF Unicode maksimum değerinin ötesinde bir kod noktasına neden olur.

UTF-8 bayt dizisinin ilk baytını giriş ve çıkış olarak alan veya dizinin uzunluğunu döndüren bir program veya işlev yazın. G / Ç esnektir. Örneğin, girdi bir sayı, 8 bitlik karakter veya bir karakterlik dize olabilir. İlk baytın geçerli bir dizinin parçası olduğunu ve yukarıdaki aralıklardan birine düştüğünü varsayabilirsiniz.

Bu kod golf. Bayt cinsinden en kısa cevap kazanır.

Test senaryoları

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

8 bitlik bir listenin girişi kabul edilebilir mi?
Jonathan Allan

@JonathanAllan Hayır, bu esnek G / Ç'yi çok ileri götürür.
nwellnhof

Yanıtlar:


5

İleri, 6 bayt

x-size

bkz. https://forth-standard.org/standard/xchar/X-SIZE

Giriş ve çıkış standart bir Forth modelini takip eder:

Giriş

Bellek adresi + tek baytlık UTF-8 "dizesinin" uzunluğu (yani 1).

Çıktı

Bayt cinsinden UTF-8 dizi uzunluğu.

Basit kod

Mağaza 0xF0 bir bellek hücresine ve x-size çağırmak:

variable v
0xF0 v !
v 1 x-size

Sonucu kontrol edin:

.s <1> 4  ok

Bunun tio.run/#forth-gforth içinde işe yaradığını varsayarsak , bir örnek gösterebilir misiniz? Bayt 0xF0 ise nasıl bir tek baytlık UTF-8 dizesi olabilir anlamıyorum.
Dennis

> bir örnek gösterebilir misiniz? Bayt 0xF0 ise nasıl bir tek baytlık UTF-8 dizesi olabilir anlamıyorum. Nasıl yapılacağını gösteren bazı örnek kod ekledim. Ne yazık ki, gforth'un TIO sürümü Unicode kelimelerini desteklemiyor gibi görünüyor ("x boyutuna bakınız" a göre, oraya 1 döndürmek sadece kodlanmıştır).
zeplin

Anlıyorum. UTF-8 dizesi dediğim şey bu değil, çünkü sadece F0 , UTF-8 söz konusu olduğunda geçersiz bir bayt dizisidir.
Dennis

> F0 tek başına geçersiz bir bayt dizisi olduğundan True (bu yüzden "string" kelimesini tırnak içine aldım), ancak bu görev diziyi ilk bayt ile tanımakla ilgilidir ve Forth gerçekten geçersiz olmasını umursamaz Bu da bu çözümü mümkün kılıyor.
zeplin

6

Z80Golf , 19 14 bayt

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

Çevrimiçi deneyin!

@Bubbler sayesinde -5 bayt

Giriş 0x41 ile örnek-Çevrimiçi deneyin! montaj

0xC2 girişi ile örnek-Çevrimiçi deneyin!

Giriş 0xE0 ile örnek-Çevrimiçi deneyin!

Giriş 0xF4 ile örnek-Çevrimiçi deneyin!

Montaj:

;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

Çevrimiçi deneyin!


Kullanım Bash TIO ile montaj ile çalışmalarına, örnekler daha kolay görülebilen. Bağlantı ayrıca çözümünüzün 15 baytlık sürümüne sahiptir. İşte geliştirmeler yapıldı: xor 0xff -> cpl, gerek or a, jr nz, return -> ret nz, ld a,1 -> inc a.
Bubbler


4

Jöle ,  8  7 bayt

+⁹BIITḢ

Baytı bir tamsayı olarak kabul eden monadik bir bağlantı.

Çevrimiçi deneyin! Veya bakın değerlendirilen tüm girdileri .

8 bitlik bir listenin girişi kabul edilebilirse, yöntem sadece 6 bayttır: 1;IITḢ ancak çok esnek I / O konuştuğu kabul edilmiştir.

Nasıl?

+⁹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

Jöle , 8 7 bayt

»Ø⁷Ba\S

Çevrimiçi deneyin!

Nasıl çalışır

»Ø⁷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

Kömür , 12 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

     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 Meclisi, 11 bayt

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

Çevrimiçi deneyin!

User202729'un JavaScript yanıtının bağlantı noktası. Hızlı arama kurallarını kullanır.



1

05AB1E , 8 7 bayt

žy‚àb0k

Liman Neil'in Kömür cevabı .
-1 bayt sayesinde@Grimy .

Tamsayı olarak girin.

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

ž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)için 7. Porting için diğer Jelly cevabı başka 8 verir:₁+b¥η€ËO
Grimmy

@Grimy İlk başta neden sahip olmadığım hakkında hiçbir fikrim yok ..: S Ama -1 için teşekkürler.
Kevin Cruijssen

0

C, 31 bayt

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

Çevrimiçi deneyin!

Gcc ile 27 bayt (-O0)

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

Alternatifler, 31 ve 33 bayt

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

Bu ifadeleri Aha ile oynarken buldum! birkaç yıl önce superoptimizer .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.