기본 라틴 문자 이름을 문자로


23

기본으로 돌아가 봅시다!

  • 완전한 프로그램 또는 기능인 코드는 인쇄 가능한 기본 라틴 문자의 공식 유니 코드 이름을 해당 문자로 변환해야합니다. 예를 들어, 입력 LOW LINE의 경우 코드가 출력되어야합니다 _.
  • 하나의 문자 이름 만 입력하면됩니다.
  • 내장 함수 또는 기타 방식으로 기존 함수 또는 라이브러리를 사용할 수 없습니다.이 함수는 유니 코드 문자 이름 (예 : 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출력 ::또는 정의되지 않은 동작을 수행해야합니까?
Kevin W.

명확히하기 위해 편집했습니다.
Luke

String.fromCharCode금지되어 있습니까?
SuperJedi224

나는 그 기능이 무엇인지 오해했다.
Luke

우리는 어떻게 잘못된 입력을 처리해야 CLON합니까?
edc65

답변:


25

IA-32 머신 코드, 161 160 122 바이트

코드의 16 진 덤프 :

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 레지스터를 사용하여 작업을 수행 할 관리 eax, ecx, edx, 사방에서 공격 할 수있는 - 그래서 저장하고 레지스터를 복원 할 필요가 없다
  • 해시 테이블을 디코딩 할 때 사용 al하고 ah신중하게되므로 정확한 위치에 있음을 ah0으로 감소되고, 전체 eax레지스터 LUT는 인덱스로서 사용될 수있다

18

자바 스크립트 ES6, 228 236 247 257 267 274 287

참고 : 7 문자는 thx @ 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 yes, 그러나 여기서는 LAT, RIG 및 LEF를 관리하고 2 문자는 너무 적어서 LEFT 및 LESS가 있습니다.
edc65

오 방금 훑어보고 RIG / LEF 부분을 보지 못했습니다.
ev3commander

두 번째 @ ev3commander는 당신이 요점을 생각했습니다! LESS와 LEFT를 병합하여 4 바이트를 절약 할 수 있습니다. Thx
edc65

10

apt , 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

각각 ¿은 인쇄 할 수없는 유니 코드 문자를 나타냅니다. 온라인으로 사용해보십시오!

언 골프 드 :

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;변수 VU입력 문자열 의 첫 두 글자로 설정 합니다. 이것은 나중에 유용 할 것입니다.

1. 대문자

이것은 가장 쉬운 방법입니다. 대문자는 위치 21에 문자가있는 유일한 문자이며 모두 올바른 문자와 대소 문자입니다. 따라서 Ug21충분하다.

2. 소문자

또 다른 쉬운 일; 위치 19에 문자가있는 유일한 다른 이름은RIGHT SQUARE BRACKET 이름이 경우 우리가 전에 온다 확인할 수 있도록, R함께 U<'R그것이 다음 경우에 (, &&), 우리는 함께 19 숯을 Ug19하고와 소문자로 캐스팅 v.

3. 숫자

이 이름들은 모두 DI 하고 다행스럽게도 다른 하지 않으므로이면 V=="DI"숫자로 바꿀 수 있습니다. 일부 숫자 이름의 첫 글자는 동일하지만 처음 두 글자이면 충분합니다. 이것들을 하나의 문자열로 결합하면 얻을 수 ZEONTWTHFOFISISEEINI있습니다. 이제 우리는 b숫자의 이름에서 처음 두 문자 의 색인 을 가지고 2로 Us6,8)나눌 수 있습니다.

4. SIGN

포함하는 7 개의 이름이 있습니다 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 다음 인덱스를 가져 와서 2로 나눕니다. 이것에 의해 숫자가 나오고 0-6, 문자열에서 해당 문자를 가져 오는 데 사용할 수 있습니다 <>+=$#%.

5. MARK

다음을 포함하는 세 문자가 있습니다 MARK.

!    EXCLAMATION MARK
"    QUOTATION MARK
?    QUESTION MARK

여기서와 같은 기술을 사용 SIGN합니다. M이 세 가지를 다른 것들과 구별하기에 충분합니다. 기호로 변환하려면 이번에는 한 문자 만 검사하면 충분합니다. 위치 2의 문자는 세 문자 모두에서 다릅니다. 이것은 올바른 캐릭터를 선택할 때 2로 나눌 필요가 없다는 것을 의미합니다.

6. LEFT/RIGHT

