基本拉丁字符名称到字符


23

让我们回到基础!

  • 您的代码(一个完整的程序或函数)必须将可打印的基本拉丁字符的正式Unicode名称转换为相应的字符。例如,对于输入,LOW LINE您的代码必须输出_
  • 您只需要输入一个字符名称即可。
  • 您不能使用任何内置或以其他方式存在的预先存在的函数或库,这些函数或库提供与Unicode字符名称(例如Python unicodedata,Java Character.getName等等)特别相关的任何逻辑。
  • 对于这些名称之一以外的输入,任何行为都是可以接受的。

这就是代码高尔夫:以字节为单位的最短代码获胜。

为避免歧义,这是我们将使用的全套正式角色名称(从这个问题中借来的):

     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

2
程序仅需要处理一个字符名称吗?例如,应该COLON COLON输出::还是未定义的行为?
凯文·

编辑以澄清。
路加福音

为什么被String.fromCharCode禁止?
SuperJedi224 2015年

糟糕,我误解了该功能的作用。
路加福音

我们如何处理无效输入,例如CLON
edc65

Answers:


25

IA-32机器代码161个 160 122字节

代码的十六进制转储:

33 c0 6b c0 59 0f b6 11 03 c2 b2 71 f6 f2 c1 e8
08 41 80 79 01 00 75 ea e8 39 00 00 00 08 2c 5e
4a bd a3 cd c5 90 09 46 04 06 14 40 3e 3d 5b 23
60 5e 3f 2d 31 32 29 25 2e 3c 7e 36 39 34 33 30
21 2f 26 7d 7c 2c 3b 7b 2a 37 5d 22 35 20 3a 28
5c 27 2b 38 5f 24 5a 3c 34 74 17 3c 1a 74 16 33
c9 86 c4 0f a3 0a 14 00 41 fe cc 75 f6 8a 44 02
0e c3 8a 01 c3 8a 01 04 20 c3

这段代码使用了一些哈希。通过一些蛮力搜索,我发现可以将以下哈希函数应用于输入字符串的字节:

int x = 0;
while (s[1])
{
    x = (x * 89 + *s) % 113;
    ++s;
}

它乘以x89,相加下一个字节(ASCII码),并取余数113。它对输入字符串的所有字节(最后一个除外)执行所有操作,例如,LATIN CAPITAL LETTER ALATIN CAPITAL LETTER X给出相同的哈希码。

此哈希函数没有冲突,并且输出的范围是0 ... 113(实际上,幸运的是,范围甚至更窄:3 ... 108)。

所有相关字符串的哈希值不能完全填满该空间,因此我决定使用此值来压缩哈希表。我添加了一个“跳过”表(112位),如果哈希表中的对应位置为空,则包含0,否则为1。该表将哈希值转换为“压缩”索引,该索引可用于寻址密集LUT。

字符串LATIN CAPITAL LETTERLATIN SMALL LETTER给出哈希码52和26;它们分开处理。这是一个C代码:

char find(const char* s)
{
    int hash = 0;
    while (s[1])
    {
        hash = (hash * 89 + *s) % 113;
        ++s;
    }

    if (hash == 52)
        return *s;
    if (hash == 26)
        return *s + 32;

    int result_idx = 0;
    int bit = 0;
    uint32_t skip[] = {0x4a5e2c08, 0xc5cda3bd, 0x04460990, 0x1406};
    do {
        if (skip[bit / 32] & (1 << bit % 32))
            ++result_idx;
        ++bit;
    } while (--hash);

    return "@>=[#`^?-12)%.<~69430!/&}|,;{*7]\"5 :(\\'+8_$"[result_idx];
}

相应的汇编语言代码(MS Visual Studio内联汇编语法):

