ชื่ออักขระละตินพื้นฐานเป็นอักขระ


23

กลับไปสู่พื้นฐาน!

  • รหัสของคุณโปรแกรมหรือฟังก์ชั่นที่สมบูรณ์จะต้องแปลงชื่อ Unicode อย่างเป็นทางการของอักขระ Basic Latin ที่พิมพ์ได้ไปเป็นอักขระที่เกี่ยวข้อง ตัวอย่างเช่นสำหรับการป้อนข้อมูลของคุณเอาท์พุทรหัสต้องLOW LINE_
  • คุณจะต้องใช้ชื่ออักขระเดียวเป็นอินพุต
  • คุณไม่สามารถใช้ฟังก์ชันหรือไลบรารีที่มีอยู่แล้วใด ๆ มีอยู่แล้วภายในหรืออย่างอื่นซึ่งมีเหตุผลใด ๆ ที่เกี่ยวข้องกับชื่ออักขระ Unicode โดยเฉพาะ (เช่น Python unicodedata, Java's 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.

แก้ไขเพื่อชี้แจง
ลุค

ทำไมString.fromCharCodeต้องห้าม?
SuperJedi224

อ๊ะฉันเข้าใจผิดว่าฟังก์ชั่นนั้นทำอะไร
ลุค

เราต้องจัดการกับอินพุตที่ไม่ถูกต้องCLONอย่างไร
edc65

คำตอบ:


25

รหัสเครื่อง IA-32, 161 160 122 ไบต์

Hexdump ของรหัส:

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

รหัสนี้ใช้การแปลงแป้นพิมพ์บางอย่าง จากการค้นหาแบบ brute-force ฉันพบว่าฟังก์ชันแฮชต่อไปนี้สามารถใช้กับไบต์ของสตริงอินพุต:

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

มันคูณxด้วย 89 เพิ่มไบต์ถัดไป (รหัส ASCII) และใช้โมดูโลส่วนที่เหลือ 113 มันทำเช่นนี้ในทุกไบต์ของสายป้อนยกเว้นสตริงสุดท้ายดังนั้นเช่นLATIN CAPITAL LETTER AและLATIN CAPITAL LETTER Xให้รหัสแฮชเดียวกัน

ฟังก์ชันแฮชนี้ไม่มีการชนกันและเอาต์พุตอยู่ในช่วง 0 ... 113 (ตามจริงโชคโชคช่วงนั้นแคบกว่า: 3 ... 108)

ค่าแฮชของสตริงทั้งหมดที่เกี่ยวข้องไม่ได้เติมเต็มพื้นที่นั้นอย่างสมบูรณ์ดังนั้นฉันตัดสินใจที่จะใช้สิ่งนี้เพื่อบีบอัดตารางแฮช ฉันเพิ่มตาราง "ข้าม" (112 บิต) ซึ่งมี 0 หากสถานที่ที่เกี่ยวข้องในตารางแฮชว่างเปล่าและ 1 เป็นอย่างอื่น ตารางนี้แปลงค่าแฮชเป็นดัชนี "ที่ถูกบีบอัด" ซึ่งสามารถใช้เพื่อระบุ LUT ที่หนาแน่น

สตริงLATIN CAPITAL LETTERและLATIN 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ซึ่งสามารถ clobbered - ดังนั้นจึงไม่มีความจำเป็นที่จะต้องบันทึกและเรียกคืนการลงทะเบียน
  • เมื่อถอดรหัสตารางแฮชมันจะใช้alและahระมัดระวังเพื่อให้ตำแหน่งที่ถูกต้องahลดลงเป็น 0 และการeaxลงทะเบียนทั้งหมดสามารถใช้เป็นดัชนี LUT

18

JavaScript ES6, 228 236 247 257 267 274 287

หมายเหตุ: 7 ตัวอักษรบันทึก thx @ ev3commander

หมายเหตุ 2: ดีกว่า JAPTหลังจากการแก้ไขหลัก 7 ครั้ง

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 chars ดูเหมือนน้อยเกินไปการมีซ้ายและน้อย
edc65

โอ๋ ฉันเพิ่งอ่านมันและไม่เห็นส่วนของ RIG / LEF
ev3commander

@ ev3 คำสั่งที่สองคิดว่าคุณมีจุด! ฉันสามารถผสานการจัดการน้อยและซ้ายและบันทึก 4 ไบต์ ขอบคุณ
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 ที่ไม่สามารถพิมพ์ได้ ลองออนไลน์!

Ungolfed:

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เพื่อให้เราตรวจสอบว่าชื่อเป็นมาก่อนRด้วยU<'Rแล้วถ้ามันเป็น ( &&) เราใช้ถ่านที่ 19 ด้วยและโยนมันทิ้งตัวพิมพ์เล็กด้วยUg19v

3. ตัวเลข

ชื่อเหล่านี้เริ่มต้นด้วยDI(และโชคดีที่ไม่มีชื่ออื่น) ดังนั้นถ้าV=="DI"เราสามารถเปลี่ยนเป็นตัวเลขได้ ตัวอักษรตัวแรกของชื่อตัวเลขบางตัวเหมือนกัน แต่ตัวอักษรสองตัวแรกนั้นเพียงพอ ZEONTWTHFOFISISEEINIรวมเหล่านี้เป็นสตริงหนึ่งที่เราได้รับ ตอนนี้เราสามารถหาดัชนีbของสองตัวแรกในชื่อของตัวเลขด้วยUs6,8)และหารด้วยสอง

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ก็เพียงพอที่จะแยกความแตกต่างทั้งสามจากคนอื่น ในการแปลเป็นสัญลักษณ์ในครั้งนี้การตรวจสอบตัวอักษรหนึ่งตัวก็เพียงพอแล้ว: ตัวละครที่ตำแหน่ง 2 นั้นแตกต่างกันไปสำหรับตัวละครทั้งสาม ซึ่งหมายความว่าเราไม่ต้องหารสองเมื่อเลือกอักขระที่ถูกต้อง

