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 a͕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):

⍞~⎕UCS∊65055 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.