ER KOMMT NICHT - eine Zalgo-Herausforderung

25

Schreiben Sie ein Programm oder eine Funktion, die bei gegebener Zeichenfolge zalgo entfernt, falls vorhanden.

Zalgo

In diesem Beitrag wird Zalgo als ein beliebiges Zeichen aus den folgenden Unicode-Bereichen definiert:

  • Kombinieren diakritischer Zeichen (0300–036F)
  • Erweiterte Kombination diakritischer Zeichen (1AB0–1AFF)
  • Ergänzung zur Kombination diakritischer Zeichen (1DC0–1DFF)
  • Kombinieren diakritischer Zeichen für Symbole (20D0–20FF)
  • Kombinieren von Halbwerten (FE20 – FE2F)

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

Eingang

  • Kann über Befehlszeilenargumente, STDIN oder eine andere von Ihrer Sprache unterstützte Standardeingabemethode übergeben werden
  • Wird eine Zeichenfolge sein, die möglicherweise zalgo oder andere Nicht-ASCII-Zeichen enthält oder nicht

Ausgabe

Die Ausgabe sollte eine Zeichenfolge sein, die kein Zalgo enthält.

Testfälle

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

Wertung

Da es sich um , kürzeste Antwort in Bytes gewinnt.

total menschlich
quelle
3
Enthält der String garantiert nur ASCII und / oder Zalgo? Oder kann es einen anderen Unicode enthalten?
DJMcMayhem
4
Was ist mit legitimen Verwendungen dieser Charaktere? Zalgo ist so ziemlich nur dann , wenn diese Zeichen stapeln miteinander in einer Weise , die nie beabsichtigt war.
Draco18s
@DJMcMayhem Die Eingabezeichenfolge enthält möglicherweise andere Nicht-ASCII-Zeichen, die nicht entfernt werden dürfen.
totalhuman
1
@totallyhuman Ich dachte über einen allgemeineren Ansatz nach: Strippen nur, wenn mehr als einer nach einem "Standard" -Zeichen auftritt. Das ist in Ordnung, wird aber a͕̰ausgezogen a. (Auch jetzt möchte ich dank des Emoji-Detektors Diakritika auf Emoji setzen ... 🤔̘͕̑ pfft, das sieht albern aus)
Draco18s
2
Sie sollten einige Testfälle mit Nicht-ASCII-Ausgabe hinzufügen.
xnor

Antworten:

13

Retina , 35 Bytes

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

Probieren Sie es online!

Entfernt einfach alle Zeichen in den in der Abfrage angegebenen Bereichen aus der Eingabe. Der Code ist natürlich super unlesbar, aber der Code unterscheidet sich konzeptionell nicht von etwas, bei T`0-9A-Za-zdem alle alphanumerischen Zeichen gelöscht würden.

Martin Ender
quelle
3
Scheint mir unschlagbar genug.
Erik der Outgolfer
@EriktheOutgolfer Ich weiß nicht, ich glaube, Jelly kann die Codepunktbereiche effizienter generieren, als nur die Zeichen aufzulisten.
Martin Ender
Eigentlich glaube ich nicht, dass es dazu in der Lage ist.
Erik der Outgolfer
Ich bin überrascht, dass es noch keine Lösung für Jelly gibt .
Totalhuman
@icrieverytim hier und rippen es ist länger. Ich habe nicht herausgefunden, wie Codepunkte effektiver generiert werden können: P
HyperNeutrino
7

Python 3 , 73 69 Bytes

-4 Bytes dank L3viathan.

Ich bin mir nicht sicher, ob es in Ordnung ist, an Ihrer eigenen Herausforderung teilzunehmen, oder nicht, aber ... Ich habe den Regex und im Wesentlichen auch die Idee gestohlen > < direkt aus den Antworten von JS und Retina.

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

Probieren Sie es online!

total menschlich
quelle
1
Sparen Sie 4 Bytes, indem Sie dies zu einer normalen Importanweisung machen.
L3viathan
Sie haben vergessen, die Byteanzahl zu aktualisieren.
xnor
@xnor Huh? Scheint mir recht zu sein.
Totalhuman
@totallyhuman Mein Fehler, habe verpasst, dass diese Zeichen Multibyte sind.
Xnor
Nun, es ist fair zu sagen, dass ich die Zeichenbreite aus der Retina-Antwort gestohlen habe. (Vorsicht, mein Redakteur wollte den Zalgo zusammen mit dem entfernen `.)
Neil
4

JavaScript (ES6), 55 Byte

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

Neil
quelle
4

PHP, 67 Bytes

kürzer als das ausschreiben

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

Probieren Sie es online!

PHP, 115 Bytes

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

Probieren Sie es online!

PHP, 35 Bytes

Gültig für die angegebenen Testfälle entfernt es alle Markierungen

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

Probieren Sie es online!

Jörg Hülsermann
quelle
@FelixDombek Nein, es werden nur alle Marken in den angegebenen Bereichen durch nichts ersetzt
Jörg Hülsermann
3

Python 3, 127 118 Bytes

Nur eine einfache Antwort für den Moment, lassen Sie uns sehen, wie gut es ist, Golf zu spielen.

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

Änderungsprotokoll:

  • Wann werde ich jemals erfahren, dass das Verstehen kürzer ist als das Funktionale (-9 Bytes)?
L3viathan
quelle
0orist keine Sache, also musst du es reparieren oder es wird erhöht SyntaxError.
Erik der Outgolfer
2
@EriktheOutgolfer Hast du es tatsächlich getestet?
Wirft
Oh, richtig. Ich war ein bisschen verwirrt.
Erik der Outgolfer
3

Bash + Coreutils, 41

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

Entfernen Sie einfach die Zeichen in den angegebenen Bereichen.

Probieren Sie es online aus .

Digitales Trauma
quelle
2

APL (Dyalog Unicode) , 43 Byte

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

Probieren Sie es online!

PCRE R eplace alle , die mit nichts


44-Byte-Version ohne RegEx oder fremde Zeichenliterale (und damit Einzelbyte pro Zeichen):

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

Probieren Sie es online! ⍳7 1… 7 (1 2 3 4 5 6 7)

2 6~⍨ außer 2 und 6 (1 3 4 5 7)

16× multiplizieren mit 16 (16 48 64 80 112)

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

+ Offset zu jeder Liste hinzufügen (65056 65057 65058…,… 877 878 ​​879)

 eintreten (abflachen)

⎕UCS in das entsprechende Unicode-Zeichen konvertieren

⍞~ Holen Sie sich Texteingabe und entfernen Sie alle diese Zeichen

Adam
quelle
2

Gelee , 32 Bytes

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

Probieren Sie es online!

Erläuterung

“Żȷ'⁺¦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
quelle
o0 Wusste nicht, dass ich diese Frage aufgeworfen habe, lol. Ist es das, b65072was ich denke? : o
totalhuman
@icrieverytim ja numerische Listenkomprimierung: D
HyperNeutrino
Gelee ist definitiv die Zalgo-Sprache. Ich frage mich, was passieren würde, wenn Sie das Programm mit eigenem Code ausführen würden. Bearbeiten: leider nichts
Weltraummüll
1

Java 8, 57 Bytes

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

Probieren Sie es hier aus.

Kevin Cruijssen
quelle