_declspec(naked) char _fastcall find(char* s)
{
    _asm {
        xor eax, eax;
    mycalc:
        imul eax, eax, 89;
        movzx edx, [ecx];
        add eax, edx;
        mov dl, 113;
        div dl;
        shr eax, 8;
        inc ecx;
        cmp byte ptr [ecx + 1], 0;
        jne mycalc;

        call mycont;
        // skip table
        _asm _emit 0x08 _asm _emit 0x2c _asm _emit 0x5e _asm _emit 0x4a;
        _asm _emit 0xbd _asm _emit 0xa3 _asm _emit 0xcd _asm _emit 0xc5;
        _asm _emit 0x90 _asm _emit 0x09 _asm _emit 0x46 _asm _emit 0x04;
        _asm _emit 0x06 _asm _emit 0x14;
        // char table
        _asm _emit '@' _asm _emit '>' _asm _emit '=' _asm _emit '[';
        _asm _emit '#' _asm _emit '`' _asm _emit '^' _asm _emit '?';
        _asm _emit '-' _asm _emit '1' _asm _emit '2' _asm _emit ')';
        _asm _emit '%' _asm _emit '.' _asm _emit '<' _asm _emit '~';
        _asm _emit '6' _asm _emit '9' _asm _emit '4' _asm _emit '3';
        _asm _emit '0' _asm _emit '!' _asm _emit '/' _asm _emit '&';
        _asm _emit '}' _asm _emit '|' _asm _emit ',' _asm _emit ';';
        _asm _emit '{' _asm _emit '*' _asm _emit '7' _asm _emit ']';
        _asm _emit '"' _asm _emit '5' _asm _emit ' ' _asm _emit ':';
        _asm _emit '(' _asm _emit '\\' _asm _emit '\'' _asm _emit '+';
        _asm _emit '8' _asm _emit '_' _asm _emit '$';

    mycont:
        pop edx;
        cmp al, 52;
        je capital_letter;
        cmp al, 26;
        je small_letter;

        xor ecx, ecx;
        xchg al, ah;
    decode_hash_table:
        bt [edx], ecx;
        adc al, 0;
        inc ecx;
        dec ah;
        jnz decode_hash_table;

        mov al, [edx + eax + 14];
        ret;

    capital_letter:
        mov al, [ecx];
        ret;

    small_letter:
        mov al, [ecx];
        add al, 32;
        ret;
    }
}

一些值得注意的实现细节:

  • 它使用一条CALL指令来获取指向代码的指针,该代码位于硬编码表所在的位置。在64位模式下,它可以改用寄存器rip
  • 它使用BT指令访问跳过表
  • 它仅使用3个寄存器eaxecx,)即可完成工作,edx因此无需保存和恢复寄存器
  • 当解码的哈希表,它使用alah仔细,以便在正确的位置ah降低到0,并且整个eax寄存器可被用作LUT索引

18

的JavaScript ES6,228 236 247 257 267 274 287

注意:保存了7个字符,谢谢@ ev3commander

注意2:经过7次重大修改,胜过JAPT

n=>n<'L'?"XC!DO$MP&OS'SK*N--FU.ZE0TW2HR3OU4FI5IX6EI8NI9EM;LS=R->IA@MF^AV`MM,NE1EN7LO:".replace(/(..)./g,(c,s)=>~n.search(s)?n=c[2]:0)&&n:'~  / ;  |?"\\ ) }]_+ #% < ( {['[(n<'Q')*13+n.length-(n>'T')-4]||n[21]||n[19].toLowerCase()

运行代码片段进行测试

F=n=>
  n<'L'?"XC!DO$MP&OS'SK*N--FU.ZE0TW2HR3OU4FI5IX6EI8NI9EM;LS=R->IA@MF^AV`MM,NE1EN7LO:"
  .replace(/(..)./g,(c,s)=>~n.search(s)?n=c[2]:0)&&n:
  '~  / ;  |?"\\ ) }]_+ #% < ( {['[(n<'Q')*13+n.length-(n>'T')-4]
  ||n[21]||n[19].toLowerCase()

