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 n'a pas de conversion UTF-8 intégrée, donc je dois tout faire manuellement ..
Essayez-le en ligne ou vérifiez qu'il s'agit d'une quine .
Explication:
quine -part:
Le quine le plus court pour 05AB1E est celui-ci: 0"D34çý"D34çý( 14 octets ) fourni par @OliverNi . Ma réponse utilise en ajoutant à la version modifiée de ce Quine ...ici: 0"D34çý..."D34çý.... Une brève explication de ce 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)
Partie défi:
Maintenant, pour la partie défi du code. Comme je l'ai mentionné en haut, 05AB1E n'a pas de conversion intégrée UTF-8, donc je dois faire ces choses manuellement. J'ai utilisé cette source comme référence sur la façon de le faire: convertir manuellement les points de code unicode en UTF-8 et UTF-16 . Voici un bref résumé de celui concernant la conversion des caractères Unicode en UTF-8:
- Convertissez les caractères unicode en leurs valeurs unicode (c'est-à-dire
"dЖ丽"devient [100,1046,20029])
- Convertissez ces valeurs unicode en binaire (c'est-à-dire
[100,1046,20029]devient ["1100100","10000010110","100111000111101"])
- Vérifiez dans laquelle des plages suivantes les caractères sont:
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
Il existe également des plages de 5 ou 6 octets, mais laissons-les pour l'instant.
Le caractère dsera dans la première plage, donc 1 octet en UTF-8; le caractère Жest dans la deuxième plage, donc 2 octets en UTF-8; et le caractère 丽est dans la troisième plage, donc 3 octets en UTF-8.
Le xdans le motif derrière lui est rempli du binaire de ces caractères, de droite à gauche. Ainsi, le d( 1100100) avec motif 0xxxxxxxdevient 01100100; le Ж( 10000010110) avec motif 110xxxxx 10xxxxxxdevient 11010000 10010110; et le 丽( 100111000111101) avec le motif 1110xxxx 10xxxxxx 10xxxxxxdevient 1110x100 10111000 10111101, après quoi le restant xsont remplacés par 0: 11100100 10111000 10111101.
Donc, cette approche que j'ai également utilisée dans mon code. Au lieu de vérifier les plages réelles, je regarde simplement la longueur du binaire et le compare à la quantité de xdans les modèles, car cela économise quelques octets.
Ç # 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)
Voir cette réponse 05AB1E de mes (sections Comment compresser les grands entiers? Et comment les listes entières Compresser? ) Pour comprendre pourquoi •Xó•18вest [1,8,12,17].