Давайте вернемся к основам!
- Ваш код, полная программа или функция, должен преобразовать официальное имя Unicode печатаемого символа Basic Latin в соответствующий символ. Например, для ввода
LOW LINE
ваш код должен выводить_
. - Вам нужно только взять одно имя персонажа в качестве ввода.
- Вы не можете использовать никакую ранее существующую функцию или библиотеку, встроенную или иную, которая предлагает любую логику, относящуюся конкретно к именам символов Unicode (например, Python
unicodedata
, JavaCharacter.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
COLON COLON
выводить::
или неопределенное поведение?String.fromCharCode
запрещено?CLON
?Ответы:
Машинный код IA-32,
161160122 байтаHexdump кода:
Этот код использует хеширование. Путем некоторого перебора я обнаружил, что следующая байтовая функция может быть применена к байтам входной строки:
Он умножается
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 для этого:Соответствующий код на языке ассемблера (синтаксис встроенной сборки MS Visual Studio):
Некоторые заслуживающие внимания детали реализации:
CALL
инструкцию для получения указателя на код, в котором находится жестко закодированная таблица. В 64-битном режиме он мог бы использовать регистрrip
вместо этого.BT
инструкцию для доступа к таблице пропускаeax
,ecx
,edx
, которые могут быть затерты - поэтому нет никакой необходимости сохранять и восстанавливать регистрыal
иah
осторожно, так что в нужном местеah
уменьшается до 0, и весьeax
регистр может использоваться как индекс LUTисточник
JavaScript ES6, 228
236 247 257 267 274 287Примечание: 7 символов сохранены thx @ ev3commander
Примечание 2: лучше, чем JAPT после 7 основных правок,
Запустите фрагмент, чтобы проверить
источник
Japt , 230 байт
Каждый
¿
представляет непечатаемый символ Unicode. Попробуйте онлайн!Ungolfed:
Это было действительно весело. Я разделил имена персонажей на несколько больших кусков:
0. Взять первые две буквы
V=Us0,2;
устанавливает переменнуюV
в первые две буквыU
входной строки. Это пригодится позже.1. Прописные буквы
Это самое простое: только заглавные буквы имеют символ в позиции 21, и все они являются правильными буквой и регистром. Таким образом,
Ug21
достаточно.2. Строчные буквы
Еще один довольно легкий; единственное другое имя, которое имеет символ в позиции 19, - это
RIGHT SQUARE BRACKET
, поэтому мы проверяем, предшествует ли имяR
сU<'R
, затем, если оно (&&
), мы берем 19-й символ сUg19
и переводим его в нижний регистр сv
.3. Цифры
Все эти имена начинаются с
DI
(и, к счастью, с других), поэтому, еслиV=="DI"
мы можем превратить его в цифру. Первые буквы имен некоторых цифр совпадают, но первых двух букв достаточно. Объединяя их в одну строку, мы получаемZEONTWTHFOFISISEEINI
. Теперь мы можем просто взять индексb
первых двух символов в имени цифрыUs6,8)
и разделить на два.4.
SIGN
Есть семь имен, которые содержат
SIGN
:Сначала мы проверяем, что это имя содержит слово
SIGN
. Оказывается,GN
достаточно;Uf"GN"
возвращает все экземплярыGN
в имени,null
если оно содержит 0 экземпляров, и, таким образом, пропускается.Теперь, используя ту же технику, что и с цифрами, мы объединяем первые две буквы в строку
LEGRPLEQDONUPE
, затем берем индекс и делим на два. В результате получается число, из0-6
которого мы можем взять соответствующий символ из строки<>+=$#%
.5.
MARK
Есть три символа, которые содержат
MARK
:Здесь мы используем ту же технику, что и с
SIGN
.M
достаточно, чтобы отличить эти три от других. Чтобы перевести на символ, на этот раз достаточно проверить одну букву: символ в позиции 2 различен для всех трех символов. Это означает, что нам не нужно делить на два при выборе правильного символа.6.
LEFT/RIGHT
Эта группа содержит скобки и скобки
[]{}()
. Было бы очень сложно захватить какLEFT
иRIGHT
, но , к счастью, все они содержат строкуT
. Мы проверяем это той же техникой, что и мыSIGN
. Перевести на символ, как сMARK
, достаточно проверить одну букву; персонаж в позиции 6 уникален для всех шести.7.
CO
Остальные символы довольно уникальны, но недостаточно уникальны. Три из них начинаются с
CO
:COMMA
,COLON
иCOMMERCIAL AT
. Мы используем точно такую же технику , как мы это делали со скобками, выбирая правильный символ на основе символа в позиции 4 (A
,N
илиE
).8. Все остальное
К настоящему времени первые два символа различны для каждого имени. Мы объединяем их все в одну большую строку
SPAMAPASHYFUSORESETICIGRLOVE
и отображаем каждую пару в соответствующий символ&'*-./\;~^`_|
.9. Заключительные шаги
Каждая из частей возвращает пустую строку или,
null
если она неправильная, поэтому мы можем связать их все слева направо||
.||
Оператор возвращает левый аргумент , если это truthy и правильный аргумент в противном случае. Japt также имеет неявный вывод, поэтому независимо от результата он автоматически отправляется в поле вывода.Вопросы, комментарии и предложения приветствуются!
источник
MARK
символах.spamapashyfusoreseticigrlove
= Спам-паши для столь обнуленной ледяной любви девушки ... +1Python 2, 237 байт
Получите хеш строки и по модулю разделите его на 535. Затем преобразуйте его в символ Юникода с этим номером. Позиция символа Юникод в предварительно скомпилированном списке символов Юникод впоследствии преобразуется в символ ascii.
источник
Javascript,
501499469465451430 байтОбъяснение:
Эта длинная строка представляет собой сжатый список.
a.length.toString(36)+a[0]+a.slice(-3)
определяет, как, если это вообще так, строка будет представлена в списке. Также специальная логика для букв. (со строками,a[0]
это встроенная стенография дляa.charAt(0)
, кстати)источник
_
на+
, вы можете Base64-сжать список.btoa("abc")
сжатие текста на 25% (при условии, что это действительный текст base-64, который он будет после замены_
на-
), а затемatob("compressed stuff")
в вашем реальном коде.PowerShell,
603547464 байта(
LineFeed
считает тот же один байт;
, что я оставлю разрывы для удобства чтения)Редактировать 1 - взял много элементов из оператора switch и вместо этого заполнил хеш-таблицу для поиска.
Редактировать 2 - О да ... индексирование в строку, это путь ...
По сути, принимает входные данные, разделяет их на пробелы и делает подстановочный знак
switch
в первом слове, чтобы отфильтровать глупые слова. Устанавливает результат этого в$b
. Если$b
не существует, строка$c
вычисляется по первым трем буквам первого слова и выводит сразу следующий символ, в противном случае мы выводим$b
.Некоторые приемы включают в себя
LATIN CAPITAL LETTER R
индексы which в массив, основанные на том, является ли второе словоCAPITAL
, и выводят соответствующую заглавную / строчную букву. Другой «трюк» дляDIGIT
s, путем индексации в хеш-таблицу. Обратите внимание, что здесь не короче тот же трюк «индекс в строку» (на самом деле он длиннее на один байт).источник
Javascript,
416411389 байтЭто более читаемый формат (пояснение будет позже):
Минус 5 байтов от объединения строк ключа и значения.
Объяснение: Регулярные выражения в первой строке сокращают ввод в уникальные 4-символьные клавиши. Обратите внимание, что уникальность гарантируется только для определенного набора имен, указанных в тесте, и дубликаты будут очень распространены для нормального английского языка! Даже для этой задачи мне пришлось удалить общие слова, такие как скобка и знак, чтобы получить уникальный набор.
Чтобы вернуть символ, я проверяю, является ли это латинским символом, проверяя строки «SER» и «cer», и возвращая последний символ ввода, в нижнем регистре для ser.
Для всего остального я ссылаюсь на строку, которая содержит все 4-символьные клавиши, за которыми следует правильный символ. Затем я использую индексы
символовindexof иподстроки,чтобы вытащить и вернуть символ.Изменить: Использовал больше подстановочных знаков, чтобы уменьшить размер регулярных выражений, заменил substr с индексами символов и сбрил еще двадцать символов. Сторонники правил заметят, что это окончательное обновление публикуется после того, как испытание закончилось, однако я не думаю, что оно изменило мой рейтинг. Это просто практика для новичка.
источник
Python 3, 148 байт
Для удобства просмотра я заменил два непечатаемых байта восьмеричными escape-кодами
\32
и\34
; отмените это, чтобы получить функцию 148 байт.Я вычислил части этой хеш-функции с помощью GPerf .
источник
Perl 6 ,
348242 байтаиспользование:
источник