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 non ha builtin di conversione UTF-8, quindi devo fare tutto manualmente .
Provalo online o verifica che sia un quine .
Spiegazione:
quine- parte:
Il quine più breve per 05AB1E è questo: 0"D34çý"D34çý
( 14 byte ) fornito da @OliverNi . La mia risposta utilizza una versione modificata di quella Quine aggiungendo al ...
qui: 0"D34çý..."D34çý...
. Una breve spiegazione di questo 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)
Parte sfida:
Ora per la parte sfida del codice. Come ho detto in alto, 05AB1E non ha built-in di conversione UTF-8, quindi devo fare queste cose manualmente. Ho usato questa fonte come riferimento su come farlo: Conversione manuale di punti di codice Unicode in UTF-8 e UTF-16 . Ecco un breve riassunto di quello relativo alla conversione dei caratteri Unicode in UTF-8:
- Converti i caratteri Unicode nei loro valori Unicode (ovvero
"dЖ丽"
diventa [100,1046,20029]
)
- Converti questi valori unicode in binari (ovvero
[100,1046,20029]
diventa ["1100100","10000010110","100111000111101"]
)
- Controlla in quale dei seguenti intervalli sono i caratteri:
0x00000000 - 0x0000007F
(0-127): 0xxxxxxx
0x00000080 - 0x000007FF
(128-2047): 110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF
(2.048-65.535): 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF
(65536-2097151): 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Esistono anche intervalli per 5 o 6 byte, ma per ora li lasciamo fuori.
Il personaggio d
sarà nel primo intervallo, quindi 1 byte in UTF-8; il carattere Ж
è nel secondo intervallo, quindi 2 byte in UTF-8; e il carattere 丽
è nel terzo intervallo, quindi 3 byte in UTF-8.
I x
pattern dietro sono riempiti con il binario di questi personaggi, da destra a sinistra. Quindi diventa il simbolo d
( 1100100
) con ; il ( ) con pattern diventa ; e ( ) con il modello diventa , dopo di che il residuo vengono sostituiti con : .0xxxxxxx
01100100
Ж
10000010110
110xxxxx 10xxxxxx
11010000 10010110
丽
100111000111101
1110xxxx 10xxxxxx 10xxxxxx
1110x100 10111000 10111101
x
0
11100100 10111000 10111101
Quindi, quell'approccio ho usato anche nel mio codice. Invece di controllare gli intervalli effettivi, guardo solo la lunghezza del file binario e la confronto con la quantità di x
nei modelli, poiché ciò consente di risparmiare qualche 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)
Vedere questo 05AB1E risposta di mine (sezioni Come comprimere grandi numeri interi? E come liste di interi comprimere? ) Per capire il motivo per cui •Xó•18в
è [1,8,12,17]
.