6 LEFT/RIGHT

กลุ่มนี้มีวงเล็บและวงเล็บ, []{}(). มันจะมีความซับซ้อนมากที่จะจับภาพทั้งLEFTและแต่โชคดีที่พวกเขาทั้งหมดมีสตริงRIGHT เราตรวจสอบเรื่องนี้ด้วยเทคนิคเดียวกับที่เราทำกับ SIGNหากต้องการแปลเป็นสัญลักษณ์เช่นเดียวกับการMARKตรวจสอบจดหมายหนึ่งฉบับก็เพียงพอแล้ว ตัวละครที่ตำแหน่ง 6 นั้นไม่เหมือนใครสำหรับทั้งหก

7 CO

ตัวอักษรที่เหลืออยู่นั้นมีความเป็นเอกลักษณ์ แต่ไม่มากพอ สามของพวกเขาเริ่มต้นด้วยCO: COMMA, และCOLON COMMERCIAL ATเราใช้ตรงเทคนิคเดียวกับที่เราทำกับวงเล็บเลือกสัญลักษณ์ที่เหมาะสมบนพื้นฐานของตัวละครที่ตำแหน่ง 4 ( A, NหรือE)

8. ทุกอย่างอื่น

ถึงตอนนี้อักขระสองตัวแรกจะแตกต่างกันสำหรับทุกชื่อ เรารวมพวกมันทั้งหมดเข้าด้วยกันเป็นสตริงขนาดใหญ่SPAMAPASHYFUSORESETICIGRLOVEและแมปแต่ละคู่เข้ากับอักขระที่ &'*-./\;~^`_|เกี่ยวข้อง

9. ขั้นตอนสุดท้าย

แต่ละชิ้นส่วนจะส่งกลับสตริงที่ว่างเปล่าหรือถ้ามันไม่ได้เป็นที่ถูกต้องเพื่อให้เราสามารถเชื่อมโยงพวกเขาทั้งหมดจากซ้ายไปขวาด้วยnull ผู้ประกอบการส่งกลับอาร์กิวเมนต์ซ้ายถ้ามัน truthy และการโต้แย้งสิทธิอย่างอื่น Japt ยังมีเอาต์พุตโดยปริยายดังนั้นไม่ว่าผลลัพธ์จะถูกส่งไปยังกล่องผลลัพธ์โดยอัตโนมัติ||||

