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はUnicodeの最大値を超えるコードポイントになります。

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ビットのリストの入力は受け入れられますか?
ジョナサンアラン

@JonathanAllanいいえ、それは柔軟なI / Oを取りすぎています。
nwellnhof

回答:


5

4番目、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文字列がどのように得られるかわかりません。
デニス

>例を示していただけますか?バイトが0xF0の場合、シングルバイトのUTF-8文字列がどのように得られるかわかりません。その方法を示すサンプルコードを追加しました。残念ながら、gforthのTIOバージョンはUnicodeワードをサポートしていないようです(「see x-size」によると、そこに1を返すようにハードコードされているだけです)。
ツェッペリン

そうですか。ただし、UTF-8に関する限り、F0だけが無効なバイトシーケンスであるため、これは私がUTF-8文字列と呼ぶものではありません。
デニス

> F0のみが無効なバイトシーケンスTrueであるため(引用符で単語 "string"を配置したのですが)、このタスクはシーケンスの最初のバイトによるシーケンスの認識に関するものであり、Forthは無効であることを実際に気にしません、このソリューションを可能にします。
ツェッペリン

6

Z80Golf19 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 ajr nz, return -> ret nzld a,1 -> inc a
バブラー


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






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回答のポート。fastcall規則を使用します。



1

05AB1E8 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
Grimmy

@Grimyそもそもなぜ持っていなかったのかわかりません。.:Sしかし、-1に感謝します。
ケビンCruijssen

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.