ELE NÃO VÊ - um desafio zalgo

25

Escreva um programa ou função que, dada uma string, retire o zalgo, se houver algum.

Zalgo

Para esta postagem, zalgo é definido como qualquer caractere dos seguintes intervalos Unicode:

  • Combinação de marcas diacríticas (0300-036F)
  • Combinação de marcas diacríticas estendidas (1AB0–1AFF)
  • Suplemento Combinando Marcas Diacríticas (1DC0–1DFF)
  • Combinação de marcas diacríticas para símbolos (20D0–20FF)
  • Combinando meias marcas (FE20 – FE2F)

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

Entrada

  • Pode ser transmitido por meio de argumentos da linha de comando, STDIN ou qualquer outro método padrão de entrada suportado pelo seu idioma
  • Será uma sequência que pode ou não conter zalgo ou outros caracteres não ASCII

Saída

A saída deve ser uma sequência que não contenha zalgo.

Casos de teste

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

Pontuação

Como esse é o , a resposta mais curta em bytes vence.

totalmente humano
fonte
3
É garantido que a string contenha apenas ASCII e / ou Zalgo? Ou pode conter outro unicode?
DJMcMayhem
4
E o uso legítimo desses personagens? Zalgo é praticamente apenas quando esses personagens empilhar uns com os outros de uma forma que nunca foi destinado.
Draco18s
@DJMcMayhem A cadeia de entrada pode ter outros caracteres não ASCII que não devem ser removidos.
totallyhuman
1
@totallyhuman Eu estava pensando em uma abordagem mais genérica: remover somente se mais de um ocorrer após um caracter "padrão". Isso é bom, mas a͕̰é despojado a. (Também agora, graças ao detector emoji, eu quero colocar diacríticos no emoji ... 🤔̘͕̑ pfft, que parece bobo)
Draco18s
2
Você deve adicionar alguns casos de teste com saída não ASCII.
Xnor

Respostas:

13

Retina , 35 bytes

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

Experimente online!

Simplesmente remove todos os caracteres nos intervalos indicados no desafio da entrada. O código é super ilegível, é claro, mas conceitualmente não é diferente de algo T`0-9A-Za-zque excluiria todos os caracteres alfanuméricos.

Martin Ender
fonte
3
Parece imbatível o suficiente para mim.
Erik the Outgolfer
@EriktheOutgolfer Não sei, acho que a Jelly pode gerar os intervalos de pontos de código com mais eficiência do que apenas listar os caracteres.
Martin Ender
Na verdade, eu não acho que é capaz.
Erik the Outgolfer
Estou surpreso por ainda não haver uma solução de geléia.
totallyhuman
@icrieverytim aqui , e rasgue mais. Eu ainda não descobri como gerar codepoints de forma mais eficaz do que isso: P
HyperNeutrino
7

Python 3 , 73 69 bytes

-4 bytes graças ao L3viathan.

Não tenho certeza se participar do seu próprio desafio está ok ou não, mas ... Roubei o regex e também a idéia, essencialmente> < direto das respostas JS e Retina.

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

Experimente online!

totalmente humano
fonte
1
Salve 4 bytes, tornando isso uma declaração de importação normal.
L3viathan
Você esqueceu de atualizar a contagem de bytes.
Xnor
@xnor Huh? Parece certo para mim.
totallyhuman
@totallyhuman Meu erro, perdi que esses caracteres são multibyte.
Xnor
Bem, é justo dizer que roubei o intervalo de caracteres da resposta da Retina. (Com cuidado, porém, desde que meu editor queria remover o zalgo juntamente com o `.)
Neil
4

JavaScript (ES6), 55 bytes

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

Neil
fonte
4

PHP, 67 bytes

mais curto quanto a gravação

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

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

Experimente online!

PHP, 35 bytes

Válido para os casos de teste fornecidos, ele remove todas as marcas

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

Experimente online!

Jörg Hülsermann
fonte
@FelixDombek Sem ele substitui apenas todas as marcas nas gamas dadas com nada
Jörg Hülsermann
3

Python 3, 127 118 bytes

Apenas uma resposta direta por enquanto, vamos ver como é jogável.

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:

  • Quando é que vou aprender que as compreensões são mais curtas que as coisas funcionais (-9 bytes).
L3viathan
fonte
0ornão é uma coisa, então você tem que consertar ou aumentará SyntaxError.
Erik the Outgolfer
2
@EriktheOutgolfer Você realmente testou? Não lançar um erro para mim em nenhum Python 3 ou 2.
L3viathan
Oh, certo. Fiquei um pouco confuso.
Erik the Outgolfer
3

Bash + coreutils, 41

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

Simplesmente retira caracteres nos intervalos especificados.

Experimente online .

Trauma Digital
fonte
2

APL (Dyalog Unicode) , 43 bytes

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

Experimente online!

PCRE R moran Jr. todos aqueles com nada


Versão de 44 bytes que não usa RegEx ou literais de caracteres estranhos (e, portanto, um único byte por caractere):

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

Experimente online! ⍳7 1… 7 (1 2 3 4 5 6 7)

2 6~⍨ exceto 2 e 6 (1 3 4 5 7)

16× multiplicar por 16 (16 48 64 80 112)

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

+ adicione deslocamento a cada lista (65056 65057 65058…,… 877 878 ​​879)

 alistar-se (achatar)

⎕UCS converter para o caractere Unicode correspondente

⍞~ obter entrada de texto e remover todos esses caracteres

Adão
fonte
2

Geléia , 32 bytes

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

Experimente online!

Explicação

“Żȷ'⁺¦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
fonte
o0 Não percebi que esbarrei nessa questão lol. É isso b65072que eu acho que é? : o
totalmente humano
@icrieverytim sim compactação da lista numérica: D
HyperNeutrino
geléia é definitivamente a linguagem mais zalgo. Eu me pergunto o que aconteceria se você executasse o programa em seu próprio código? editar: infelizmente nada
space junk
1

Java 8, 57 bytes

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

Experimente aqui.

Kevin Cruijssen
fonte