ยินดีต้อนรับคำถามความคิดเห็นและข้อเสนอแนะ!


คำตอบที่ดีและคำอธิบายที่ดี แต่คุณลืมที่จะพูดถึงการจัดการหรือเครื่องหมาย (!? ") ในคำอธิบาย
edc65

@ edc65 อ๊ะขอบคุณ! ฉันได้เพิ่มในส่วนบนMARKตัวอักษร
ETHproductions

7
spamapashyfusoreseticigrlove= สแปมสำหรับ pashy เพื่อรีเซ็ตความรักของหญิงสาวน้ำแข็ง ... +1
AdmBorkBork

ไม่นั่นยังคงเป็นกอล์ฟอยู่มาก
แบล็กไลท์ส่องแสง

3

Python 2, 237 ไบต์

รับแฮชของสตริงและโมดูโลหารด้วย 535 จากนั้นแปลงเป็นอักขระยูนิโค้ดด้วยตัวเลขนั้น ตำแหน่งของอักขระ 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]เป็นชวเลข builtin สำหรับa.charAt(0)โดยวิธีการ)


หากคุณแทนที่_ด้วย+คุณสามารถ Base64 บีบอัดรายการ
ETHproductions

@ETHproductions base64 ทำให้สิ่งต่าง ๆอีกต่อไปไม่สั้นลง
แบล็กไลท์ส่องแสง

@ETHproductions Javascript มี Base64 หรือไม่
SuperJedi224

@ SuperJedi224 ใช่แล้ว แต่ Blacklight นั้นถูกต้องเว้นแต่ว่า base 64 กำลังเปลี่ยนตัวเลขที่อาจแสดงเป็นฐานที่ต่ำกว่าโดยเฉพาะไบนารี
พุธ

คุณสามารถใช้btoa("abc")ในการบีบอัดข้อความได้ 25% (ตราบใดที่มันเป็นข้อความฐาน -64 ที่ถูกต้องซึ่งจะเป็นการแทนที่_ด้วย-) จากนั้น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 - นำองค์ประกอบหลายอย่างออกจากคำสั่งเปลี่ยนและเติม hashtable สำหรับการค้นหาแทน

แก้ไข 2 - ใช่แล้ว ... การจัดทำดัชนีเป็นสตริงนั่นเป็นวิธีที่จะไป ...

โดยพื้นฐานแล้วจะใช้อินพุตป้อนเข้าในช่องว่างและใช้อักขระตัวแทนswitchในคำแรกเพื่อกรองสิ่งที่โง่เขลา ตั้งค่าผลลัพธ์ของการ$bเป็น ถ้า$bไม่ได้อยู่สายได้รับการประเมินในสามตัวอักษรตัวแรกของคำแรกและผลตัวอักษรต่อไปนี้ทันทีมิฉะนั้นเราเอาท์พุท$c$b

เทคนิคบางอย่างรวมถึงLATIN CAPITAL LETTER Rดัชนีที่เป็นอาร์เรย์โดยพิจารณาจากคำที่สองคือCAPITALและส่งออกตัวอักษรตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กที่สอดคล้องกัน "เคล็ดลับ" อื่น ๆ สำหรับDIGITs โดยการจัดทำดัชนีลงใน hashtable โปรดทราบว่ามันไม่สั้นกว่าที่จะทำเคล็ดลับ index-in-a-string เดียวกันที่นี่ (จริง ๆ แล้วมันยาวโดยหนึ่งไบต์)


ฉันจะตีคุณอีกครั้ง
SuperJedi224

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 และsubstringเพื่อดึงและคืนค่าอักขระ

แก้ไข:ใช้ wildcards เพิ่มเติมเพื่อลดขนาด regex แทนที่ substr ด้วยดัชนีอักขระและลบออกยี่สิบอักขระ Rule sticklers จะทราบว่าการอัปเดตครั้งสุดท้ายนี้โพสต์หลังจากความท้าทายได้สิ้นสุดลงแล้ว แต่ฉันไม่คิดว่ามันจะเปลี่ยนอันดับของฉัน นี่เป็นเพียงการฝึกฝนสำหรับมือใหม่


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'; # -
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.