//TEST
console.log=x=>O.innerHTML+=x+'\n'
;[
['&','AMPERSAND'],
['\'','APOSTROPHE'],
['*','ASTERISK'],
['^','CIRCUMFLEX ACCENT'],
[':','COLON'],
[',','COMMA'],
['@','COMMERCIAL AT'],
['8','DIGIT EIGHT'],
['5','DIGIT FIVE'],
['4','DIGIT FOUR'],
['9','DIGIT NINE'],
['1','DIGIT ONE'],
['7','DIGIT SEVEN'],
['6','DIGIT SIX'],
['3','DIGIT THREE'],
['2','DIGIT TWO'],
['0','DIGIT ZERO'],
['$','DOLLAR SIGN'],
['=','EQUALS SIGN'],
['!','EXCLAMATION MARK'],
['.','FULL STOP'],
['`','GRAVE ACCENT'],
['>','GREATER-THAN SIGN'],
['-','HYPHEN-MINUS'],
['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'],
['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'],
['(','LEFT PARENTHESIS'],
['[','LEFT SQUARE BRACKET'],
['<','LESS-THAN SIGN'],
['_','LOW LINE'],
['#','NUMBER SIGN'],
['%','PERCENT SIGN'],
['+','PLUS SIGN'],
['?','QUESTION MARK'],
['"','QUOTATION MARK'],
['\\','REVERSE SOLIDUS'],
['}','RIGHT CURLY BRACKET'],
[')','RIGHT PARENTHESIS'],
[']','RIGHT SQUARE BRACKET'],
[';','SEMICOLON'],
['/','SOLIDUS'],
[' ','SPACE'],
['~','TILDE'],
['|','VERTICAL LINE'],
].forEach(t=>{
  var r=F(t[1]),ok=r==t[0]
  //if (!ok) // uncomment to see just errors
  console.log(r+' ('+t[0]+') '+t[1]+(ok?' OK':' ERROR'))
})
console.log('DONE')
<pre id=O></pre>


5
只是...怎么了?做得好。
SuperJedi224

实际上,除了字母之外,没有以“ LA”开头的字符
ev3commander

@ ev3commander是的,但是我在这里管理LAT,RIG和LEF,而2个字符似乎太少了,具有LEFT和LESS
edc65

哦 我只是略读而未看到RIG / LEF部分。
ev3commander 2015年

@ ev3commander在第二个以为你有观点!我可以合并处理LESS和LEFT并保存4个字节。Thx
edc65

10

Japt,230字节

V=U¯2;Ug21 ªU<'R©Ug19 v ªV¥"DI"©`ze¿twâ¿¿¿¿e¿i`u bUs6,8)/2ªUf"GN" ©"<>+=$#%"g`¤grp¤qºnupe`u bV /2 ªUf"T " ©"[]\{}()"g"QSUCAP"bUg6) ªUf" M" ©"!\"?"g"COE"bUg2) ªV¥"CO"©",:@"g"ANE"bUg4) ª" &'*-./\\;~^`_|"g`spaµp¿豢¿Èögrlove`u bV /2

每个¿代表一个不可打印的Unicode字符。在线尝试!

取消高尔夫:

V=Us0,2;Ug21 ||U<'R&&Ug19 v ||V=="DI"&&"zeontwthfofisiseeini"u bUs6,8)/2||Uf"GN" &&"<>+=$#%"g"legrpleqdonupe"u bV /2 ||Uf"T " &&"[]\{}()"g"QSUCAP"bUg6) ||Uf" M" &&"!\"?"g"COE"bUg2) ||V=="CO"&&",:@"g"ANE"bUg4) ||" &'*-./\\;~^`_|"g"spamapashyfusoreseticigrlove"u bV /2

这真的很有趣。我将字符名称分为几个大块:

0.取前两个字母

V=Us0,2;将变量设置为输入字符串V的前两个字母U。稍后将派上用场。

1.大写字母

这是最简单的:大写字母是唯一在第21位具有字符的字母,而这些字符恰好都是正确的字母和大小写。这样Ug21就足够了。

2.小​​写字母

另一个相当容易的 19位有一个字符唯一的其他名字RIGHT SQUARE BRACKET,所以我们检查,如果名称是来之前RU<'R,那么如果是(&&),我们采取与19字符Ug19,并投它为小写v

3.数字

