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 không có nội dung chuyển đổi UTF-8, vì vậy tôi phải làm mọi thứ thủ công ..
Hãy thử trực tuyến hoặc xác minh rằng đó là một câu hỏi .
Giải trình:
quine -part:
Ngắn nhất Quine cho 05AB1E là một trong những điều này: 0"D34çý"D34çý
( 14 byte ) được cung cấp bởi @OliverNi . Câu trả lời của tôi sử dụng một phiên bản sửa đổi của câu hỏi đó bằng cách thêm vào ...
đây : 0"D34çý..."D34çý...
. Một lời giải thích ngắn về câu hỏi này:
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)
Phần thử thách:
Bây giờ cho phần thử thách của mã. Như tôi đã đề cập ở trên, 05AB1E không có nội dung chuyển đổi UTF-8, vì vậy tôi phải thực hiện những việc này một cách thủ công. Tôi đã sử dụng nguồn này làm tài liệu tham khảo về cách thực hiện điều đó: Chuyển đổi thủ công mã điểm unicode thành UTF-8 và UTF-16 . Dưới đây là một bản tóm tắt ngắn về việc chuyển đổi các ký tự Unicode thành UTF-8:
- Chuyển đổi các ký tự unicode thành các giá trị unicode của chúng (nghĩa là
"dЖ丽"
trở thành [100,1046,20029]
)
- Chuyển đổi các giá trị unicode này thành nhị phân (nghĩa là
[100,1046,20029]
trở thành ["1100100","10000010110","100111000111101"]
)
- Kiểm tra xem các ký tự trong phạm vi nào sau đây:
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
Ngoài ra còn có phạm vi cho 5 hoặc 6 byte, nhưng bây giờ chúng ta hãy loại bỏ chúng.
Ký tự d
sẽ ở trong phạm vi đầu tiên, do đó, 1 byte trong UTF-8; ký tự Ж
nằm trong phạm vi thứ hai, vì vậy 2 byte trong UTF-8; và ký tự 丽
nằm trong phạm vi thứ ba, vì vậy 3 byte trong UTF-8.
Trong x
mô hình đằng sau nó chứa đầy nhị phân của các ký tự này, từ phải sang trái. Vì vậy, d
( 1100100
) với mẫu 0xxxxxxx
trở thành 01100100
; các Ж
( 10000010110
) với mô hình 110xxxxx 10xxxxxx
trở nên 11010000 10010110
; và 丽
( 100111000111101
) với mẫu 1110xxxx 10xxxxxx 10xxxxxx
trở thành 1110x100 10111000 10111101
, sau đó phần còn lại x
được thay thế bằng 0
: 11100100 10111000 10111101
.
Vì vậy, cách tiếp cận đó tôi cũng đã sử dụng trong mã của mình. Thay vì kiểm tra phạm vi thực tế, tôi chỉ nhìn vào độ dài của nhị phân và so sánh nó với số lượng x
trong các mẫu, tuy nhiên, điều đó tiết kiệm một vài byte.
Ç # 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)
Xem 05AB1E câu trả lời này của tôi (phần Làm thế nào để nén các số nguyên lớn? Và Làm thế nào để liệt kê số nguyên nén? ) Để hiểu tại sao •Xó•18в
là [1,8,12,17]
.