Mari kembali ke dasar!
- Kode Anda, program atau fungsi yang lengkap, harus mengubah nama Unicode resmi dari karakter Latin Dasar yang dapat dicetak menjadi karakter yang sesuai. Misalnya, untuk input,
LOW LINE
kode Anda harus ditampilkan_
. - Anda hanya perlu menggunakan satu nama karakter sebagai input.
- Anda tidak dapat menggunakan fungsi atau pustaka yang sudah ada sebelumnya, built-in atau sebaliknya, yang menawarkan logika apa pun yang berkaitan khusus dengan nama karakter Unicode (misalnya Python
unicodedata
, JavaCharacter.getName
, dan sebagainya.) - Untuk masukan selain dari salah satu nama ini, perilaku apa pun dapat diterima.
Ini adalah kode golf: kode terpendek dalam byte menang.
Untuk menghindari ambiguitas, ini adalah set lengkap nama karakter resmi yang akan kami gunakan (dipinjam dari pertanyaan ini ):
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
COLON COLON
menghasilkan::
, atau perilaku yang tidak jelas?String.fromCharCode
dilarang?CLON
?Jawaban:
Kode mesin IA-32,
161160122 byteHexdump kode:
Kode ini menggunakan beberapa hashing. Dengan beberapa pencarian brute-force, saya menemukan bahwa fungsi hash berikut dapat diterapkan ke byte dari string input:
Ini dikalikan
x
dengan 89, menambahkan byte berikutnya (kode ASCII), dan mengambil modulo 113 sisanya. Ia melakukan ini pada semua byte dari string input kecuali yang terakhir, jadi mis.LATIN CAPITAL LETTER A
DanLATIN CAPITAL LETTER X
memberikan kode hash yang sama.Fungsi hash ini tidak memiliki tabrakan, dan output di kisaran 0 ... 113 (sebenarnya, untungnya, kisarannya bahkan lebih sempit: 3 ... 108).
Nilai hash dari semua string yang relevan tidak mengisi ruang itu sepenuhnya, jadi saya memutuskan untuk menggunakan ini untuk mengompres tabel hash. Saya menambahkan tabel "lewati" (112 bit), yang berisi 0 jika tempat yang sesuai di tabel hash kosong, dan 1 sebaliknya. Tabel ini mengubah nilai hash menjadi indeks "terkompresi", yang dapat digunakan untuk mengatasi LUT padat.
String
LATIN CAPITAL LETTER
danLATIN SMALL LETTER
memberikan kode hash 52 dan 26; mereka ditangani secara terpisah. Berikut adalah kode C untuk itu:Kode bahasa assembly yang sesuai (sintaksis MS-Visual Studio inline-assembly):
Beberapa detail implementasi yang patut diperhatikan:
CALL
instruksi untuk mendapatkan pointer ke kode, di mana tabel hard-kode berada. Dalam mode 64-bit, ia bisa menggunakan registerrip
.BT
instruksi untuk mengakses tabel lewatieax
,ecx
,edx
, yang dapat musnah - sehingga tidak perlu untuk menyimpan dan mengembalikan registeral
danah
hati - hati, sehingga di tempat yang tepatah
dikurangi menjadi 0, dan seluruheax
register dapat digunakan sebagai indeks LUTsumber
JavaScript ES6, 228
236 247 257 267 274 287Catatan: 7 karakter disimpan thx @ ev3commander
Catatan 2: lebih baik daripada JAPT setelah 7 suntingan utama,
Jalankan cuplikan untuk menguji
sumber
Japt , 230 byte
Masing-masing
¿
mewakili karakter Unicode yang tidak dapat dicetak. Cobalah online!Tidak Disatukan:
Ini sangat menyenangkan. Saya telah membagi nama karakter menjadi beberapa bagian besar:
0. Ambil dua huruf pertama
V=Us0,2;
set variabelV
ke dua huruf pertamaU
, string input. Ini akan berguna nanti.1. Huruf kapital
Ini adalah yang termudah: huruf kapital adalah satu-satunya yang memiliki karakter pada posisi 21, yang semuanya merupakan huruf dan huruf yang benar. Dengan demikian,
Ug21
sudah cukup.2. Huruf kecil
Satu lagi yang cukup mudah; satu-satunya nama lain yang memiliki karakter pada posisi 19 adalah
RIGHT SQUARE BRACKET
, jadi kami memeriksa apakah nama adalah datang sebelumR
denganU<'R
, maka jika (&&
), kita mengambil char ke-19 denganUg19
dan melemparkannya ke huruf kecil denganv
.3. Digit
Semua nama ini dimulai dengan
DI
(dan untungnya, tidak ada yang lain), jadi jikaV=="DI"
, kita bisa mengubahnya menjadi digit. Huruf pertama dari beberapa nama digit adalah sama, tetapi dua huruf pertama sudah cukup. Menggabungkan ini menjadi satu string, kita dapatkanZEONTWTHFOFISISEEINI
. Sekarang kita bisa mengambil indeksb
dari dua karakter pertama dalam nama digit denganUs6,8)
dan membaginya dengan dua.4.
SIGN
Ada tujuh nama yang mengandung
SIGN
:Pertama kita periksa apakah namanya mengandung kata
SIGN
. TernyataGN
cukup;Uf"GN"
mengembalikan semua instanceGN
dalam nama, yangnull
jika mengandung 0 instance, dan karenanya dilewati.Sekarang, menggunakan teknik yang sama dengan digit, kita menggabungkan dua huruf pertama menjadi string
LEGRPLEQDONUPE
, lalu ambil indeks dan bagi dengan dua. Ini menghasilkan angka dari0-6
, yang dapat kita gunakan untuk mengambil karakter yang sesuai dari string<>+=$#%
.5.
MARK
Ada tiga karakter yang mengandung
MARK
:Di sini kita menggunakan teknik yang sama dengan
SIGN
.M
cukup untuk membedakan ketiga ini dari yang lain. Untuk menerjemahkan ke simbol, kali ini memeriksa satu huruf sudah cukup: karakter di posisi 2 berbeda untuk ketiga karakter. Ini berarti kita tidak perlu membaginya dengan dua ketika memilih karakter yang benar.6.
LEFT/RIGHT
Grup ini berisi tanda kurung dan tanda kurung
[]{}()
,. Akan sangat rumit untuk menangkap keduanyaLEFT
danRIGHT
, tetapi untungnya, mereka semua mengandung stringT
. Kami memeriksa ini dengan teknik yang sama seperti yang kami lakukan denganSIGN
. Untuk menerjemahkan simbol, cukup denganMARK
memeriksa satu huruf saja; karakter pada posisi 6 adalah unik untuk keenamnya.7.
CO
Karakter lainnya cukup unik, tetapi tidak cukup unik. Tiga dari mereka mulai dengan
CO
:COMMA
,COLON
, danCOMMERCIAL AT
. Kami menggunakan persis teknik yang sama seperti yang kita lakukan dengan kurung, memilih simbol yang tepat berdasarkan karakter pada posisi 4 (A
,N
, atauE
).8. Yang lainnya
Sekarang, dua karakter pertama berbeda untuk setiap nama. Kami menggabungkan semuanya menjadi satu string besar
SPAMAPASHYFUSORESETICIGRLOVE
dan memetakan setiap pasangan ke karakter terkait&'*-./\;~^`_|
.9. Langkah terakhir
Masing-masing bagian mengembalikan string kosong atau
null
jika itu bukan yang benar, sehingga kami dapat menautkannya dari kiri ke kanan||
. The||
Operator mengembalikan argumen kiri jika truthy itu, dan argumen yang tepat sebaliknya. Japt juga memiliki output implisit, jadi apa pun hasilnya, secara otomatis dikirim ke kotak output.Selamat datang pertanyaan, komentar, dan saran!
sumber
MARK
karakter.spamapashyfusoreseticigrlove
= Spam a pashy untuk jadi setel ulang cinta gadis es ... +1Python 2, 237 byte
Dapatkan hash dari string dan modulo membaginya dengan 535. Selanjutnya mengubahnya menjadi karakter unicode dengan nomor itu. Posisi karakter unicode dalam daftar karakter unicode yang dikompilasi kemudian dikonversi ke karakter ascii.
sumber
Javascript,
501499469465451430 bytePenjelasan:
String panjang itu adalah daftar terkompresi.
a.length.toString(36)+a[0]+a.slice(-3)
menentukan bagaimana, jika sama sekali, string akan diwakili dalam daftar. Juga, logika khusus untuk surat. (dengan string,a[0]
adalah singkatan untuka.charAt(0)
, omong-omong)sumber
_
dengan+
, Anda dapat memadatkan daftar Base64.btoa("abc")
untuk mengompresi teks sebesar 25% (selama itu adalah teks dasar-64 yang valid, yang akan setelah diganti_
dengan-
), kemudianatob("compressed stuff")
dalam kode Anda yang sebenarnya.PowerShell,
603547464 byte(
LineFeed
menghitung byte yang sama dengan;
, jadi saya akan meninggalkan jeda untuk dibaca)Sunting 1 - Mengambil banyak elemen dari pernyataan sakelar dan malah mengisi hashtable untuk pencarian.
Sunting 2 - Oh yeah ... pengindeksan menjadi string, itulah cara untuk pergi ...
Pada dasarnya mengambil input, membaginya pada spasi, dan melakukan wildcard
switch
pada kata pertama untuk menyaring yang konyol. Tetapkan hasil itu menjadi$b
. Jika$b
tidak ada, string$c
akan dievaluasi pada tiga huruf pertama dari kata pertama dan menampilkan karakter segera berikut, jika tidak kita output$b
.Beberapa trik termasuk
LATIN CAPITAL LETTER R
yang mengindeks ke dalam array berdasarkan pada apakah kata kedua adalahCAPITAL
, dan mengeluarkan huruf besar / huruf kecil yang sesuai. "Trik" lainnya adalah untukDIGIT
s, dengan mengindeks ke dalam hashtable. Perhatikan bahwa tidak pendek untuk melakukan trik index-into-a-string yang sama di sini (sebenarnya lebih lama satu byte).sumber
Javascript,
416411389 byteIni adalah format yang lebih mudah dibaca (penjelasan datang kemudian):
Mengurangi 5 byte dari penggabungan kunci dan nilai string.
Penjelasan: Ekspresi reguler pada baris pertama mengurangi input menjadi kunci karakter 4 yang unik. Perhatikan bahwa keunikan hanya dijamin untuk set nama tertentu yang ditentukan dalam tantangan, dan duplikat akan sangat umum untuk bahasa Inggris normal! Bahkan untuk tantangan ini, saya harus menghapus kata-kata umum seperti tanda kurung dan masuk untuk mendapatkan set yang unik.
Untuk mengembalikan karakter, saya memeriksa untuk melihat apakah itu karakter latin dengan memeriksa string "SER" dan "cer", dan mengembalikan karakter terakhir dari input, dalam huruf kecil untuk ser.
Untuk yang lainnya, saya merujuk ke string yang berisi semua kunci 4 karakter, diikuti oleh karakter yang benar. Saya kemudian menggunakan indeks karakter indexof dan
substringuntuk menarik dan mengembalikan karakter.Sunting: Menggunakan lebih banyak wildcard untuk mengurangi ukuran regex, mengganti substrat dengan indeks karakter dan mencukur lebih dari dua puluh karakter. Stickler aturan akan mencatat bahwa pembaruan terakhir ini diposting setelah tantangan telah berakhir, namun saya tidak berpikir itu mengubah peringkat saya. Ini hanya latihan untuk pemula.
sumber
Python 3, 148 byte
Untuk kenyamanan menonton Anda, saya telah mengganti dua byte yang tidak dapat dicetak dengan kode pelepasan oktal
\32
dan\34
; batalkan ini untuk mendapatkan fungsi 148 byte.Saya menghitung bagian dari fungsi hash ini dengan GPerf .
sumber
Perl 6 ,
348242 bytepemakaian:
sumber