这些名称都以DI(但幸运的是没有V=="DI"一个)开头,因此,如果,我们可以将其转换为数字。某些数字名称的首字母相同,但前两个字母已足够。将它们组合成一个字符串,我们得到ZEONTWTHFOFISISEEINI。现在,我们可以b将数字名称中前两个字符的索引与Us6,8)并除以2。

4。 SIGN

有七个名称,其中包含SIGN

<    LESS-THAN SIGN
>    GREATER-THAN SIGN
+    PLUS SIGN
=    EQUALS SIGN
$    DOLLAR SIGN
#    NUMBER SIGN
%    PERCENT SIGN

首先,我们检查名称中是否包含单词SIGN。事实证明GN是足够的。Uf"GN"返回GN名称中的所有实例,即null如果它包含0个实例,则被跳过。

现在,使用与数字相同的技术,将前两个字母合并为一个字符串LEGRPLEQDONUPE,然后获取索引并除以二。这将产生一个数字0-6,我们可以使用该数字从字符串中获取相应的字符<>+=$#%

5, MARK

三个字符包含MARK

!    EXCLAMATION MARK
"    QUOTATION MARK
?    QUESTION MARK

在这里,我们使用与相同的技术SIGN M足以区分这三个。为了转换为符号,这次检查一个字母就足够了:位置3的字符对于所有三个字符都是不同的。这意味着选择正确的字符时,我们不必除以二。

6。 LEFT/RIGHT

该组包含方括号和括号[]{}()。这将是非常复杂的,以同时捕获LEFTRIGHT,但幸运的是,它们都包含字符串。我们使用与相同的技术进行检查SIGN。要转换为符号,如和一样MARK,检查一个字母就足够了;位置6的字符对于所有六个字符都是唯一的。

7。 CO

其余字符非常独特,但不够独特。其中三个入手COCOMMACOLON,和COMMERCIAL AT。我们使用完全相同的技术,因为我们没有与支架的基础上,在第4位的字符选择适当的符号(ANE)。

8.其他一切

到目前为止,每个名称的前两个字符都不同。我们将它们全部组合成一个大字符串,SPAMAPASHYFUSORESETICIGRLOVE并将每对映射到其对应的char中 &'*-./\;~^`_|

9.最后步骤

每个部分都返回一个空字符串,或者null如果它不是正确的字符串,那么我们可以使用左右将它们链接起来||。该||运算符返回左边的参数,如果它的truthy,否则正确的说法。Japt还具有隐式输出,因此无论结果如何,它都会自动发送到输出框。

欢迎提出问题,意见和建议!


好的答案和好的解释。但是您忘了在解释中提及处理或MARK(!?“)
edc65

@ edc65糟糕,谢谢!我在MARK字符部分添加了内容。
ETHproductions 2015年

7
spamapashyfusoreseticigrlove= 垃圾邮件,让如此冰冷的女孩爱
重生

不,那仍然是打高尔夫球。
Blacklight Shining

3

Python 2,237字节

获取字符串的哈希值,并将其模除以535。随后将其转换为具有该数字的Unicode字符。Unicode字符在预编译的Unicode字符列表中的位置随后转换为ASCII字符。

print chr(u"""ǶŀȎdȊÏöǖIhȏƜǓDZǠƣƚdžƩC+ĶÅĠěóƋŎªƱijůŰűŪūŬŭŶŷŸŹŲųŴŵžſƀƁźŻżŽƆƇƈŖÐŗǀǼǿǾǹǸǻǺȅȄȇȆȁȀȃȂǭǬǯǮǩǨǫǪǵǴǷNȌ~B""".index(unichr(hash(raw_input())%535))+32)

3

JavaScript中,501个 499 469 465 451 430字节

a=prompt();c="5SACEgEARKeQARKbNIGNbDIGNcPIGN9AANDaAPHEgLSIShRSIS8AISK9PIGN5CMMAcHNUS9FTOP7SDUSaDERO9DONE9DTWObDREEaDOURaDIVE9DSIXbDVENbDGHTaDINE5CLON9SLONeLIGNbEIGNhGIGNdQARKdC ATjLKETfRDUSkRKEThCENT8LINEcGENTiLKETdVINEjRKET5TLDE".match(/.{5}/g).indexOf(a.length.toString(36)+a[0]+a.slice(-3));if(c>=33)c+=26;if(c>=65)c+=26;alert(a.length==20&&a[0]=="L"?a.slice(-1).toLowerCase():a.length>21?a.slice(-1):String.fromCharCode(32+c))

