HE COMETH NOT - un défi zalgo

25

Écrivez un programme ou une fonction qui, étant donné une chaîne, la supprimera de zalgo, le cas échéant.

Zalgo

Pour ce message, zalgo est défini comme n'importe quel caractère des plages Unicode suivantes:

  • Combinaison de signes diacritiques (0300–036F)
  • Combinaison des signes diacritiques étendue (1AB0–1AFF)
  • Supplément pour combinaison de signes diacritiques (1DC0–1DFF)
  • Combinaison de signes diacritiques pour les symboles (20D0–20FF)
  • Combinaison de demi-repères (FE20 – FE2F)

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

Contribution

  • Peut être transmis via des arguments de ligne de commande, STDIN ou toute autre méthode d'entrée standard prise en charge par votre langue
  • Sera une chaîne qui peut contenir ou non zalgo ou d'autres caractères non ASCII

Sortie

La sortie doit être une chaîne qui ne contient aucun zalgo.

Cas de test

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

Notation

Comme il s'agit de , la réponse la plus courte en octets l'emporte.

totalement humain
la source
3
La chaîne est-elle garantie de ne contenir que ASCII et / ou Zalgo? Ou peut-il contenir d'autres Unicode?
DJMcMayhem
4
Qu'en est-il des utilisations légitimes de ces personnages? Zalgo est à peu près que lorsque ces caractères pile entre eux d'une manière qui n'a jamais été destiné.
Draco18s
@DJMcMayhem La chaîne d'entrée peut contenir d'autres caractères non ASCII qui ne doivent pas être supprimés.
totalement humain
1
@totallyhuman Je pensais à une approche plus générique: ne supprimer que si plusieurs se produisent après un caractère "standard". C'est très bien, mais se a͕̰fait dépouiller a. (Aussi maintenant, grâce au détecteur d'emoji, je veux mettre des diacritiques sur les emoji ... 🤔̘͕̑ pfft, ça a l'air idiot)
Draco18s
2
Vous devez ajouter des cas de test avec une sortie non ASCII.
xnor

Réponses:

13

Rétine , 35 octets

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

Essayez-le en ligne!

Supprime simplement tous les caractères dans les plages données dans le défi de l'entrée. Le code est super illisible bien sûr, mais le code n'est pas conceptuellement différent de quelque chose comme T`0-9A-Za-zqui supprimerait tous les caractères alphanumériques.

Martin Ender
la source
3
Semble assez imbattable pour moi.
Erik the Outgolfer
@EriktheOutgolfer Je ne sais pas, je pense que Jelly pourrait être capable de générer les plages de points de code plus efficacement que de simplement lister les caractères.
Martin Ender
En fait, je ne pense pas que ce soit possible.
Erik the Outgolfer
Je suis surpris qu'il n'y ait pas encore de solution Jelly.
2017 totalement humain
@icrieverytim ici , et rip c'est plus long. Je n'ai pas compris comment générer des points de code plus efficacement que cela: P
HyperNeutrino
7

Python 3 , 73 69 octets

-4 octets grâce à L3viathan.

Je ne sais pas si participer à votre propre défi est ok ou pas mais ... J'ai volé l'expression régulière et essentiellement l'idée aussi> < directement à partir des réponses JS et Retina.

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

Essayez-le en ligne!

totalement humain
la source
1
Économisez 4 octets en faisant une déclaration d'importation normale.
L3viathan
Vous avez oublié de mettre à jour le nombre d'octets.
xnor
@xnor Huh? Cela me semble juste.
totalement humain
@totallyhuman Mon erreur, j'ai manqué que ces caractères soient multi-octets.
xnor
Eh bien, il est juste de dire que j'ai volé la plage de caractères de la réponse Retina. (Mais avec prudence, puisque mon éditeur voulait supprimer le zalgo avec le `.)
Neil
4

JavaScript (ES6), 55 octets

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

Neil
la source
4

PHP, 67 octets

plus court que l'écriture

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

Essayez-le en ligne!

PHP, 115 octets

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

Essayez-le en ligne!

PHP, 35 octets

Valable pour les cas de test donnés, il supprime toutes les marques

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

Essayez-le en ligne!

Jörg Hülsermann
la source
@FelixDombek Non, il ne remplace que toutes les marques des gammes données par rien
Jörg Hülsermann
3

Python 3, 127 118 octets

Juste une réponse simple pour l'instant, voyons à quel point c'est golfable.

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

Journal des modifications:

  • Quand est-ce que j'apprendrai jamais que les compréhensions sont plus courtes que les choses fonctionnelles (-9 octets).
L3viathan
la source
0orn'est pas une chose, vous devez donc le réparer ou il augmentera SyntaxError.
Erik the Outgolfer
2
@EriktheOutgolfer L'avez-vous testé? Ne
génère
Ah oui. J'étais un peu confus.
Erik the Outgolfer
3

Bash + coreutils, 41

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

Supprime simplement les caractères dans les plages données.

Essayez-le en ligne .

Traumatisme numérique
la source
2

APL (Dyalog Unicode) , 43 octets

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

Essayez-le en ligne!

PCRE R eplace tous ceux qui ont rien


Version de 44 octets n'utilisant pas RegEx ou des littéraux de caractères étranges (et donc un seul octet par caractère):

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

Essayez-le en ligne! ⍳7 1… 7 (1 2 3 4 5 6 7)

2 6~⍨ sauf 2 et 6 (1 3 4 5 7)

16× multiplier par 16 (16 48 64 80112)

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

+ ajouter un décalage à chaque liste (65056 65057 65058…,… 877 878 ​​879)

 enrôler (aplatir)

⎕UCS convertir en caractère Unicode correspondant

⍞~ obtenir la saisie de texte et supprimer tous ces caractères

Adam
la source
2

Gelée , 32 octets

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

Essayez-le en ligne!

Explication

“Żȷ'⁺¦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
la source
o0 Je ne savais pas que j'avais remonté cette question lol. C'est ce b65072que je pense que c'est? : o
totalement humain
@icrieverytim oui compression de liste numérique: D
HyperNeutrino
la gelée est certainement la langue la plus zalgo. Je me demande ce qui se passerait si vous exécutiez le programme sur son propre code? edit: malheureusement rien
jonque spatiale
1

Java 8, 57 octets

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

Essayez-le ici.

Kevin Cruijssen
la source