NO VIENE: un desafío zalgo

25

Escriba un programa o función que, dada una cadena, lo quitará de zalgo, si existe alguno.

Zalgo

Para esta publicación, zalgo se define como cualquier personaje de los siguientes rangos Unicode:

  • Combinación de marcas diacríticas (0300–036F)
  • Combinación de marcas diacríticas extendidas (1AB0–1AFF)
  • Suplemento de combinación de marcas diacríticas (1DC0–1DFF)
  • Combinación de marcas diacríticas para símbolos (20D0–20FF)
  • Combinación de medias marcas (FE20 – FE2F)

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

Entrada

  • Se puede pasar a través de argumentos de línea de comando, STDIN o cualquier otro método estándar de entrada compatible con su idioma
  • Será una cadena que puede contener o no zalgo u otros caracteres no ASCII

Salida

La salida debe ser una cadena que no contenga ningún zalgo.

Casos de prueba

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

Tanteo

Como se trata de , gana la respuesta más corta en bytes.

totalmente humano
fuente
3
¿Se garantiza que la cadena solo contenga ASCII y / o Zalgo? ¿O puede contener otro Unicode?
DJMcMayhem
44
¿Qué pasa con los usos legítimos de esos personajes? Zalgo es prácticamente solo cuando esos personajes se apilan entre sí de una manera que nunca fue pensada.
Draco18s
@DJMcMayhem La cadena de entrada puede tener otros caracteres no ASCII que no deben eliminarse.
Totalmente humano
1
@totallyhuman Estaba pensando en un enfoque más genérico: solo eliminar si ocurre más de uno después de un carácter "estándar". Eso está bien, pero a͕̰se desnuda a. (También ahora, gracias al detector de emojis, quiero poner diacríticos en emoji ... 🤔̘͕̑ pfft, eso se ve tonto)
Draco18s
2
Debe agregar algunos casos de prueba con salida no ASCII.
xnor

Respuestas:

13

Retina , 35 bytes

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

Pruébalo en línea!

Simplemente elimina todos los caracteres en los rangos dados en el desafío de la entrada. El código es súper ilegible, por supuesto, pero conceptualmente no es diferente de algo como T`0-9A-Za-zlo que eliminaría todos los caracteres alfanuméricos.

Martin Ender
fuente
3
Me parece inmejorable.
Erik the Outgolfer
@EriktheOutgolfer No lo sé, creo que Jelly podría generar los rangos de puntos de código de manera más eficiente que simplemente enumerar los caracteres.
Martin Ender
En realidad no creo que sea capaz.
Erik el Outgolfer
Me sorprende que aún no haya una solución Jelly.
totalmente humano
@icrieverytim aquí , y rasgar es más largo. No he descubierto cómo generar puntos de código más efectivamente que esto: P
HyperNeutrino
7

Python 3 , 73 69 bytes

-4 bytes gracias a L3viathan.

No estoy seguro de si participar en su propio desafío está bien o no, pero ... Robó la expresión regular y esencialmente también la idea> < directamente de las respuestas de JS y Retina.

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

Pruébalo en línea!

totalmente humano
fuente
1
Ahorre 4 bytes convirtiéndolo en una declaración de importación normal.
L3viathan
Olvidó actualizar el recuento de bytes.
xnor
@xnor ¿Eh? Me parece bien.
Totalmente humano
@totallyhuman Mi error, extrañé que esos char sean multibyte.
xnor
Bueno, es justo decir que robé el rango de caracteres de la respuesta Retina. (Sin embargo, con cuidado, ya que mi editor quería eliminar el zalgo junto con el `.)
Neil
4

JavaScript (ES6), 55 bytes

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

Neil
fuente
4

PHP, 67 bytes

más corto como el escribir

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

Pruébalo en línea!

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

Pruébalo en línea!

PHP, 35 bytes

Válido para los Casos de prueba dados, elimina todas las Marcas

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

Pruébalo en línea!

Jörg Hülsermann
fuente
@FelixDombek No, solo reemplaza todas las Marcas en los rangos dados sin nada
Jörg Hülsermann
3

Pitón 3, 127 118 bytes

Solo una respuesta directa por ahora, veamos cuán golfable es.

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

Registro de cambios:

  • ¿Cuándo aprenderé alguna vez que las comprensiones son más cortas que las cosas funcionales (-9 bytes)?
L3viatán
fuente
0orno es una cosa, así que tienes que arreglarlo o aumentará SyntaxError.
Erik the Outgolfer
2
@EriktheOutgolfer ¿Realmente lo probaste? No arroja un error para mí ni en Python 3 ni 2.
L3viathan
Correcto. Estaba confundido por un momento.
Erik the Outgolfer
3

Bash + coreutils, 41

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

Simplemente elimina los caracteres en los rangos dados.

Pruébalo en línea .

Trauma digital
fuente
2

APL (Dyalog Unicode) , 43 bytes

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

Pruébalo en línea!

PCRE R eplace todos aquellos con nada


Versión de 44 bytes que no usa RegEx o literales de caracteres extraños (y, por lo tanto, un solo byte por carácter):

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

Pruébalo en línea! ⍳7 1… 7 (1 2 3 4 5 6 7)

2 6~⍨ excepto 2 y 6 (1 3 4 5 7)

16× multiplicar por 16 (16 48 64 80112)

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

+ agregar desplazamiento a cada lista (65056 65057 65058…,… 877 878 ​​879)

 alistarse (aplanar)

⎕UCS convertir al carácter Unicode correspondiente

⍞~ obtener entrada de texto y eliminar todos esos caracteres

Adán
fuente
2

Jalea , 32 bytes

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

Pruébalo en línea!

Explicación

“Żȷ'⁺¦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
Hiperneutrino
fuente
o0 No me di cuenta de que hice esta pregunta jajaja. ¿Es eso b65072lo que creo que es? : o
totalmente humano
@icrieverytim sí compresión de lista numérica: D
HyperNeutrino
Jelly es definitivamente el lenguaje más zalgo. Me pregunto qué pasaría si ejecutaras el programa en su propio código. editar: desafortunadamente nada
basura espacial
1

Java 8, 57 bytes

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

Pruébalo aquí.

Kevin Cruijssen
fuente