Karaktere temel Latin karakter ismi


23

Temel konulara geri dönelim!

  • Tam bir program veya işlev olan kodunuz, yazdırılabilir bir Temel Latince karakterin resmi Unicode adını karşılık gelen karaktere dönüştürmelidir. Örneğin, giriş LOW LINEiçin kodunuzun çıkması gerekir _.
  • Girdi olarak sadece tek bir karakter ismi kullanmanız gerekir.
  • Özel olarak Unicode karakter adlarıyla (örneğin Python's unicodedata, Java Character.getName, vb.) İlgili herhangi bir mantık sunan, önceden yerleşik bir işlevi veya kitaplığı kullanamazsınız .
  • Bu isimlerden başka bir giriş için, herhangi bir davranış kabul edilebilir.

Bu kod golf: bayt cinsinden en kısa kod kazanır.

Herhangi bir belirsizliği önlemek için, kullanacağımız resmi karakter adlarının tamamı budur ( bu sorudan ödünç alınmıştır ):

     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
Program sadece bir karakter ismini mi kullanmalı? Örneğin, COLON COLONçıktı ::mı yoksa tanımsız davranış mı olmalı ?
Kevin W.

Netleştirmek için düzenlenmiş.
Luke,

Neden String.fromCharCodeyasaktır?
SuperJedi224

Hata! Bu fonksiyonun ne yaptığını yanlış anladım.
Luke

Gibi geçersiz girişi nasıl ele almalıyız CLON?
edc65

Yanıtlar:


25

IA-32 makine kodu, 161 160 122 bayt

Kodun 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

Bu kod biraz karma kullanır. Bazı kaba kuvvet aramalarında, aşağıdaki karma işlevinin girdi dizesinin baytlarına uygulanabileceğini öğrendim:

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

Bu çarpar x89 tarafından, bir sonraki byte (ASCII kodu) ekler ve örneğin bu yüzden, sonuncusu hariç, giriş dizesi her bayt bu yapan bir kalan modulo 113. alır LATIN CAPITAL LETTER Ave LATIN CAPITAL LETTER Xaynı karma kodunu verin.

Bu karma fonksiyonun çarpışması yoktur ve çıkış 0 ... 113 aralığındadır (aslında, şans esasında, aralık daha da dardır: 3 ... 108).

İlgili dizgelerin hash değerleri o boşluğu tamamen doldurmaz, ben de hash tablosunu sıkıştırmak için kullanmaya karar verdim. Bir "atlama" tablosu (112 bit) ekledim, eğer karma tablosundaki karşılık gelen yer boşsa 0, aksi takdirde 1. Bu tablo, bir karma değerini, yoğun LUT'yi adreslemek için kullanılabilen "sıkıştırılmış" bir dizine dönüştürür.

Dizeler LATIN CAPITAL LETTERve LATIN SMALL LETTERkarma kodları 52 ve 26; ayrı ayrı ele alınırlar. İşte bunun için bir C kodu:

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

İlgili derleme dili kodu (MS Visual Studio satır içi derleme sözdizimi):

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

Dikkate değer bazı uygulama detayları:

  • CALLSabit kodlu tablonun bulunduğu koda bir işaretçi almak için bir talimat kullanır . 64 bit modunda, bunun ripyerine kaydı kullanabilir .
  • BTAtlama tablosuna erişmek için talimatı kullanır
  • Sadece 3 kayıtlar kullanılarak işi yapmak için yönetir eax, ecx, edx, clobbered edilebilen - yani kaydetmek ve kayıtları geri gerek yoktur
  • Karma tablosunu Kodu çözerken kullandığı alve ahözenle, bu nedenle doğru yerde olduğunu ah0'a düşürülür ve bütün eaxkayıt bir LUT indeksi olarak kullanılabilir

18

JavaScript ES6, 228 236 247 257 267 274 287

Not: 7 karakter thx @ ev3commander'ı kurtardı

Not 2: 7 ana düzenleme sonrasında JAPT’dan daha iyi ,

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 edilecek pasajı çalıştırın

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
Sadece ... nasıl? Aferin.
SuperJedi224

Aslında, alfabenin yanı sıra, "LA" ile başlayan bir karakter yoktur
ev3 komutanı

@ ev3commander evet, ama burada LAT, RIG ve LEF'i yönetiyorum ve 2 karakter çok az görünüyor, LEFT ve LESS var
edc65 20

Ohh. Ben sadece yağsız ve RIG / LEF kısmını görmedim.
ev3 komutanı

@ ev3commander ikinci bir noktaya sahip olduğunu düşündüm! LESS ve LEFT işlemlerini birleştirebilir ve 4 bayttan tasarruf edebilirim. Thx
edc65

10

Japt , 230 bayt

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

Her biri ¿yazdırılamaz bir Unicode karakterini temsil eder. Çevrimiçi deneyin!

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

Bu gerçekten eğlenceliydi. Karakter isimlerini birkaç büyük parçaya böldüm:

0. İlk iki harfi al

V=Us0,2;değişkeni giriş dizesinin Vilk iki harfine ayarlar U. Bu daha sonra işe yarayacak.

1. Büyük harfler

Bu en kolay olanı: Büyük harfler, 21 pozisyonunda bir karaktere sahip olan ve tümü doğru harf ve durum olan tek harflerdir. Böylece,Ug21 yeterlidir.

2. Küçük harfler

Oldukça kolay bir tane daha; 19 konumunda bir karakteri vardır sadece diğer adıdır RIGHT SQUARE BRACKETbiz kontrol böyledir ismi daha önce gelirse, Rbirlikte U<'Ro zaman, (eğer &&), biz 19 kömürü almak Ug19ve birlikte küçük harfe dökümv .

3. Rakamlar

Bu isimlerin hepsi DI(ve neyse ki, diğerlerinin hiçbiri) ile başlar, öyleyse V=="DI", onu bir rakama çevirebiliriz. Rakamların bazı isimlerinin ilk harfleri aynı, ancak ilk iki harf yeterli. Bunları bir dizgede birleştirerek anlıyoruz ZEONTWTHFOFISISEEINI. Şimdi brakamın ismindeki ilk iki karakterin dizinini alabilir Us6,8)ve ikiye bölebiliriz.

