Tên nhân vật Latin cơ bản cho nhân vật


23

Hãy quay trở lại vấn đề cơ bản!

  • Mã của bạn, một chương trình hoặc chức năng hoàn chỉnh, phải chuyển đổi tên Unicode chính thức của ký tự Latin cơ bản có thể in thành ký tự tương ứng. Ví dụ, đối với đầu vào, LOW LINEmã của bạn phải xuất ra _.
  • Bạn chỉ cần lấy một tên nhân vật làm đầu vào.
  • Bạn không thể sử dụng bất kỳ chức năng hoặc thư viện có sẵn nào, tích hợp sẵn hoặc nói cách khác, cung cấp bất kỳ logic nào liên quan cụ thể đến tên ký tự Unicode (ví dụ: Python unicodedata, Java Character.getName, v.v.)
  • Đối với đầu vào không phải là một trong những tên này, mọi hành vi đều được chấp nhận.

Đây là mã golf: mã ngắn nhất tính bằng byte thắng.

Để tránh bất kỳ sự mơ hồ nào, đây là tập hợp đầy đủ các tên nhân vật chính thức mà chúng tôi sẽ sử dụng (mượn từ câu hỏi này ):

     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
Có phải chương trình chỉ cần xử lý một tên nhân vật? Ví dụ, nên COLON COLONxuất ra ::, hoặc hành vi không xác định?
Kevin W.

Chỉnh sửa để làm rõ.
Lu-ca

Tại sao String.fromCharCodebị cấm?
SuperJedi224

Rất tiếc, tôi đã hiểu nhầm chức năng đó làm gì.
Lu-ca

Làm thế nào chúng ta phải xử lý đầu vào không hợp lệ, như thế CLONnào?
edc65

Câu trả lời:


25

Mã máy IA-32, 161 160 122 byte

Mã thập phân của mã:

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

Mã này sử dụng một số băm. Bằng một số tìm kiếm brute-force, tôi thấy rằng hàm băm sau có thể được áp dụng cho các byte của chuỗi đầu vào:

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

Nó nhân với x89, thêm byte kế tiếp (mã ASCII) và lấy modulo còn lại 113. Nó thực hiện điều này trên tất cả các byte của chuỗi đầu vào trừ cái cuối cùng, ví dụ LATIN CAPITAL LETTER A, và LATIN CAPITAL LETTER Xđưa ra cùng mã băm.

Hàm băm này không có xung đột và đầu ra nằm trong phạm vi 0 ... 113 (thực sự, may mắn thay, phạm vi thậm chí còn hẹp hơn: 3 ... 108).

Các giá trị băm của tất cả các chuỗi có liên quan không lấp đầy không gian đó, vì vậy tôi quyết định sử dụng giá trị này để nén bảng băm. Tôi đã thêm một bảng "bỏ qua" (112 bit), chứa 0 nếu vị trí tương ứng trong bảng băm trống và 1 nếu không. Bảng này chuyển đổi giá trị băm thành chỉ mục "nén", có thể được sử dụng để giải quyết LUT dày đặc.

Các chuỗi LATIN CAPITAL LETTERLATIN SMALL LETTERđưa ra mã băm 52 và 26; chúng được xử lý riêng. Đây là một mã C cho điều đó:

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];
}

Mã ngôn ngữ lắp ráp tương ứng (cú pháp lắp ráp nội tuyến 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;
    }
}

Một số chi tiết thực hiện đáng chú ý:

  • Nó sử dụng một CALLlệnh để lấy một con trỏ tới mã, nơi bảng mã hóa cứng nằm. Trong chế độ 64 bit, nó có thể sử dụng thanh ghi ripthay thế.
  • Nó sử dụng BThướng dẫn để truy cập bảng bỏ qua
  • Nó quản lý để làm công việc chỉ sử dụng 3 thanh ghi eax, ecx, edx, có thể được clobbered - vì vậy không có cần phải lưu và khôi phục thanh ghi
  • Khi giải mã bảng băm, nó sử dụng alahcẩn thận, để tại đúng vị trí ahđược giảm xuống 0 và toàn bộ eaxthanh ghi có thể được sử dụng làm chỉ số LUT