이 그룹에는 괄호와 괄호가 []{}()있습니다. 정말 모두를 캡처 복잡 할 것입니다 LEFTRIGHT하지만, 다행히 그들은 모두 문자열을 포함 . 우리는 우리가했던 것과 같은 기술로 이것을 확인합니다 SIGN. 와 같이 기호로 변환하려면 MARK한 글자를 검사하면 충분합니다. 위치 6의 캐릭터는 6 개 모두에 고유합니다.

7. CO

나머지 문자는 꽤 독특하지만 충분히 독특하지는 않습니다. 그 중 세 가지로 시작 CO: COMMA, COLON,와 COMMERCIAL AT. 우리가 4 위치에있는 문자에 따라 적절한 기호를 선택, 괄호했던 것처럼 우리는 정확히 같은 기술을 사용 ( A, N또는 E).

8. 그 밖의 모든 것

이제 처음 두 문자는 이름마다 다릅니다. 우리는 그것들을 모두 하나의 큰 문자열로 결합하고 SPAMAPASHYFUSORESETICIGRLOVE각 쌍을 해당 문자에 매핑합니다 &'*-./\;~^`_| .

9. 마지막 단계

각 부분은 빈 문자열을 반환하거나 null올바른 문자열 이 아닌 경우 왼쪽에서 오른쪽으로 모두 연결할 수 있습니다 ||. ||연산자는 왼쪽 인자 그것의 truthy 경우, 그렇지 않으면 오른쪽 인자를 반환합니다. Japt는 또한 암시 적 출력을 가지므로 결과가 무엇이든 자동으로 출력 상자로 전송됩니다.

질문, 의견 및 제안을 환영합니다!


훌륭한 답변과 훌륭한 설명. 그러나 당신은 설명에서 처리 또는 마크 (!? ")를 언급하는 것을 잊었다
edc65

감사합니다! MARKchars에 섹션을 추가했습니다 .
ETHproductions

7
spamapashyfusoreseticigrlove= 스팸 pashy 그래서 다시 얼음 소녀의 사랑 ... +1
AdmBorkBork

아뇨, 여전히 골프입니다.
Blacklight Shining

3

파이썬 2, 237 바이트

문자열의 해시를 가져와 모듈로 535로 나눕니다. 그런 다음 해당 숫자의 유니 코드 문자로 변환하십시오. 미리 컴파일 된 유니 코드 문자 목록에서 유니 코드 문자의 위치는 이후 ASCII 문자로 변환됩니다.

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

3

자바 스크립트, 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

@ETHproductions base64는 짧은 것이 아니라 더 길게 만듭니다 .
Blacklight Shining

@ETHproductions Javascript Base64가 있습니까?
SuperJedi224

@ SuperJedi224 그렇습니다. 그러나 기본 64가 하위 2 진수, 특히 2 진수로 표현 될 수있는 숫자를 대체하지 않는 한 Blacklight는 정확합니다.
wedstrom

당신은 사용할 수 있습니다 btoa("abc")(한 그것이 교체 한 후 것 유효한베이스 (64) 텍스트와 같이 25 % 압축 텍스트 _-다음) atob("compressed stuff")실제 코드.
ETHproductions

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 바이트를 센다; 되므로 읽기 쉽도록 나누기를 남겨 둡니다)

편집 1-switch 문에서 많은 요소를 가져오고 대신 조회를 위해 해시 테이블을 채웠습니다.

편집 2-오 예 ... 문자열로 인덱싱하는 방법입니다 ...

기본적으로 입력을 가져 와서 공백으로 나누고 switch첫 단어에서 와일드 카드 를 수행하여 구피 단어를 필터링합니다. 결과를로 설정합니다 $b. 경우 $b존재하지 않는, 문자열 $c, 그렇지 않으면 우리의 출력을 첫 번째 단어의 첫 세 글자 평가하고 바로 다음 문자를 출력됩니다 $b.

일부 트릭에는 LATIN CAPITAL LETTER R 두 번째 단어가인지 여부에 따라 배열로 색인을 생성 CAPITAL하고 해당 대문자 / 소문자를 출력합니다. 다른 "트릭"은 DIGIT해시 테이블에 색인을 작성 하여 s를위한 것입니다. 여기서 동일한 문자열 인덱스 인덱스 트릭을 수행하는 것이 더 짧지는 않습니다 (실제로 1 바이트 더 길다).


또 널 때리고있어
SuperJedi224

1

자바 스크립트, 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

파이썬 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]))

시청의 편의를 위해, 나는 8 진수 이스케이프 코드 두 인쇄 할 수없는 바이트 교체했습니다 \32\34; 이것을 취소하면 148 바이트 함수를 얻을 수 있습니다.

이 해시 함수의 일부를 GPerf로 했습니다 .


0

펄 6 ,  348242   바이트

{
  /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'; # -
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.