说明:

该长字符串是压缩列表。a.length.toString(36)+a[0]+a.slice(-3)确定字符串(如果有)将如何在列表中表示。另外,字母的特殊逻辑。(顺便说一下,带字符串,a[0]是的内置简写a.charAt(0)形式)


如果替换_+,则可以使用Base64压缩列表。
ETHproductions 2015年

@ETHproductions base64使事情变,而不是变短。
Blacklight Shining 2015年

@ETHproductions Javascript是否具有 Base64?
SuperJedi224 2015年

@ SuperJedi224是的,但是Blacklight是正确的,除非基数64替换了可能用较低基数表示的数字,尤其是二进制数。
wedstrom

您可以使用btoa("abc")压缩25%的文本(只要它是有效的base-64文本,用替换后就可以_-),然后再压缩atob("compressed stuff")您的实际代码中。
ETHproductions 2015年

1

PowerShell中,603个 547 464字节

$a=-split$args
$b=switch -W($a[0]){
"LEFT"{switch -w($a[1]){"C*"{"{"}"P*"{"("}"S*"{"["}}}
"RI*"{switch -w($a[1]){"C*"{"}"}"P*"{")"}"S*"{"]"}}}
"LA*"{("$($a[3])".ToLower(),$a[3])[$a[1]-like"C*"]}
"DI*"{@{ONE=1;TWO=2;THREE=3;FOUR=4;FIVE=5;SIX=6;SEVEN=7;EIGHT=8;NINE=9;ZERO="0"}[$a[1]]}
"COMME*"{"@"}
"APO*"{"'"}
}
$c='COM,LES<GRA`GRE>QUE?QUO"COL:REV\LOW_EXC!EQU=DOL$AMP&AST*PER%PLU+SEM;SOL/SPA CIR^HYP-FUL.NUM#TIL~VER|'
($b,$c[$c.IndexOf($a[0][0..2]-join'')+3])[!$b]

(与LineFeed计数相同的一个字节;,因此为了便于阅读,我会留点中断)

编辑1-从switch语句中提取了许多元素,而是填充了用于查找的哈希表。

编辑2-哦,是的。。。索引到一个字符串中,就是这样。

本质上是接受输入,将其分割成空格,然后switch对第一个单词进行通配符过滤以过滤出愚蠢的输入。将该结果设置为$b。如果$b不存在,则字符串$c将在第一个单词的前三个字母上求值并在紧随其后的位置输出字符,否则输出$b

一些技巧包括LATIN CAPITAL LETTER R根据第二个单词是否为索引到数组CAPITAL并输出相应的大写/小写字母的技巧。另一个“技巧”是DIGIT通过索引到哈希表来实现的。请注意,在此处执行相同的将索引插入字符串的技巧并不短(实际上要长一个字节)。


我又打你了
SuperJedi224 2015年

1

JavaScript中,416个 411 389字节

l=(E)=>{return E=E.replace(/LA.*N|BR.*T|SIGN|MARK| |TION/g,"").replace(/(.).*(.{3})/,"$1$2"),E.match("CER")?E[3]:E.match("SER")?E[3].toLowerCase():(a="SACE EAMA!QOTA\"NBER#DLAR$PENT%AAND&APHE'AISK*PLUS+CMMA,HNUS-FTOP.SDUS/CLON:SLON;LHAN<EALS=GHAN>QUES?CLAT@RDUS\\CENT^LINE_GENT`VINE|LSIS(RSIS)LARE[RARE]LRLY{RRLY}TLDE~DERO0DONE1DTWO2DREE3DOUR4DIVE5DSIX6DVEN7DGHT8DINE9",a[a.indexOf(E)+4])}

这是一种更具可读性的格式(稍后会有解释):