18

JavaScript ES6, 228 236 247 256 267 274 287

Lưu ý: 7 ký tự đã lưu thx @ ev3commander

Lưu ý 2: tốt hơn JAPT sau 7 lần chỉnh sửa chính,

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()

Chạy đoạn trích để kiểm tra

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
Chỉ là ... bằng cách nào? Làm tốt.
SuperJedi224

Trên thực tế, ngoài bảng chữ cái, không có char bắt đầu bằng "LA"
ev3commander 8/12/2015

@ ev3commander có, nhưng ở đây tôi quản lý LAT, RIG và LEF và 2 ký tự dường như quá ít, có TRÁI và
BÀI

Ồ Tôi chỉ lướt qua và không thấy phần RIG / LEF.
ev3commander 8/12/2015

@ ev3commander vào thứ hai nghĩ rằng bạn có một điểm! Tôi có thể hợp nhất xử lý LESS và LEFT và lưu 4 byte. Thx
edc65

10

Japt , 230 byte

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

Mỗi ¿đại diện cho một char Unicode không thể in được. Hãy thử trực tuyến!

Ung dung:

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

Điều này thực sự thú vị. Tôi đã chia tên nhân vật thành nhiều phần lớn:

0. Lấy hai chữ cái đầu tiên

V=Us0,2;đặt biến Vthành hai chữ cái đầu tiên của Uchuỗi đầu vào. Điều này sẽ có ích sau này.

1. Chữ in hoa

Đây là cách dễ nhất: chữ in hoa là chữ cái duy nhất có ký tự ở vị trí 21, tất cả đều là chữ cái và chữ hoa chính xác. Như vậy, Ug21là đủ.

2. Chữ thường

Một cái khác khá dễ; chỉ tên khác mà có một nhân vật ở vị trí 19 là RIGHT SQUARE BRACKET, vì vậy chúng tôi kiểm tra xem tên của nó là đi trước Rvới U<'R, sau đó nếu nó là ( &&), chúng ta lấy char 19 với Ug19và đúc nó thành chữ thường với v.

3. Chữ số

Những cái tên này đều bắt đầu bằng DI(và may mắn thay, không ai trong số những cái tên khác), vì vậy V=="DI", nếu , chúng ta có thể biến nó thành một chữ số. Các chữ cái đầu tiên của một số tên của các chữ số là giống nhau, nhưng hai chữ cái đầu tiên là đủ. Kết hợp những điều này thành một chuỗi, chúng tôi nhận được ZEONTWTHFOFISISEEINI. Bây giờ chúng ta chỉ có thể lấy chỉ mục bcủa hai ký tự đầu tiên trong tên của chữ số Us6,8)và chia cho hai.

4. SIGN

Có bảy tên chứa SIGN:

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

Đầu tiên chúng ta kiểm tra xem nó có chứa từ đó không SIGN. Hóa ra GNlà đủ; Uf"GN"trả về tất cả các thể hiện của GNtên, nullnếu nó chứa 0 thể hiện và do đó bị bỏ qua.

Bây giờ, sử dụng kỹ thuật tương tự như với các chữ số, chúng tôi kết hợp hai chữ cái đầu tiên thành một chuỗi LEGRPLEQDONUPE, sau đó lấy chỉ mục và chia cho hai. Điều này dẫn đến một số từ 0-6, mà chúng ta có thể sử dụng để lấy ký tự tương ứng từ chuỗi <>+=$#%.

5. MARK

Có ba ký tự chứa MARK:

!    EXCLAMATION MARK
"    QUOTATION MARK
?    QUESTION MARK

