NON COMETE - una sfida zalgo


25

Scrivi un programma o una funzione che, data una stringa, la spogli di zalgo, se esiste.

Zalgo

Per questo post, zalgo è definito come qualsiasi carattere dei seguenti intervalli Unicode:

  • Combinazione di segni diacritici (0300-036F)
  • Combinazione di segni diacritici estesi (1AB0–1AFF)
  • Supplemento combinazione segni diacritici (1DC0–1DFF)
  • Combinazione di segni diacritici per simboli (20D0–20FF)
  • Combinazione di mezze punte (FE20 – FE2F)

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

Ingresso

  • Può essere passato tramite argomenti della riga di comando, STDIN o qualsiasi altro metodo di input standard supportato dalla tua lingua
  • Sarà una stringa che può contenere o meno zalgo o altri caratteri non ASCII

Produzione

L'output dovrebbe essere una stringa che non contiene alcuno zalgo.

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

punteggio

Dato che si tratta di , vince la risposta più breve in byte.


3
Si garantisce che la stringa contenga solo ASCII e / o Zalgo? O può contenere altri unicode?
DJMcMayhem

4
Che dire degli usi legittimi di quei personaggi? Zalgo è praticamente solo quando quei personaggi impilare uno con l'altro in un modo che non è mai stato destinato.
Draco18s

@DJMcMayhem La stringa di input può contenere altri caratteri non ASCII che non devono essere rimossi.
totalmente umano

1
@totallyhuman Stavo pensando a un approccio più generico: rimuovere solo se si verifica più di uno dopo un carattere "standard". Va bene ma a͕̰viene messo a nudo a. (Anche ora, grazie al rilevatore di emoji, voglio mettere i segni diacritici sulle emoji ... 🤔̘͕̑ pfft, che sembra sciocco)
Draco18s

2
È necessario aggiungere alcuni casi di test con output non ASCII.
xnor

Risposte:


13

Retina , 35 byte

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

Provalo online!

Rimuove semplicemente tutti i personaggi negli intervalli indicati nella sfida dall'input. Il codice è super illeggibile ovviamente, ma concettualmente non è diverso da qualcosa del genere T`0-9A-Za-zche eliminerebbe tutti i caratteri alfanumerici.


3
Sembra abbastanza imbattibile per me.
Erik the Outgolfer,

@EriktheOutgolfer Non lo so, penso che Jelly potrebbe essere in grado di generare gli intervalli di punti di codice in modo più efficiente rispetto al semplice elenco dei caratteri.
Martin Ender,

In realtà non penso che sia in grado di farlo.
Erik the Outgolfer,

Sono sorpreso che non esista ancora una soluzione Jelly.
totalmente umano

@icrieverytim qui , e strappare è più lungo. Non ho capito come generare punti di codice in modo più efficace di questo: P
HyperNeutrino

7

Python 3 , 73 69 byte

-4 byte grazie a L3viathan.

Non sono sicuro che partecipare alla tua sfida sia giusto o no, ma ... Hai rubato la regex e sostanzialmente anche l'idea> < direttamente dalle risposte di JS e Retina.

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

Provalo online!


1
Salva 4 byte trasformandolo in una normale dichiarazione di importazione.
L3viathan,

Hai dimenticato di aggiornare il conteggio dei byte.
xnor

@xnor Huh? Mi sembra giusto.
totalmente umano

@totallyhuman Il mio errore, mancava che quei caratteri fossero multibyte.
xnor

Bene, è giusto dire che ho rubato la gamma di caratteri dalla risposta Retina. (Con cura però, dal momento che il mio editore voleva rimuovere lo zalgo insieme al `.)
Neil

4

JavaScript (ES6), 55 byte

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



4

PHP, 67 byte

più breve come la scrittura

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

Provalo online!

PHP, 115 byte

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

Provalo online!

PHP, 35 byte

Valido per i Testcase indicati rimuove tutti i Mark

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

Provalo online!


@FelixDombek No sostituisce solo tutti i segni nelle gamme indicate con nulla
Jörg Hülsermann

3

Python 3, 127 118 byte

Solo una risposta semplice per ora, vediamo quanto è giocabile.

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 imparerò mai che le comprensioni sono più brevi delle cose funzionali (-9 byte).

0ornon è una cosa, quindi devi ripararlo o aumenterà SyntaxError.
Erik the Outgolfer,

2
@EriktheOutgolfer Lo hai effettivamente testato? Non genera un errore per me su né Python 3 nè 2.
L3viathan

Oh giusto. Sono stato confuso per un po '.
Erik the Outgolfer,


2

APL (Dyalog Unicode) , 43 byte

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

Provalo online!

PCRE R eplace tutti coloro con niente


Versione a 44 byte che non utilizza RegEx o letterali di caratteri strani (e quindi byte singolo per carattere):

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

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

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

16× moltiplicare per 16 (16 48 64 80 112)

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

+ aggiungi offset a ciascun elenco (65056 65057 65058…,… 877 878 ​​879)

 arruolarsi (appiattire)

⎕UCS converti nel corrispondente carattere Unicode

⍞~ ottenere l'immissione di testo e rimuovere tutti questi caratteri


2

Gelatina , 32 byte

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

Provalo online!

Spiegazione

“Żȷ'⁺¦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

o0 Non mi ero reso conto di aver sollevato questa domanda su lol. È quello b65072che penso che sia? : o
totalmente umano il

@icrieverytim yes compressione dell'elenco numerico: D
HyperNeutrino

jelly è sicuramente la lingua più zalgo. mi chiedo cosa succederebbe se eseguissi il programma con il suo codice? modifica: purtroppo niente
spazio spazzatura


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.