NIE PRZYSTAJE - wyzwanie zalgo

25

Napisz program lub funkcję, która po danym łańcuchu usunie go z zalgo, jeśli taki istnieje.

Zalgo

W tym poście zalgo jest zdefiniowane jako dowolny znak z następujących zakresów Unicode:

  • Łączenie znaków diakrytycznych (0300–036F)
  • Rozszerzone łączenie znaków diakrytycznych (1AB0–1AFF)
  • Suplement łączący znaki diakrytyczne (1DC0–1DFF)
  • Łączenie znaków diakrytycznych symboli (20D0–20FF)
  • Łączenie pół znaków (FE20 – FE2F)

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

Wkład

  • Może być przekazywany za pomocą argumentów wiersza poleceń, STDIN lub innej standardowej metody wprowadzania obsługiwanej przez Twój język
  • Będzie ciągiem, który może zawierać lub nie zawierać zalgo lub innych znaków spoza ASCII

Wydajność

Dane wyjściowe powinny być ciągiem, który nie zawiera żadnego zalgo.

Przypadki testowe

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
⚡⃤       -> ⚡

Punktacja

Ponieważ jest to , wygrywa najkrótsza odpowiedź w bajtach.

całkowicie ludzki
źródło
3
Czy ciąg znaków zawiera tylko ASCII i / lub Zalgo? A może może zawierać inny Unicode?
DJMcMayhem
4
Co z uzasadnionym wykorzystaniem tych znaków? Zalgo jest właściwie tylko wtedy, gdy te postacie łączą się ze sobą w sposób, który nigdy nie był przeznaczony.
Draco18s,
@DJMcMayhem Łańcuch wejściowy może zawierać inne znaki spoza ASCII, których nie można usunąć.
całkowicie ludzki,
1
@ Totallyhuman Myślałem o bardziej ogólnym podejściu: rozbierać się tylko wtedy, gdy występuje więcej niż jeden po „standardowej” postaci. To jest w porządku, ale a͕̰zostaje rozebrane a. (Teraz też, dzięki wykrywaczowi emoji, chcę nałożyć emoji na znaki diakrytyczne ... 🤔̘͕̑ pfft, to wygląda głupio)
Draco18s
2
Powinieneś dodać kilka przypadków testowych z danymi wyjściowymi innymi niż ASCII.
xnor

Odpowiedzi:

13

Siatkówka , 35 bajtów

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

Wypróbuj online!

Po prostu usuwa wszystkie dane z zakresu podanego w wyzwaniu z danych wejściowych. Kod jest oczywiście bardzo nieczytelny, ale kod koncepcyjnie nie różni się niczym od czegoś, T`0-9A-Za-zco skasowałoby wszystkie znaki alfanumeryczne.

Martin Ender
źródło
3
Wydaje mi się to nie do pokonania.
Erik the Outgolfer,
@EriktheOutgolfer Nie wiem, myślę, że Jelly może być w stanie wygenerować zakresy punktów kodowych bardziej efektywnie niż tylko wypisywanie znaków.
Martin Ender
Właściwie nie sądzę, że jest w stanie.
Erik the Outgolfer,
Dziwię się, że nie ma jeszcze rozwiązania Jelly.
całkowicieludzki
@icrieverytim tutaj i zgrać to dłużej. Nie wymyśliłem, jak efektywniej generować
współrzędne kodu
7

Python 3 , 73 69 bajtów

-4 bajty dzięki L3viathan.

Nie jestem pewien, czy uczestnictwo w swoim wyzwaniu jest w porządku, czy nie, ale ... Ukradnij wyrażenie regularne i zasadniczo także pomysł> < prosto z odpowiedzi JS i Retina.

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

Wypróbuj online!

całkowicie ludzki
źródło
1
Zaoszczędź 4 bajty, tworząc normalną instrukcję importu.
L3viathan
Zapomniałeś zaktualizować liczbę bajtów.
xnor
@xnor Huh? Wydaje mi się słuszne.
całkowicie ludzki,
@totallyhuman Mój błąd, przegapiłem, że te znaki są wielobajtowe.
xnor
Cóż, można powiedzieć, że ukradłem zakres postaci z odpowiedzi Retina. (Jednak ostrożnie, ponieważ mój redaktor chciał usunąć zalgo wraz z `.)
Neil
4

JavaScript (ES6), 55 bajtów

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

Neil
źródło
4

PHP, 67 bajtów

krótszy jak napisać

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

Wypróbuj online!

PHP, 115 bajtów

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

Wypróbuj online!

PHP, 35 bajtów

Obowiązuje dla podanych przypadków testowych, usuwa wszystkie znaki

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

Wypróbuj online!

Jörg Hülsermann
źródło
@FelixDombek Nie, zastępuje tylko wszystkie znaki w podanych zakresach niczym
Jörg Hülsermann
3

Python 3, 127 118 bajtów

Na razie prosta odpowiedź, zobaczmy, jak można grać w golfa.

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

Dziennik zmian:

  • Kiedy kiedykolwiek nauczę się, że rozumienie jest krótsze niż funkcjonalne (-9 bajtów).
L3viathan
źródło
0ornie jest rzeczą, więc musisz to naprawić, bo inaczej się podniesie SyntaxError.
Erik the Outgolfer,
2
@EriktheOutgolfer Czy faktycznie to przetestowałeś? Nie rzuca mi błędu ani w Pythonie 3, ani w 2.
L3viathan
No tak. Byłem trochę zmieszany.
Erik the Outgolfer
3

Bash + coreutils, 41

tr -d '̀-ͯ᪰-᫿᷀-᷿⃐-⃿︠-︯'

Po prostu usuwa znaki z podanych zakresów.

Wypróbuj online .

Cyfrowa trauma
źródło
2

APL (Dyalog Unicode) , 43 bajty

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

Wypróbuj online!

PCRE R EUmieãæ tych wszystkich, z niczym


Wersja 44-bajtowa nie korzystająca z RegEx lub literałów dziwnych znaków (a zatem pojedynczy bajt na znak):

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

Wypróbuj online! ⍳7 1… 7 (1 2 3 4 5 6 7)

2 6~⍨ z wyjątkiem 2 i 6 (1 3 4 5 7)

16× pomnóż przez 16 (16 48 64 80 112)

⍳¨ 1… każdy (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16, 1 2 3…,… 110 111 112)

+ dodaj przesunięcie do każdej listy (65056 65057 65058…,… 877 878 ​​879)

 zaciągnąć się (spłaszczyć)

⎕UCS przekonwertować na odpowiedni znak Unicode

⍞~ wprowadź tekst i usuń wszystkie takie znaki

Adám
źródło
2

Galaretka , 32 bajty

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

Wypróbuj online!

Wyjaśnienie

“Żȷ'⁺¦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
źródło
o0 Nie wiedziałem, że podniosłem to pytanie lol. Czy tak b65072myślę? : o
całkowicieludzki
@icrieverytim tak kompresja listy numerycznej: D
HyperNeutrino
galaretka to zdecydowanie najbardziej zalgo język. zastanawiam się, co by się stało, gdybyś uruchomił program na swoim własnym kodzie? edycja: niestety nic
śmieci kosmiczne
1

Java 8, 57 bajtów

s->s.replaceAll("[̀-ͯ᪰-᫿᷀-᷿⃐-⃿︠-︯]","")

Wypróbuj tutaj.

Kevin Cruijssen
źródło