Ở đây chúng tôi sử dụng kỹ thuật tương tự như với SIGN.  Mlà đủ để phân biệt ba người này với những người khác. Để dịch sang một ký hiệu, lần này kiểm tra một chữ cái là đủ: ký tự ở vị trí 2 là khác nhau cho cả ba ký tự. Điều này có nghĩa là chúng ta không phải chia hai khi chọn đúng ký tự.

6. LEFT/RIGHT

Nhóm này chứa dấu ngoặc và ngoặc đơn , []{}(). Sẽ rất phức tạp khi chụp cả hai LEFTRIGHT, nhưng may mắn thay, tất cả chúng đều chứa chuỗi . Chúng tôi kiểm tra điều này với kỹ thuật tương tự như chúng tôi đã làm với SIGN. Để dịch sang một ký hiệu, như với MARK, kiểm tra một chữ cái là đủ; nhân vật ở vị trí 6 là duy nhất cho cả sáu.

7. CO

Phần còn lại của ký tự là khá độc đáo, nhưng không đủ độc đáo. Ba trong số họ bắt đầu với CO: COMMA, COLON, và COMMERCIAL AT. Chúng tôi sử dụng chính xác các kỹ thuật tương tự như chúng ta đã làm với các dấu ngoặc, việc lựa chọn các biểu tượng thích hợp dựa trên các nhân vật ở vị trí thứ 4 ( A, Nhoặc E).

8. Mọi thứ khác

Đến bây giờ, hai ký tự đầu tiên khác nhau cho mỗi tên. Chúng tôi kết hợp tất cả chúng thành một chuỗi lớn SPAMAPASHYFUSORESETICIGRLOVEvà ánh xạ từng cặp vào char tương ứng của nó  &'*-./\;~^`_|.

9. Bước cuối cùng

Mỗi phần trả về một chuỗi rỗng hoặc nullnếu đó không phải là một chuỗi chính xác, vì vậy chúng ta có thể liên kết tất cả chúng từ trái sang phải với ||. Các ||nhà điều hành trả về đối số bên trái nếu nó truthy, và lập luận đúng bằng cách khác. Japt cũng có đầu ra ngầm định, vì vậy dù kết quả thế nào, nó sẽ tự động được gửi đến hộp đầu ra.

Câu hỏi, ý kiến, và đề nghị chào mừng!


Câu trả lời tuyệt vời và lời giải thích tuyệt vời. Nhưng bạn đã quên đề cập đến việc xử lý hoặc đánh dấu (!? ") Trong phần giải thích
edc65

@ edc65 Rất tiếc, cảm ơn! Tôi đã thêm vào một phần trên MARKký tự.
Sản xuất ETH

7
spamapashyfusoreseticigrlove= Spam một pashy để thiết lập lại tình yêu cô gái băng giá ... +1
admBorkBork 8/12/2015

Không, đó vẫn là rất nhiều golf.
Blacklight Shining

3

Python 2, 237 byte

Lấy hàm băm của chuỗi và modulo chia nó cho 535. Sau đó chuyển đổi nó thành một ký tự unicode với số đó. Vị trí của ký tự unicode trong danh sách được biên dịch trước của các ký tự unicode sau đó được chuyển đổi thành ký tự 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 byte

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))

Giải trình:

Chuỗi dài đó là một danh sách nén. a.length.toString(36)+a[0]+a.slice(-3)xác định làm thế nào, nếu có, chuỗi sẽ được trình bày trong danh sách. Ngoài ra, logic đặc biệt cho các chữ cái. (với các chuỗi, a[0]là một tốc ký dựng sẵn cho a.charAt(0), nhân tiện)


Nếu bạn thay thế _bằng +, bạn có thể nén Base64.
Sản xuất ETH

@ETHproductions base64 làm cho mọi thứ dài hơn , không ngắn hơn.
Blacklight Shining

@ETHproductions Javascript Base64 không?
SuperJedi224

@ SuperJedi224 Đúng vậy, nhưng Blacklight là chính xác trừ khi cơ sở 64 đang thay thế một số có thể được thể hiện ở cơ sở thấp hơn, đặc biệt là nhị phân.
wedstrom 8/12/2015

