ОН НЕ СООТВЕТСТВУЕТ - вызов zalgo

25

Напишите программу или функцию, которая, учитывая строку, лишит ее zalgo, если таковая существует.

Zalgo

Для этого поста zalgo определяется как любой символ из следующих диапазонов Unicode:

  • Объединение диакритических знаков (0300–036F)
  • Расширенное объединение диакритических знаков (1AB0–1AFF)
  • Объединение дополнения к диакритическим знакам (1DC0–1DFF)
  • Объединение диакритических знаков для символов (20D0–20FF)
  • Сочетание полумарк (FE20 – FE2F)

https://en.wikipedia.org/wiki/Combining_character#Unicode_ranges

вход

  • Может передаваться через аргументы командной строки, STDIN или любым другим стандартным методом ввода, поддерживаемым вашим языком
  • Будет ли строка, которая может содержать или не содержать zalgo или другие символы не ASCII

Выход

Вывод должен быть строкой, которая не содержит zalgo.

Тестовые случаи

Input -> Output

HE̸͚ͦ ̓C͉Õ̗͕M͙͌͆E̋̃ͥT̠͕͌H̤̯͛ -> HE COMETH
C͉̊od̓e͔͝ ̆G̀̑ͧo͜l͔̯͊f͉͍ -> Code Golf
aaaͧͩa͕̰ȃ̘͕aa̚͢͝aa͗̿͢ -> aaaaaaaaa
ññ        -> ñn
⚡⃤       -> ⚡

счет

Поскольку это , выигрывает кратчайший ответ в байтах.

totallyhuman
источник
3
Гарантируется, что строка содержит только ASCII и / или Zalgo? Или он может содержать другой Unicode?
DJMcMayhem
4
Как насчет законного использования этих персонажей? Zalgo в значительной степени только тогда, когда эти персонажи складываются друг с другом так, как никогда не предполагалось.
Draco18s
@DJMcMayhem У входной строки могут быть другие не-ASCII-символы, которые нельзя удалять.
полностью человек
1
@totallyhuman Я думал о более общем подходе: раздевание только в том случае, если после «стандартного» персонажа встречается более одного . Это нормально, но a͕̰его раздевают a. (Также теперь, благодаря детектору смайликов, я хочу придать смайликам диакритические знаки ... 🤔̘͕̑ пфф, это выглядит глупо)
Draco18s
2
Вы должны добавить несколько тестовых примеров с выходом не ASCII.
xnor

Ответы:

13

Сетчатка , 35 байт

T`̀-ͯ᪰-᫿᷀-᷿⃐-⃿︠-︯

Попробуйте онлайн!

Просто удаляет все символы в диапазонах, указанных в задании, из входных данных. Конечно, код супер нечитабелен, но концептуально он ничем не отличается от того, что T`0-9A-Za-zудаляет все буквенно-цифровые символы.

Мартин Эндер
источник
3
Кажется непобедимым для меня.
Эрик Outgolfer
@EriktheOutgolfer Я не знаю, я думаю, что Jelly может генерировать диапазоны кодов более эффективно, чем просто перечисление символов.
Мартин Эндер
На самом деле я не думаю, что это возможно.
Эрик Outgolfer
Я удивлен, что пока нет решения Jelly.
полностью человек
@icrieverytim здесь , и разорвать это дольше. Я не понял, как генерировать кодовые точки более эффективно, чем это: P
HyperNeutrino
7

Python 3 , 73 69 байт

-4 байта благодаря L3viathan.

Не уверен, что участие в вашем собственном соревновании - это нормально или нет, но ... Украл регулярное выражение и, в сущности, идею> < прямо из ответов JS и Retina.

lambda s:re.sub('[̀-ͯ᪰-᫿᷀-᷿⃐-⃿︠-︯]','',s)
import re

Попробуйте онлайн!

