¡Volvamos a lo básico!
- Su código, un programa o función completa, debe convertir el nombre oficial Unicode de un carácter latino básico imprimible en el carácter correspondiente. Por ejemplo, para la entrada
LOW LINE
su código debe salir_
. - Solo necesita tomar un solo nombre de carácter como entrada.
- No puede utilizar ninguna función o biblioteca preexistente, integrada o de otro tipo, que ofrezca ninguna lógica relacionada específicamente con los nombres de caracteres Unicode (por ejemplo, Python
unicodedata
, JavaCharacter.getName
, etc.) - Para entradas que no sean uno de estos nombres, cualquier comportamiento es aceptable.
Este es el código de golf: el código más corto en bytes gana.
Para evitar cualquier ambigüedad, este es el conjunto completo de nombres de personajes oficiales que usaremos (tomado de esta pregunta ):
SPACE
! EXCLAMATION MARK
" QUOTATION MARK
# NUMBER SIGN
$ DOLLAR SIGN
% PERCENT SIGN
& AMPERSAND
' APOSTROPHE
( LEFT PARENTHESIS
) RIGHT PARENTHESIS
* ASTERISK
+ PLUS SIGN
, COMMA
- HYPHEN-MINUS
. FULL STOP
/ SOLIDUS
0 DIGIT ZERO
1 DIGIT ONE
2 DIGIT TWO
3 DIGIT THREE
4 DIGIT FOUR
5 DIGIT FIVE
6 DIGIT SIX
7 DIGIT SEVEN
8 DIGIT EIGHT
9 DIGIT NINE
: COLON
; SEMICOLON
< LESS-THAN SIGN
= EQUALS SIGN
> GREATER-THAN SIGN
? QUESTION MARK
@ COMMERCIAL AT
A LATIN CAPITAL LETTER A
B LATIN CAPITAL LETTER B
C LATIN CAPITAL LETTER C
D LATIN CAPITAL LETTER D
E LATIN CAPITAL LETTER E
F LATIN CAPITAL LETTER F
G LATIN CAPITAL LETTER G
H LATIN CAPITAL LETTER H
I LATIN CAPITAL LETTER I
J LATIN CAPITAL LETTER J
K LATIN CAPITAL LETTER K
L LATIN CAPITAL LETTER L
M LATIN CAPITAL LETTER M
N LATIN CAPITAL LETTER N
O LATIN CAPITAL LETTER O
P LATIN CAPITAL LETTER P
Q LATIN CAPITAL LETTER Q
R LATIN CAPITAL LETTER R
S LATIN CAPITAL LETTER S
T LATIN CAPITAL LETTER T
U LATIN CAPITAL LETTER U
V LATIN CAPITAL LETTER V
W LATIN CAPITAL LETTER W
X LATIN CAPITAL LETTER X
Y LATIN CAPITAL LETTER Y
Z LATIN CAPITAL LETTER Z
[ LEFT SQUARE BRACKET
\ REVERSE SOLIDUS
] RIGHT SQUARE BRACKET
^ CIRCUMFLEX ACCENT
_ LOW LINE
` GRAVE ACCENT
a LATIN SMALL LETTER A
b LATIN SMALL LETTER B
c LATIN SMALL LETTER C
d LATIN SMALL LETTER D
e LATIN SMALL LETTER E
f LATIN SMALL LETTER F
g LATIN SMALL LETTER G
h LATIN SMALL LETTER H
i LATIN SMALL LETTER I
j LATIN SMALL LETTER J
k LATIN SMALL LETTER K
l LATIN SMALL LETTER L
m LATIN SMALL LETTER M
n LATIN SMALL LETTER N
o LATIN SMALL LETTER O
p LATIN SMALL LETTER P
q LATIN SMALL LETTER Q
r LATIN SMALL LETTER R
s LATIN SMALL LETTER S
t LATIN SMALL LETTER T
u LATIN SMALL LETTER U
v LATIN SMALL LETTER V
w LATIN SMALL LETTER W
x LATIN SMALL LETTER X
y LATIN SMALL LETTER Y
z LATIN SMALL LETTER Z
{ LEFT CURLY BRACKET
| VERTICAL LINE
} RIGHT CURLY BRACKET
~ TILDE
COLON COLON
salida::
o indefinido?String.fromCharCode
prohibido?CLON
?Respuestas:
Código de máquina IA-32,
161160122 bytesHexdump del código:
Este código usa algo de hashing. Mediante una búsqueda de fuerza bruta, descubrí que la siguiente función hash se puede aplicar a los bytes de la cadena de entrada:
Se multiplica
x
por 89, agrega el siguiente byte (código ASCII) y toma el resto del módulo 113. Lo hace en todos los bytes de la cadena de entrada, excepto en el último, por ejemplo,LATIN CAPITAL LETTER A
yLATIN CAPITAL LETTER X
proporciona el mismo código hash.Esta función hash no tiene colisiones, y la salida está en el rango 0 ... 113 (en realidad, por suerte, el rango es aún más estrecho: 3 ... 108).
Los valores hash de todas las cadenas relevantes no llenan ese espacio por completo, así que decidí usar esto para comprimir la tabla hash. Agregué una tabla de "omisión" (112 bits), que contiene 0 si el lugar correspondiente en la tabla hash está vacío, y 1 en caso contrario. Esta tabla convierte un valor hash en un índice "comprimido", que se puede usar para abordar una LUT densa.
Las cadenas
LATIN CAPITAL LETTER
yLATIN SMALL LETTER
dan los códigos hash 52 y 26; Se manejan por separado. Aquí hay un código C para eso:El código del lenguaje ensamblador correspondiente (sintaxis de ensamblaje en línea de MS Visual Studio):
Algunos detalles de implementación notables:
CALL
instrucción para obtener un puntero al código, donde reside la tabla codificada. En el modo de 64 bits, podría usar el registro en surip
lugar.BT
instrucciones para acceder a la tabla de omisióneax
,ecx
,edx
, que se puede clobbered - lo que no hay necesidad de guardar y restaurar los registrosal
y conah
cuidado, de modo que en el lugar correctoah
se reduce a 0, y todo eleax
registro se puede usar como un índice LUTfuente
JavaScript ES6, 228,
236, 247, 257, 267, 274, 287Nota: 7 caracteres guardados thx @ ev3commander
Nota 2: mejor que JAPT después de 7 ediciones principales,
Ejecute el fragmento para probar
fuente
Japt , 230 bytes
Cada uno
¿
representa un carácter Unicode no imprimible. Pruébalo en línea!Sin golf:
Esto fue muy divertido. He dividido los nombres de los personajes en varios fragmentos grandes:
0. Toma las dos primeras letras
V=Us0,2;
establece variableV
a las dos primeras letras deU
, la cadena de entrada. Esto será útil más tarde.1. Mayúsculas
Esta es la más fácil: las letras mayúsculas son las únicas que tienen un carácter en la posición 21, que resultan ser la letra y el caso correctos. Por lo tanto,
Ug21
es suficiente.2. letras minúsculas
Otro bastante fácil; el único otro nombre que tiene un carácter en la posición 19 es
RIGHT SQUARE BRACKET
, por lo que verificamos si el nombre viene antesR
conU<'R
, luego si es (&&
), tomamos el carácter 19 conUg19
y lo ponemos en minúscula conv
.3. Dígitos
Todos estos nombres comienzan con
DI
(y afortunadamente, ninguno de los otros), por lo que siV=="DI"
podemos convertirlo en un dígito. Las primeras letras de algunos de los nombres de los dígitos son iguales, pero las dos primeras letras son suficientes. Combinando estos en una sola cadena, obtenemosZEONTWTHFOFISISEEINI
. Ahora podemos tomar el índiceb
de los dos primeros caracteres en el nombre del dígitoUs6,8)
y dividirlo por dos.4)
SIGN
Hay siete nombres que contienen
SIGN
:Primero comprobamos que el nombre contiene la palabra
SIGN
. Resulta queGN
es suficiente;Uf"GN"
devuelve todas las instancias delGN
nombre, que esnull
si contiene 0 instancias, y por lo tanto se omite.Ahora, usando la misma técnica que con los dígitos, combinamos las dos primeras letras en una cadena
LEGRPLEQDONUPE
, luego tomamos el índice y lo dividimos por dos. Esto da como resultado un número de0-6
, que podemos usar para tomar el carácter correspondiente de la cadena<>+=$#%
.5)
MARK
Hay tres caracteres que contienen
MARK
:Aquí usamos la misma técnica que con
SIGN
.M
es suficiente para diferenciar estos tres de los demás. Para traducir a un símbolo, esta vez verificar una letra es suficiente: el carácter en la posición 2 es diferente para los tres caracteres. Esto significa que no tenemos que dividir entre dos al elegir el personaje correcto.6)
LEFT/RIGHT
Este grupo contiene los corchetes y paréntesis,
[]{}()
. Sería realmente complicado capturar ambosLEFT
yRIGHT
, afortunadamente, todos contienen la cadenaT
. Verificamos esto con la misma técnica que hicimos conSIGN
. Para traducir a un símbolo, como conMARK
, verificar una letra es suficiente; El personaje en la posición 6 es único para los seis.7)
CO
El resto de los caracteres son bastante únicos, pero no lo suficientemente únicos. Tres de ellos comienzan con
CO
:COMMA
,COLON
, yCOMMERCIAL AT
. Utilizamos exactamente la misma técnica como lo hicimos con los soportes, elegir el símbolo apropiado basado en el carácter en la posición 4 (A
,N
oE
).8. Todo lo demás
Por ahora, los dos primeros caracteres son diferentes para cada nombre. Los combinamos todos en una gran cadena
SPAMAPASHYFUSORESETICIGRLOVE
y asignamos cada par a su correspondiente carácter&'*-./\;~^`_|
.9. Pasos finales
Cada una de las partes devuelve una cadena vacía o,
null
si no es la correcta, podemos vincularlas todas de izquierda a derecha||
. El||
operador devuelve el argumento izquierdo si es verdadero, y el argumento derecho de lo contrario. Japt también tiene salida implícita, por lo que sea cual sea el resultado, se envía automáticamente al cuadro de salida.Preguntas, comentarios y sugerencias bienvenidos!
fuente
MARK
caracteres.spamapashyfusoreseticigrlove
= Spam un pashy para reiniciar el amor de la chica helada ... +1Python 2, 237 bytes
Obtenga el hash de la cadena y el módulo divídalo por 535. Posteriormente conviértalo a un carácter unicode con ese número. La posición del carácter unicode en una lista precompilada de caracteres unicode se convierte posteriormente al carácter ascii.
fuente
Javascript,
501499469465451430 bytesExplicación:
Esa larga cadena es una lista comprimida.
a.length.toString(36)+a[0]+a.slice(-3)
determina cómo, en todo caso, la cadena se representará en la lista. Además, lógica especial para letras. (pora[0]
cierto , es una abreviatura integrada paraa.charAt(0)
, por cierto)fuente
_
con+
, podría Base64-comprimir la lista.btoa("abc")
para comprimir el texto en un 25% (con tal de que es válido el texto base 64, que sería después de reemplazar_
con-
), a continuación,atob("compressed stuff")
en su código real.PowerShell,
603547464 bytes(
LineFeed
cuenta el mismo byte;
, así que dejaré los descansos para facilitar la lectura)Edición 1: eliminó muchos elementos de la instrucción de cambio y, en su lugar, completó una tabla hash para las búsquedas.
Edición 2 - Oh sí ... indexar en una cadena, ese es el camino a seguir ...
Esencialmente toma la entrada, la divide en espacios y hace un comodín
switch
en la primera palabra para filtrar los tontos. Establece el resultado de eso en$b
. Si$b
no existe, la cadena$c
se evalúa en las primeras tres letras de la primera palabra y genera el carácter que sigue inmediatamente; de lo contrario, se genera$b
.Algunos trucos incluyen el
LATIN CAPITAL LETTER R
que indexa en una matriz en función de si la segunda palabra esCAPITAL
, y genera la letra mayúscula / minúscula correspondiente. El otro "truco" es para laDIGIT
s, indexando en una tabla hash. Tenga en cuenta que no es más corto hacer el mismo truco de índice en una cadena aquí (en realidad es más largo por un byte).fuente
Javascript,
416411389 bytesEste es un formato más legible (la explicación vendrá más adelante):
Menos 5 bytes de la combinación de cadenas de clave y valor.
Explicación: Las expresiones regulares en la primera línea reducen las entradas en claves únicas de 4 caracteres. Tenga en cuenta que la unicidad solo está garantizada para el conjunto específico de nombres especificados en el desafío, ¡y los duplicados serían muy comunes para el inglés normal! Incluso para este desafío, tuve que eliminar palabras comunes como corchetes y signos para obtener un conjunto único.
Para devolver el carácter, verifico si es un carácter latino comprobando las cadenas "SER" y "cer", y devuelvo el último carácter de la entrada, en minúsculas para ser.
Para todo lo demás, me refiero a una cadena que contiene todas las 4 teclas de caracteres, seguidas del carácter correcto. Luego uso indexof y los índices de caracteres de
subcadenapara extraer y devolver el carácter.Editar: se usaron más comodines para reducir el tamaño de expresiones regulares, se reemplazó substr con índices de caracteres y se recortó en veinte caracteres. Los expertos en reglas notarán que esta actualización final se publica después de que el desafío ha finalizado, sin embargo, no creo que haya cambiado mi clasificación. Esto es solo práctica para un novato.
fuente
Python 3, 148 bytes
Para su comodidad de visualización, he reemplazado dos bytes no imprimibles con los códigos de escape octal
\32
y\34
; deshaga esto para obtener la función de 148 bytes.Calculé partes de esta función hash con GPerf .
fuente
Perl 6 ,
348242 bytesuso:
fuente