4. SIGN

İçerdiği yedi isim var SIGN:

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

İlk önce ismin kelimeyi içerdiğini kontrol ederiz SIGN. Anlaşılan GNyeterlidir; 0 örneğini içeriyorsa adın Uf"GN"tüm örneklerini döndürür ve bu nedenle atlanır.GNnull

Şimdi, rakamlarla aynı tekniği kullanarak, ilk iki harfi bir dizede birleştiririz LEGRPLEQDONUPE, sonra indeksi alır ve ikiye böleriz. Bu 0-6, diziden karşılık gelen karakteri almak için kullanabileceğimiz bir sayı ile sonuçlanır <>+=$#%.

5. MARK

İçerisinde üç karakter var MARK:

!    EXCLAMATION MARK
"    QUOTATION MARK
?    QUESTION MARK

Burada ile aynı tekniği kullanıyoruz SIGN.  Mbu üçünü diğerlerinden ayırt etmek için yeterlidir. Bir sembole çevirmek için, bu sefer bir harfi kontrol etmek yeterlidir: 2 konumundaki karakter üç karakterin tümü için farklıdır. Bu, doğru karakteri seçerken ikiye bölmemiz gerektiği anlamına gelir.

6. LEFT/RIGHT

Bu grup parantez ve parantezleri içerir []{}(). Her ikisini de yakalamak gerçekten karmaşık olurdu LEFTve RIGHTama neyse ki hepsi ipi içeriyor . Bunu, yaptığımız teknikle kontrol ediyoruz SIGN. Bir sembole çeviri yapmak için, olduğu gibiMARK , bir harfi kontrol etmek yeterlidir; 6. pozisyondaki karakter altı için benzersizdir.

7. CO

Karakterlerin geri kalanı oldukça benzersiz, ancak yeterince benzersiz değil. Üçü ile başlar CO: COMMA, COLON, ve COMMERCIAL AT. Biz 4 pozisyonundaki karakterine dayalı uygun sembolü seçerek parantez yaptığı gibi biz tam olarak aynı tekniği kullanabilirsiniz ( A, Nveya E).

8. Her şey

Şimdiye kadar, ilk iki karakter her isim için farklı. Hepsini birer büyük dizgede birleştiriyoruz SPAMAPASHYFUSORESETICIGRLOVEve her çifti kendi karşılık gelen karakterine eşliyoruz  &'*-./\;~^`_|.

9. Son adımlar

Parçaların her biri boş bir dize döndürür ya nullda doğru olan değilse, hepsini soldan sağa bağlayabiliriz ||. ||Operatör sol argüman 's truthy eğer, aksi takdirde doğru argüman döndürür. Japt ayrıca örtük çıktılara sahiptir, bu nedenle sonuç ne olursa olsun, otomatik olarak çıktı kutusuna gönderilir.

Sorular, yorumlar ve önerilerinizi bekliyoruz!


Harika cevap ve harika bir açıklama. Ancak açıklamadaki
işlemden veya MARK'dan

@ edc65 Çavuş, teşekkürler! MARKKarakterlerle ilgili bir bölüm ekledim .
ETHProductions

7
spamapashyfusoreseticigrlove= Böylece sıfırlamak için bir pashy Spam buzlu kız aşk ... +1
AdmBorkBork

