Есть 97 символов ASCII, с которыми люди сталкиваются на регулярной основе. Они делятся на четыре категории:
Письма (всего 52)
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Числа или цифры (всего 10)
0123456789
Символы и пунктуация (всего 32)
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Пробелы (всего 3)
Пробел
\t
и новая строка\n
. (Мы будем рассматривать варианты новой строки\r\n
как один символ.)
Для краткости мы будем называть эти категории L, N, S и W соответственно.
Выберите любую из 24 комбинаций букв, которые LNSW
вы хотите, и повторяйте это до бесконечности, чтобы сформировать шаблон программирования для себя.
Например, вы можете выбрать перестановку NLWS
, поэтому ваш шаблон программирования будет:
NLWSNLWSNLWSNLWSNLWS...
Вам нужно написать программу или функцию на основе этого шаблона, где:
Каждый
L
заменяется на любую букву (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
).Каждый
N
заменяется на любое число (0123456789
).Каждый
S
заменяется любым символом (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
).Каждый
W
заменяется любым символом пробела (\t\n
).
По сути, ваш код должен следовать шаблону
<letter><number><symbol><whitespace><letter><number><symbol><whitespace>...
как следует из названия вопроса, за исключением того, что вы можете выбрать другой порядок четырех категорий символов, если это необходимо.
Обратите внимание, что:
Заменами для категории могут быть разные персонажи. например,
9a ^8B\t~7c\n]
корректно соответствует шаблонуNLWSNLWSNLWS
(\t
и\n
будет их буквальными символами).Нет ограничений по длине кода. например,
1A +2B -
и1A +2B
и1A
и1
все соответствуют шаблонуNLWSNLWSNLWS...
.
Код, соответствующий шаблону, должен сделать один нерасширенный символ ASCII и вывести число от 0 до 4 в зависимости от того, к какой категории он относится, в приведенной выше классификации. То есть вывод, 1
если ввод является буквой, 2
если число, 3
если символ, и 4
если пробел. Выведите, 0
если на входе нет ни одного из них ( управляющий символ ).
Для ввода вы можете альтернативно принять число от 0 до 127 включительно, которое представляет код входного символа ASCII.
Ваши пары ввода (как код символа) и выхода должны иметь следующие параметры:
in out
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 4
10 4
11 0 or 4
12 0 or 4
13 0 or 4
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 4
33 3
34 3
35 3
36 3
37 3
38 3
39 3
40 3
41 3
42 3
43 3
44 3
45 3
46 3
47 3
48 2
49 2
50 2
51 2
52 2
53 2
54 2
55 2
56 2
57 2
58 3
59 3
60 3
61 3
62 3
63 3
64 3
65 1
66 1
67 1
68 1
69 1
70 1
71 1
72 1
73 1
74 1
75 1
76 1
77 1
78 1
79 1
80 1
81 1
82 1
83 1
84 1
85 1
86 1
87 1
88 1
89 1
90 1
91 3
92 3
93 3
94 3
95 3
96 3
97 1
98 1
99 1
100 1
101 1
102 1
103 1
104 1
105 1
106 1
107 1
108 1
109 1
110 1
111 1
112 1
113 1
114 1
115 1
116 1
117 1
118 1
119 1
120 1
121 1
122 1
123 3
124 3
125 3
126 3
127 0
Входы 11, 12 и 13 соответствуют символам, которые иногда считаются пробелами, поэтому их выходы могут быть 0
или 4
по вашему желанию.
Самый короткий код в байтах побеждает.
источник
Ответы:
Haskell 300 байт
В этом коде не должно быть завершающего символа новой строки. Функция
m1
принимает входные данные как aChar
и возвращает ответ как aChar
.Я не мог устоять перед вызовом, который, по мнению кого-то, был невозможен для «обычных» языков.
Вы можете оспаривать, имеет ли значение Haskell, но большинство ключевых слов и идентификаторов состоят из нескольких символов и не могут использоваться. Тем не менее, определения функций верхнего уровня, списки, строковые литералы, строгие сравнения, сопоставление с образцом и ветвление с защитными элементами работают до тех пор, пока буквы идут непосредственно перед цифрами, а если символы также идут непосредственно перед буквами, у нас есть экранирующие символы, такие как
\t
и\r
. К сожалению, перестановки, которые работают для общего программирования, не допускают числовые литералы, поэтому я не мог получить числа любым полезным способом.Как это работает:
m1
.x1
это персонаж, который анализируется.f1
Функция разбивает строку соответствия списка шаблонов, и имеет три ветви: когда границы являются символы больше пространства, когда границы экранируются управляющими символами меньше пространства, а также для обработки окончательного сравнения с самим пространством. Имена частей списка являются мнемоническими для первой ветви: буква, номер, sPace, sYmbol, Remainder.b1
функции ручка разветвления для двух граничных знаковs1 < b1
в то время.Попробуйте онлайн
источник
Сетчатка , 113 байт
Буква, число, пробел, символ, повтор
Попробуйте онлайн!
Проверьте это на себе!
Retina кажется хорошим инструментом для этой работы: мы можем гибко использовать все типы символов в конфигурации этапа, и у нас есть несколько предопределенных классов символов, которые могут быть полезны.
Я думаю, что эту проблему можно решить с помощью этапов замены или этапов транслитерации; Я выбрал Транслитерацию, потому что они более гибкие и имеют самые полезные классы персонажей. Что касается шаблона источника, я был вынужден поместить символы прямо перед буквами, чтобы использовать их
\n
для новых строк (на самом деле у меня было более короткое решение, использующее более практичный символ ¶ для новых строк, но символы, отличные от ascii, запрещены).объяснение
Первыми этапами являются транслитерации. Мы используем
+
и1
как параметры, чтобы сохранить паттерн, но он не повлияет на результат этапа. Синтаксис состоит в том,T`from`to
чтобы сопоставить каждый символfrom
с символом в той же позиции вto
. Еслиto
оно корочеfrom
, его конечный символ повторяется столько раз, сколько необходимо. Еслиfrom
есть повторяющиеся символы, считается только первое вхождение каждого из них. Некоторые буквы соответствуют классам символов, напримерd
, эквивалентны0123456789
.При этом мы сопоставляем некоторые символы с другими персонажами того же класса, чтобы «освободить место» для последующих транслитераций. (
a
->b
,0
->1
,space
->tab
,@
->;
). Финал:D0
просто смайлик: D0Мы начинаем с цифр,
d
это класс символов0-9
, здесь мы преобразовываем0
->a
,1-9
->2
,space
->2
: транслитерации для0
иspace
неправильны, но эти символы были удалены предыдущей транслитерацией.Пробелы, преобразование
a
->a
(9
,tab
,\n
,space
) ->4
.9
был уже удален на предыдущем этапе.Буквы, здесь мы используем два разных класса символов (из-за отсутствия более полного):
l
для строчных иL
заглавных букв. Все они отображаются1
вместе с некоторыми другими персонажами, с которыми сталкивались на предыдущих этапах.Символы. Поскольку все остальные классы превратились в цифры, здесь мы сопоставляем все цифры сами с собой
d
->d
, а затем все печатные символы -3
сp
->3
. Цифры также есть среди печатных символов, но выигрывает первая транслитерация.Теперь нам нужно назначить
0
управляющие символы, но я не нашел подходящего способа явного обращения к этому классу. Вместо этого мы преобразуем каждую цифру в унарную: управляющие символы не являются цифрами, поэтому они рассматриваются как пустая строка, равная0
унарной. К сожалению, команда унарного преобразования в сетчатке -$*
это два символа рядом друг с другом, поэтому мы вместо этого будем преобразовывать «вручную», используя подстановки.Наша унарная цифра -
$n
это образец замены для новых строк.\b
соответствует «границе», где буквенно-цифровое слово начинается или заканчивается: в нашем случае это всегда будет соответствовать любому числу. Мы в основном заменяем каждый номерn
на новую строку плюсn-1
.В итоге подсчитываем количество новых строк и получаем желаемый результат.
источник
Кардинал
22402224 байтаШаблон используется LSNW
В коде есть завершающий символ новой строки.
Как это работает:
В этом коде много символов, которые не используются.
% освобождает указатель во всех направлениях. 3 из них просто попадают в конец строки и умирают.
Последний указатель получает вход в:
Этот вход затем сравнивается с каждым значением от 0 до 127.
Отпечатки:
0 для 0-8
4 для 9-12
0 для 13-31
4 для 32
3 для 33-47
2 для 48-57
3 для 58-64
1 для 65-90
3 для 91-96
1 для 97-122
3 для 123-126
0 для 127
Используемые операции:
J = Пропустить следующую операцию, если она не равна нулю
^ = Изменить направление на вверх
> = Изменить направление влево
- = Уменьшение
+ = Приращение
: = Взять ввод
% = Создать указатели при запуске программы
x = Удалить указатель
0 = Установить активный значение указателя на 0
Попробуйте онлайн
источник
Perl 5 , 293 байта
Код 291 байт + 2 для
-0p
.Мне сообщили, что флаги командной строки являются бесплатными, но я добавил их здесь для наглядности, поскольку ссылка TIO не включает
-0
, для облегчения тестирования.Попробуйте онлайн!
Это особенно сложная задача, которую нужно решить практически на любом языке, поэтому я очень рад, что смог (наконец-то, в течение некоторого времени возиться и выключаться), заставить это работать в Perl. Надеюсь, дополнительные пробелы до и после номера не проблема.
Выбор порядка следования было особенно сложно, но forunately
s///
иy///
может принять любой другой символ в качестве разделителя , так что можно использовать буквы, пробел, номер, символ, который позволяетs 0...0...0;
иy 0...0...0;
.Первое, что требовалось для appraoch, - это заменить
_
на!
так, чтобы\w
он только совпадал[0-9a-zA-Z]
, а затем заменить все пробельные символы (\s
) на\t
, все цифры на\r
и все оставшиеся символы слова (\w
)\n
на для последующего простого сопоставления. Затем с помощьюy///
оператора все оставшиеся символы преобразуются в символы слова!
в,_
а все другие символы (между9
иa
) сдвигаются на 9 позиций вниз, превращая их в буквы или цифры. Они затем заменить через\w
с3
и другие, ранее сделанные замены заменены их пронумерованных значений.источник
Пробел , 1332 байта
Порядок
1234
/LNSW
(буква, цифра, символ, пробел).Попробуйте онлайн (введите как целое число, представляющее юникод символа).
Объяснение:
Пробелы - это основанный на стеке язык, в котором все символы, кроме пробелов, табуляции и новых строк, игнорируются. Вот та же программа без
YO!
( 333 байта ):Буквы
S
(пробел),T
(табуляция) иN
(новая строка) добавляются только как подсветка.[..._some_action]
добавлено только в качестве объяснения.Попробуйте онлайн.
Программа в псевдокоде:
источник