Vamos voltar ao básico!
- Seu código, um programa ou função completo, deve converter o nome Unicode oficial de um caractere latino básico imprimível no caractere correspondente. Por exemplo, para a entrada
LOW LINE
seu código deve gerar_
. - Você só precisa usar um único nome de caractere como entrada.
- Você não pode usar nenhuma função ou biblioteca preexistente, embutida ou não, que ofereça qualquer lógica relacionada especificamente aos nomes de caracteres Unicode (por exemplo, Python
unicodedata
, JavaCharacter.getName
e assim por diante). - Para entrada diferente de um desses nomes, qualquer comportamento é aceitável.
Este é o código golf: o código mais curto em bytes vence.
Para evitar qualquer ambiguidade, este é o conjunto completo de nomes de personagens oficiais que usaremos (emprestados desta pergunta ):
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
saída::
ou comportamento indefinido?String.fromCharCode
proibido?CLON
?Respostas:
Código de máquina IA-32,
161160122 bytesHexdump do código:
Este código usa algum hash. Por alguma pesquisa de força bruta, descobri que a seguinte função hash pode ser aplicada aos bytes da string de entrada:
Ele multiplica
x
por 89, adiciona o próximo byte (código ASCII) e adota o módulo 113 restante. Ele faz isso em todos os bytes da string de entrada, exceto o último, por exemplo,LATIN CAPITAL LETTER A
eLATIN CAPITAL LETTER X
fornece o mesmo código de hash.Essa função hash não tem colisões e a saída está no intervalo de 0 a 113 (na verdade, por sorte, o intervalo é ainda mais estreito: 3 a 108).
Os valores de hash de todas as strings relevantes não preenchem completamente esse espaço, então decidi usá-lo para compactar a tabela de hash. Adicionei uma tabela "ignorar" (112 bits), que contém 0 se o local correspondente na tabela de hash estiver vazio e 1 caso contrário. Esta tabela converte um valor de hash em um índice "compactado", que pode ser usado para endereçar uma LUT densa.
As strings
LATIN CAPITAL LETTER
eLATIN SMALL LETTER
fornecem códigos de hash 52 e 26; eles são tratados separadamente. Aqui está um código C para isso:O código da linguagem de montagem correspondente (sintaxe de montagem em linha do MS Visual Studio):
Alguns detalhes de implementação dignos de nota:
CALL
instrução para obter um ponteiro para o código, onde reside a tabela codificada. No modo de 64 bits, ele poderia usar o registrorip
.BT
instrução para acessar a tabela de pulareax
,ecx
,edx
, que pode ser derrotado - por isso não há necessidade de salvar e restaurar registradoresal
eah
cuidadosamente, de modo que no lugar certo,ah
é diminuída a 0, e todo oeax
registo pode ser usado como um índice LUTfonte
JavaScript ES6, 228
236 247 257 267 274 287Nota: 7 caracteres salvos thx @ ev3commander
Nota 2: melhor que o JAPT após 7 edições principais,
Execute o trecho para testar
fonte
Japonês , 230 bytes
Cada
¿
um representa um caractere Unicode não imprimível. Experimente online!Ungolfed:
Isso foi muito divertido. Dividi os nomes dos personagens em vários pedaços grandes:
0. Pegue as duas primeiras letras
V=Us0,2;
define variávelV
para as duas primeiras letras deU
, a sequência de entrada. Isso será útil mais tarde.1. Letras maiúsculas
Isso é o mais fácil: as letras maiúsculas são as únicas que possuem um caractere na posição 21, que são a letra e o caso corretos. Assim,
Ug21
é suficiente.2. Letras minúsculas
Outro bastante fácil; o único outro nome que tem um caractere na posição 19 é
RIGHT SQUARE BRACKET
, portanto, verificamos se o nome vemR
com antesU<'R
; se for (&&
), pegamos o 19º caractereUg19
e o colocamos em minúsculav
.3. Dígitos
Todos esses nomes começam com
DI
(e, felizmente, nenhum dos outros), portantoV=="DI"
, se podemos transformá-lo em um dígito. As primeiras letras de alguns dos nomes dos dígitos são as mesmas, mas as duas primeiras são suficientes. Combinando-os em uma sequência, obtemosZEONTWTHFOFISISEEINI
. Agora podemos pegar o índiceb
dos dois primeiros caracteres no nome do dígitoUs6,8)
e dividir por dois.4)
SIGN
Existem sete nomes que contêm
SIGN
:Primeiro, verificamos se o nome contém a palavra
SIGN
. Acontece queGN
é suficiente;Uf"GN"
retorna todas as instâncias deGN
no nome, ou seja,null
se ele contém 0 instâncias e, portanto, é ignorado.Agora, usando a mesma técnica dos dígitos, combinamos as duas primeiras letras em uma sequência
LEGRPLEQDONUPE
, depois pegamos o índice e dividimos por duas. Isso resulta em um número0-6
, do qual podemos usar para obter o caractere correspondente da string<>+=$#%
.5)
MARK
Existem três caracteres que contêm
MARK
:Aqui usamos a mesma técnica que com
SIGN
.M
é suficiente para diferenciar esses três dos outros. Para traduzir para um símbolo, desta vez, basta marcar uma letra: o caractere na posição 2 é diferente para os três caracteres. Isso significa que não precisamos dividir por dois ao escolher o caractere correto.6
LEFT/RIGHT
Este grupo contém colchetes e parênteses
[]{}()
. Seria realmente complicado capturar os doisLEFT
eRIGHT
, felizmente, todos eles contêm a stringT
. Verificamos isso com a mesma técnica que fizemosSIGN
. Para traduzir para um símbolo,MARK
basta verificar uma letra; o personagem na posição 6 é único para todos os seis.7)
CO
O resto dos caracteres são bastante únicos, mas não são únicos o suficiente. Três deles começar com
CO
:COMMA
,COLON
, eCOMMERCIAL AT
. Usamos exatamente a mesma técnica como fizemos com os suportes, escolhendo o símbolo correto baseado no personagem na posição 4 (A
,N
ouE
).8. Tudo o resto
Até agora, os dois primeiros caracteres são diferentes para cada nome. Combinamos todos eles em uma sequência grande
SPAMAPASHYFUSORESETICIGRLOVE
e mapeamos cada par para o caractere correspondente&'*-./\;~^`_|
.9. Etapas finais
Cada uma das partes retorna uma string vazia ou,
null
se não for a correta, para que possamos vinculá-las da esquerda para a direita||
. O||
operador retorna o argumento da esquerda, se for verdade, e o argumento da direita, caso contrário. O Japt também possui saída implícita; portanto, seja qual for o resultado, ele é automaticamente enviado para a caixa de saída.Perguntas, comentários e sugestões são bem-vindos!
fonte
MARK
caracteres.spamapashyfusoreseticigrlove
= Spam um pashy por tanto redefinição amor gelada menina ... +1Python 2, 237 bytes
Obtenha o hash da string e o módulo divida-o por 535. Posteriormente, converta-o em um caractere unicode com esse número. A posição do caractere unicode em uma lista pré-compilada de caracteres unicode é posteriormente convertida no caractere ascii.
fonte
Javascript,
501499469465451430 bytesExplicação:
Essa cadeia longa é uma lista compactada.
a.length.toString(36)+a[0]+a.slice(-3)
determina como, se houver, a sequência será representada na lista. Além disso, lógica especial para letras. (com strings,a[0]
é uma abreviação interna paraa.charAt(0)
, a propósito)fonte
_
por+
, poderia Base64-comprimir a lista.btoa("abc")
ao texto compressa por 25% (desde que ele é válido texto base-64, que seria depois de substituir_
com-
), entãoatob("compressed stuff")
em seu código real.PowerShell,
603547464 bytes(
LineFeed
conta o mesmo byte que;
, então deixarei as quebras para facilitar a leitura)Editar 1 - Retirou muitos elementos da instrução switch e preencheu uma hashtable para pesquisas.
Edit 2 - Oh yeah ... indexando em uma string, esse é o caminho a seguir ...
Essencialmente, pega a entrada, divide-a em espaços e faz um curinga
switch
na primeira palavra para filtrar as mais engraçadas. Define o resultado disso para$b
. Se$b
não existir, a cadeia de caracteres$c
é avaliada nas três primeiras letras da primeira palavra e gera o caractere imediatamente a seguir, caso contrário, produzimos$b
.Alguns truques incluem o
LATIN CAPITAL LETTER R
que indexa em uma matriz com base na segunda palavraCAPITAL
, e gera a letra maiúscula / minúscula correspondente. O outro "truque" é para osDIGIT
, indexando em uma hashtable. Observe que não é mais curto fazer o mesmo truque de indexar em uma string aqui (na verdade, é mais longo em um byte).fonte
Javascript,
416411389 bytesEste é um formato mais legível (explicação a seguir):
Menos 5 bytes da combinação de cadeias de chave e valor.
Explicação: As expressões regulares na primeira linha reduzem as entradas em chaves exclusivas de 4 caracteres. Observe que a exclusividade é garantida apenas para o conjunto específico de nomes especificado no desafio, e duplicatas seriam muito comuns no inglês normal! Mesmo para esse desafio, tive que remover palavras comuns como colchete e sinal para obter um conjunto exclusivo.
Para retornar o caractere, verifico se é um caractere latino, verificando as cadeias "SER" e "cer", e retorno o último caractere da entrada, em minúsculas para ser.
Para todo o resto, refiro-me a uma sequência que contém todas as chaves de 4 caracteres, seguidas pelo caractere correto. Depois, uso índices de caracteres indexof e
substringpara puxar e retornar o caractere.Edit: Utilizou mais curingas para reduzir o tamanho de regex, substituiu substr por índices de caracteres e raspou mais vinte caracteres. Os defensores das regras observarão que esta atualização final será publicada após o término do desafio, no entanto, não acho que isso tenha mudado minha classificação. Isso é apenas prática para um iniciante.
fonte
Python 3, 148 bytes
Para sua conveniência de visualização, substituí dois bytes não imprimíveis pelos códigos de escape octais
\32
e\34
; desfazer isso para obter a função de 148 bytes.Eu calculei partes dessa função de hash com o GPerf .
fonte
Perl 6 ,
348242 bytesuso:
fonte