Hayır, bu hala çok golf oynuyor.
Blacklight,

3

Python 2,237 bayt

Dizenin karmasını alın ve modulo 535'e bölün. Daha sonra onu bu sayıyla unicode karakterine dönüştürün. Unicode karakterin önceden derlenmiş bir unicode karakter listesindeki konumu daha sonra ascii karakterine dönüştürülür.

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 bayt

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çıklama:

Bu uzun dize sıkıştırılmış bir listedir. a.length.toString(36)+a[0]+a.slice(-3)Dizenin listede gösterilip gösterilmeyeceğini belirler. Ayrıca, harfler için özel mantık. (Bu arada, dizelerle a[0]yerleşik bir kısa a.charAt(0)yol)


Eğer değiştirdiyseniz _ile +, listeyi Base64 sıkıştırmak olabilir.
ETHProductions

@ETHproductions tabanı64 işleri daha kısa yapar , daha kısa yapar .
Blacklight,

@ETHproductions mu JavaScript var Base64?
SuperJedi224

@ SuperJedi224 Evet, fakat taban 64, alt tabanda ifade edilebilecek bir sayıyı, özellikle ikili olanları değiştirmediği sürece doğrudur.
15’ten

Sen kullanabilirsiniz btoa("abc")(sürece o değiştirdikten sonra olacağını geçerli bir temel-64 metin, olduğu gibi% 25 oranında kompres metne _ile -, sonra) atob("compressed stuff")gerçek kodda.
ETHProductions

1

PowerShell, 603 547 464 bayt

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

( LineFeedaynı byte'ı sayar ;, böylece okunabilirliği sağlamak için ara vereceğim)

Düzenleme 1 - switch ifadesinden birçok öğe aldı ve bunun yerine aramalar için bir karma tablo doldurdu.

Düzen 2 - Oh evet ... bir dizgeye indeksleme, işte böyle gitmek ...

Temel olarak girdiyi alır, boşluklara böler switchve ilk kelimeye saçma sapanları filtrelemek için bir joker karakter yapar . Bunun sonucunu ayarlar $b. Eğer $byoksa, dize $c, aksi takdirde biz çıkışı ilk kelimenin ilk üç harf değerlendirilir ve hemen aşağıdaki karakterini verir alır $b.

Bazı püf noktaları LATIN CAPITAL LETTER R, ikinci kelimenin olup olmadığına bağlı olarak hangi dizinin indekslendiğini CAPITALve karşılık gelen büyük harf / küçük harfin çıktısını içerir. Diğer "numara" ise DIGIT, bir karma tabloya endeksleyerek s içindir. Aynı string-in-a-string hilesini burada yapmanın daha kısa olmadığını unutmayın (aslında bir byte ile daha uzundur).


Seni tekrar dövüyorum.
SuperJedi224

1

Javascript, 416 411 389 bayt

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

Bu daha okunabilir bir formattır (açıklama daha sonra gelecek):

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

Anahtar ve değer dizelerini birleştiren eksi 5 bayt.

Açıklama: İlk satırdaki normal ifadeler girişleri benzersiz 4 karakterli tuşlara böler. Benzersizliğin yalnızca mücadelede belirtilen belirli isimler için garanti edildiğini ve kopyaların normal İngilizce için çok yaygın olacağını unutmayın! Bu meydan okuma için bile, benzersiz bir set elde etmek için köşeli ayraç ve işaret gibi ortak kelimeleri kaldırmak zorunda kaldım.

Karakteri döndürmek için, "SER" ve "cer" dizelerini kontrol ederek latin karakter olup olmadığını kontrol ediyorum ve girişin son karakterini ser için küçük harf olarak döndürüyorum.

Her şey için, 4 karakter anahtarının tümünü içeren bir dizgeye, ardından doğru karaktere bakın. Sonra karakteri çekmek ve döndürmek için indexof ve substring karakter dizinlerini kullanıyorum.

Düzenleme: Regex boyutunu küçültmek, karakter dizileriyle substr değiştirmek ve başka yirmi karakterle traş olmak için daha fazla joker karakter kullanın. Kural yapıştırıcıları bu son güncellemenin zorluğun sona ermesinden sonra yayınlanacağına dikkat eder, ancak sıralamamı değiştirdiğini sanmıyorum. Bu sadece bir acemi için pratiktir.


1

Python 3, 148 bayt

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

Görüntüleme rahatlığınız için, yazdırılamayan iki baytı sekizli çıkış kodlarıyla değiştirdim \32ve \34; 148 bayt işlevini almak için bunu geri alın.

Bu hash fonksiyonunun kısımlarını GPerf ile hesapladım .


0

Perl 6 ,  348   242 bayt

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

kullanımı:

my &code = {...}

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

say code 'HYPHEN-MINUS'; # -
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.