Bạn có thể sử dụng btoa("abc")để nén văn bản 25% (miễn là văn bản cơ sở 64 hợp lệ, sẽ là sau khi thay thế _bằng -), sau đó atob("compressed stuff")trong mã thực tế của bạn.
ETHproductions 8/12/2015

1

PowerShell, 603 547 464 byte

$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]

( LineFeedtính một byte giống như ;vậy, vì vậy tôi sẽ nghỉ giải lao để dễ đọc)

Chỉnh sửa 1 - Lấy nhiều yếu tố ra khỏi câu lệnh chuyển đổi và thay vào đó, điền vào hàm băm để tra cứu.

Chỉnh sửa 2 - Oh yeah ... lập chỉ mục thành một chuỗi, đó là cách để đi ...

Về cơ bản lấy đầu vào, phân tách nó trên các khoảng trắng và thực hiện ký tự đại diện switchtrên từ đầu tiên để lọc ra các từ ngớ ngẩn. Đặt kết quả của điều đó thành $b. Nếu $bkhông tồn tại, chuỗi $cđược đánh giá trên ba chữ cái đầu tiên của từ đầu tiên và xuất ký tự ngay sau đó, nếu không chúng ta xuất ra $b.

Một số thủ thuật bao gồm LATIN CAPITAL LETTER Rchỉ mục nào thành một mảng dựa trên việc từ thứ hai là CAPITALvà xuất ra chữ hoa / chữ thường tương ứng. "Bí quyết" khác là dành cho DIGITs, bằng cách lập chỉ mục thành một hashtable. Lưu ý rằng không ngắn hơn để thực hiện thủ thuật lập chỉ mục tương tự ở đây (nó thực sự dài hơn một byte).


Tôi lại đánh bạn.
SuperJedi224

1

Javascript, 416 411 389 byte

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])}

Đây là một định dạng dễ đọc hơn (giải thích đến sau):

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];
}

Trừ 5 byte từ việc kết hợp các chuỗi khóa và giá trị.

Giải thích: Các biểu thức chính quy trên dòng đầu tiên giảm đầu vào thành các phím 4 ký tự duy nhất. Lưu ý rằng tính duy nhất chỉ được đảm bảo cho nhóm tên cụ thể được chỉ định trong thử thách và các bản sao sẽ rất phổ biến đối với tiếng Anh thông thường! Ngay cả đối với thử thách này, tôi đã phải loại bỏ các từ phổ biến như ngoặc và ký để có được một bộ duy nhất.

Để trả về ký tự, tôi kiểm tra xem đó có phải là ký tự Latin hay không bằng cách kiểm tra các chuỗi "SER" và "cer" và trả lại ký tự cuối cùng của đầu vào, viết thường cho ser.

Đối với mọi thứ khác, tôi đề cập đến một chuỗi chứa tất cả 4 phím ký tự, theo sau là ký tự chính xác. Sau đó tôi sử dụng các chỉ mục ký tự chuỗi conchuỗi con để kéo và trả về ký tự.

Chỉnh sửa: Được sử dụng nhiều ký tự đại diện hơn để giảm kích thước regex, thay thế chất nền bằng các chỉ số ký tự và loại bỏ hai mươi ký tự chống lại. Người theo quy tắc sẽ lưu ý rằng bản cập nhật cuối cùng này được đăng sau khi thử thách kết thúc, tuy nhiên tôi không nghĩ nó đã thay đổi thứ hạng của mình. Đây chỉ là thực hành cho một người mới.


1

Python 3, 148 byte

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]))

Để thuận tiện cho bạn xem, tôi đã thay thế hai byte không in được bằng mã thoát bát phân \32\34; hoàn tác điều này để có được chức năng 148 byte.

Tôi đã tính các phần của hàm băm này với GPerf .


0

Perl 6 ,  348   242 byte

{
  /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)
}

sử dụng:

my &code = {...}

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

say code 'HYPHEN-MINUS'; # -
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.