function l(k){
    k=k.replace(/LA.*N|BR.*T|SIGN|MARK| |TION/g,'').replace(/(.).*(.{3})/,'$1$2')
    if(k.match('CER')) return k[3];
    if(k.match('SER')) return k[3].toLowerCase();
    a="SACE EAMA!QOTA\"NBER#DLAR$PENT%AAND&APHE'AISK*PLUS+CMMA,HNUS-FTOP.SDUS/CLON:SLON;LHAN<EALS=GHAN>QUES?CLAT@RDUS\\CENT^LINE_GENT`VINE|LSIS(RSIS)LARE[RARE]LRLY{RRLY}TLDE~DERO0DONE1DTWO2DREE3DOUR4DIVE5DSIX6DVEN7DGHT8DINE9"
    return a[a.indexOf(k)+4];
}

从组合键和值字符串中减去5个字节。

说明:第一行的正则表达式将输入简化为唯一的4个字符的键。请注意,只有在挑战中指定的特定名称集才能保证唯一性,对于普通英语而言,重复项非常常见!即使面对这个挑战,我也必须删除方括号和符号之类的常用词才能获得唯一的集合。

要返回该字符,我通过检查字符串“ SER”和“ cer”来检查它是否是拉丁字符,并返回输入的最后一个字符(对于ser为小写)。

对于其他所有内容,我指的是一个包含所有4个字符键的字符串,后跟正确的字符。然后,我使用indexof和子字符串字符索引来拉出并返回字符。

编辑:使用更多的通配符来减少正则表达式的大小,用字符索引替换substr并削减了另外20个字符。规则制定者会注意到,这项最终更新是在挑战结束后发布的,但是我认为这不会改变我的排名。这只是新手的练习。


1

Python 3,148个字节

lambda s:chr(83-b'gfhtg\32}urgx_}3qeo|e~cwu~S~q~I,vqG\34jc}d*9~~_L|p~~~~~JJy'[sum(b'  !" *1! "2;D$# ! # !!( '[ord(c)%25]-32for c in s[:-1])]+ord(s[-1]))

为了方便您查看,我用八进制转义码替换了两个不可打印的字节 \32\34;撤消此操作即可获得148字节功能。

我使用GPerf计算了此哈希函数的一部分


0

Perl 6的 348个   242字节

{
  /NI/??9!!chr 32+
  '0A40W00SV0M20LR0O20IJ0LH0WH0YS0H20ID0A50P10IH0F70K10HF0I30LL0JX0JF0HX0LU0LE0JF0AJ0IX0RK0M40XF0QR0PD15Z16016116216316416516616716816916A16B16C16D16E16F16G16H16I16J16K16L16M16N16O1140V313F0XS0FU0N712A12B12C12D12E12F12G12H12I12J12K12L12M12N12O12P12Q12R12S12T12U12V12W12X12Y12Z0ZA0PU11L0AA'
  .comb(3).map({:36($_)}).first(:k,[+] .ords)
} # 348

{chr 32+"\x95ǐǠŬšƉĘŗȌȴĎĽ\x96ŖŁöģěĈśŊčĂĹŔĸ¤ĦƱŮȃƿƍʶʷʸʹʺʻʼʽʾʿˀˁ˂˃˄˅ˆˇˈˉˊʠʡʢʣʤɝǚʅǥâĿʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛɱɲɳɴɵțųɃ\x9b".ords.first: :k,[+] .ords.map(*%43)}
{
  chr 32+
  "\x95ǐǠŬšƉĘŗȌȴĎĽ\x96ŖŁöģěĈśŊčĂĹŔĸ¤ĦƱŮȃƿƍʶʷʸʹʺʻʼʽʾʿˀˁ˂˃˄˅ˆˇˈˉˊʠʡʢʣʤɝǚʅǥâĿʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛɱɲɳɴɵțųɃ\x9b"
  .ords.first: :k,[+] .ords.map(*%43)
}

用法:

my &code = {...}

# testing
my $test = [~] (' '..'~')».uniname».&code;
my $comparison = [~] ' '..'~';
say $test eq $comparison; # True

say code 'HYPHEN-MINUS'; # -
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.