totallyhuman
источник
1
Сохраните 4 байта, сделав это обычным оператором импорта.
L3viathan
Вы забыли обновить количество байтов.
xnor
@xnor Ха? Кажется мне правильным
полностью человек
@totallyhuman Моя ошибка, пропустил, что эти символы многобайтовые.
xnor
Что ж, справедливо сказать, что я украл диапазон персонажей из ответа Retina. (Тем не менее, с осторожностью, так как мой редактор хотел удалить zalgo вместе с `.)
Нил
4

JavaScript (ES6), 55 байт

f=
s=>s.replace(/[̀-ͯ᪰-᫿᷀-᷿⃐-⃿︠-︯]/g,'')
<textarea oninput=o.textContent=f(this.value)></textarea><pre id=o>

Нил
источник
4

PHP, 67 байт

короче как выписать

<?=preg_replace("#[̀-ͯ᪰-᫿᷀-᷿⃐-⃿︠-︯]#u","",$argn);

Попробуйте онлайн!

PHP, 115 байт

<?=preg_replace("#[\u{300}-\u{36f}\u{1ab0}-\u{1aff}\u{1dc0}-\u{1dff}\u{20d0}-\u{20ff}\u{fe20}-\u{fe2f}]#u","",$argn);

Попробуйте онлайн!

PHP, 35 байт

Действительно для заданных тестовых случаев, удаляет все метки

<?=preg_replace("#\pM#u","",$argn);

Попробуйте онлайн!

Йорг Хюльсерманн
источник
@FelixDombek Нет, он заменяет только все Марки в данных диапазонах ничем
Йорг Хюльсерманн
3

Python 3, 127 118 байт

Просто простой ответ, давайте посмотрим, насколько это возможно.

lambda y:"".join(chr(x)for x in map(ord,y)if not(767<x<880or 6831<x<6912or 7615<x<7680or 8399<x<8448or 65055<x<65072))

Changelog:

  • Когда я когда-нибудь узнаю, что понимания короче, чем функциональные вещи (-9 байт).
L3viathan
источник
0orэто не вещь, поэтому вы должны исправить это, или он будет поднят SyntaxError.
Эрик Outgolfer
2
@EriktheOutgolfer Вы действительно проверяли это? Не
выдает
О верно. Я был немного смущен.
Эрик Outgolfer
2

APL (Dyalog Unicode) , 43 байта

'[̀-ͯ᪰-᫿᷀-᷿⃐-⃿︠-︯]'R''

Попробуйте онлайн!

PCRE R заменить всех тех, кто ничего


44-байтовая версия без RegEx или литералов странных символов (и, следовательно, одного байта на символ):

⍞~⎕UCS65055 8399 7615 6831 767+⍳¨16×2 6~⍨⍳7

Попробуйте онлайн! ⍳7 1… 7 (1 2 3 4 5 6 7)

2 6~⍨ кроме 2 и 6 (1 3 4 5 7)

16× умножить на 16 (16 48 64 80 112)

⍳¨ 1… каждый (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16, 1 2 3…,… 110 111 112)

+ добавить смещение к каждому списку (65056 65057 65058…,… 877 878 ​​879)

 подключить

⎕UCS преобразовать в соответствующий символ Unicode

⍞~ получить текстовый ввод и удалить все такие символы

Адам
источник
2

Желе , 32 байта

“Żȷ'⁺¦60ƭṖ_WTɦ7Ụ|ṫYɠF’bȷ5r2/FỌḟ@

Попробуйте онлайн!

объяснение

“Żȷ'⁺¦60ƭṖ_WTɦ7Ụ|ṫYɠF’bȷ5r2/FỌḟ@  Main link
“Żȷ'⁺¦60ƭṖ_WTɦ7Ụ|ṫYɠF’            Base 250 compressed integer; 768008790683206911076160767908400084476505665071
                      bȷ5         Convert into base 100000; [768, 879, 6832, 6911, 7616, 7679, 8400, 8447, 65056, 65071]
                         r2/      Inclusive range on non-overlapping slices of length 2
                            F     Flatten
                             Ọ    chr; cast to character from codepoints
                              ḟ@  Filter; remove all characters from input that are in the characters generated before
HyperNeutrino
источник
о0 Не понял, что я поднял этот вопрос. Это то, b65072что я думаю? : o
полностью человек
@icrieverytim да сжатие числового списка: D
HyperNeutrino
желе, безусловно, самый язык zalgo. Интересно, что произойдет, если вы запустите программу по собственному коду? редактировать: к сожалению ничего
космический мусор