0"D34çýÇbεDg•Xó•18в@ƶà©i7j0ìëR6ôRíć7®-jšTìJ1®<×ì]ð0:J"D34çýÇbεDg•Xó•18в@ƶà©i7j0ìëR6ôRíć7®-jšTìJ1®<×ì]ð0:J
05AB1E에는 UTF-8 변환 내장 기능이 없으므로 모든 작업을 수동으로 수행 해야합니다 .
온라인으로 시도 하거나 quine 인지 확인 하십시오 .
설명:
quine- part :
최단 quine : 05AB1E 대한이 하나 0"D34çý"D34çý
( 14 바이트 ) 에 의해 제공 @OliverNi . 내 대답은 ...
여기에 다음 을 추가하여 해당 quine의 수정 된 버전을 사용합니다 0"D34çý..."D34çý...
. 이 quine에 대한 간단한 설명 :
0 # Push a 0 to the stack (can be any digit)
"D34çý" # Push the string "D34çý" to the stack
D # Duplicate this string
34ç # Push 34 converted to an ASCII character to the stack: '"'
ý # Join everything on the stack (the 0 and both strings) by '"'
# (output the result implicitly)
도전 과제 :
이제 코드의 챌린지 부분입니다. 위에서 언급했듯이 05AB1E에는 UTF-8 변환 내장 기능이 없으므로 이러한 작업을 수동으로 수행해야합니다. : 그 작업을 수행하는 방법에 대한 참조로이 소스를 사용했습니다 수동으로 UTF-8과 UTF-16으로 유니 코드 코드 포인트로 변환을 . 다음은 유니 코드 문자를 UTF-8로 변환하는 것에 대한 간단한 요약입니다.
- (즉, 자신의 유니 코드 값을 유니 코드 문자로 변환
"dЖ丽"
됩니다 [100,1046,20029]
)
- (즉, 이진 이러한 유니 코드 값을 변환
[100,1046,20029]
된다 ["1100100","10000010110","100111000111101"]
)
- 다음 범위 중 문자 범위를 확인하십시오.
0x00000000 - 0x0000007F
(0-127) : 0xxxxxxx
0x00000080 - 0x000007FF
(128-2047) : 110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF
(2048-65535) : 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF
(65536-2097151) : 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5 또는 6 바이트의 범위도 있지만 지금은 그대로 두겠습니다.
문자 d
는 첫 번째 범위에 있으므로 UTF-8의 1 바이트입니다. 문자 Ж
는 두 번째 범위에 있으므로 UTF-8의 경우 2 바이트입니다. 문자 丽
는 세 번째 범위에 있으므로 UTF-8의 3 바이트입니다.
x
왼쪽에있는 패턴은 오른쪽에서 이러한 문자의 바이너리로 가득 뒤에. 따라서 패턴을 가진 d
( 1100100
) 0xxxxxxx
는 01100100
; 패턴 이 있는 Ж
( 10000010110
) 110xxxxx 10xxxxxx
는 11010000 10010110
; 및 丽
( 100111000111101
패턴)을 1110xxxx 10xxxxxx 10xxxxxx
하게 1110x100 10111000 10111101
한 후, 나머지는 x
치환된다 0
: 11100100 10111000 10111101
.
그래서 그 접근 방식은 코드에서도 사용되었습니다. 실제 범위를 확인하는 대신 바이너리의 길이를보고 x
패턴 의 양과 비교 하면 몇 바이트가 절약됩니다.
Ç # Convert each character in the string to its unicode value
b # Convert each value to binary
ε # Map over these binary strings:
Dg # Duplicate the string, and get its length
•Xó• # Push compressed integer 8657
18в # Converted to Base-18 as list: [1,8,12,17]
@ # Check for each if the length is >= to this value
# (1 if truthy; 0 if falsey)
ƶ # Multiply each by their 1-based index
à # Pop and get its maximum
© # Store it in the register (without popping)
i # If it is exactly 1 (first range):
7j # Add leading spaces to the binary to make it of length 7
0ì # And prepend a "0"
ë # Else (any of the other ranges):
R # Reverse the binary
6ô # Split it into parts of size 6
Rí # Reverse it (and each individual part) back
ć # Pop, and push the remainder and the head separated to the stack
7®- # Calculate 7 minus the value from the register
j # Add leading spaces to the head binary to make it of that length
š # Add it at the start of the remainder-list again
Tì # Prepend "10" before each part
J # Join the list together
1®<× # Repeat "1" the value from the register - 1 amount of times
ì # Prepend that at the front
] # Close both the if-else statement and map
ð0: # Replace all spaces with "0"
J # And join all modified binary strings together
# (which is output implicitly - with trailing newline)
내이 05AB1E 대답을 참조하십시오 (섹션 얼마나 큰 정수를 압축하는 방법? 및 압축 정수 목록에 어떻게? ) 이유를 이해하는 •Xó•18в
것입니다 [1,8,12,17]
.