È un'emoji?


17

Di recente ho lavorato su questa app iOS e ho riscontrato un problema (piuttosto facile da risolvere): come faccio a determinare se la mia stringa è composta solo da emoji?

Bene, questo è il tuo lavoro oggi!

Ingresso

Una stringa. Se la presenza di caratteri unicode è problematica per te, puoi utilizzare un formato ragionevole diverso. Indica cosa fai se fai qualcosa di diverso da una normale stringa per ricevere input.

Produzione

Stampa o restituisce un valore di verità se la stringa di input contiene solo emoji e un valore di falsa se contiene caratteri diversi dagli emoji.

Aspetta un secondo ... cos'è un'emoji? 😅

Un'emoji è un personaggio che rientra in questi intervalli:

0x1F600...0x1F64F  // Emoticons
0x1F300...0x1F5FF  // Misc Symbols and Pictographs
0x1F680...0x1F6FF  // Transport and Map
0x2600...0x26FF    // Misc symbols
0x2700...0x27BF    // Dingbats
0xFE00...0xFE0F    // Variation Selectors

(Penso)

Questo è 🔹 🔹, quindi vince il codice più breve in byte❕

Casi test

"Is it an emoji? 🤔" -> False
"🔹code-golf🔹" -> False
"😮 😥 😨 😩 😪" -> False
"I have no fancy emojis :(" -> False

"😎" -> True
"😊😘" -> True

Per voi povere anime che non riescono a vedere gli emoji, ecco un'immagine dei casi di test .


2
Forse includere una versione (forse un'immagine) per coloro che non riescono a vedere gli emoji? ;-)
ETHproductions

@ETHproductions, mi consigliate di collegarmi a una foto dei casi di test o qualcos'altro?
Daniel,

Bene, ci sono emoji sparsi in tutta la domanda, ma immagino che gli unici davvero importanti siano nei casi di test, quindi un'immagine di solo i casi di test funzionerà.
ETHproductions

@ETHproductions, ho aggiunto un link a una foto dei casi di test
Daniel

L'input può essere una matrice numerica di punti di codice Unicode? Inoltre, quale intervallo di caratteri / numeri può contenere l'input?
Luis Mendo il

Risposte:


2

Rubino , 61 56 + 1 = 62 57 47 byte

Utilizza il -nflag e accetta input da STDIN. stampe0 per verità e nilfalsità.

-5 byte perché per qualche motivo inizialmente pensavo che la soluzione regex non avrebbe funzionato ???

-10 byte da NieDzejkob per aver notato una sovrapposizione di punti di codice che mi mancava: o

p$_=~/^[🌀-🙏🚀-🛿☀-➿︀-︀️]*$/

Provalo online!


1
47 byte se si uniscono due intervalli nel regex.
NieDzejkob,

1
Sono 47 non è vero?
Solo Tuhid, il

Sì, ho dimenticato di aggiornare il punteggio dopo aver ricevuto il suggerimento da @NieDzejkob
Value Ink

10

Emojicode , 179 byte

🍇a🍨🐚🚂➡🚂🔂n🍡a🍇🍊🎉🎉◀n 9728🎊▶n 10175◀n 65024🎉🎉🎊▶n 65039◀n 127744🎊▶n 128591◀n 128640▶n 128767🍇🍎0🍉🍉🍎1🍉

Un callable che accetta un elenco di numeri interi che rappresentano i punti di codice e restituisce 1 o 0.

Provalo online!

Emojicode , 187 byte

🍇a🔡➡👌🔂i🍡a🍇🍦n🚂i🍊🎉🎉◀n 9728🎊▶n 10175◀n 65024🎉🎉🎊▶n 65039◀n 127744🎊▶n 128591◀n 128640▶n 128767🍇🍎👎🍉🍉🍎👍🍉

Un callable che prende una stringa e restituisce un valore booleano.

Provalo online!

Ungolfed e spiegato

👴 A callable that takes a 🔡 called input and returns a 👌
🍇 input 🔡 ➡ 👌
 👴 For each character in input
 🔂 character 🍡 input 🍇
  👴 Create a frozen called n containing the unicode codepoint of character
  🍦 n 🚂 character
  👴 If the value is in one of specific ranges, return 👎 (if the current character is not an emoji)
  🍊🎉🎉◀n 9728🎊▶n 10175◀n 65024🎉🎉🎊▶n 65039◀n 127744🎊▶n 128591◀n 128640▶n 128767🍇
   🍎 👎
  🍉
 🍉
 👴 Since we're here, all characters are an emoji, so return 👍
 🍎👍
🍉

Provalo online!


1

JavaScript, 83 61 byte

-22 byte grazie a @Shaggy

s=>(s.match(/\ud83d[\ude00-\ude4f]/g)||"").length==s.length/2

dimostrazione

f=s=>(s.match(/\ud83d[\ude00-\ude4f]/g)||"").length==s.length/2

document.writeln(f("🔹code-golf🔹")) //false
document.writeln(f("😮 😥 😨 😩 😪")) //false
document.writeln(f("I have no fancy emojis :(")) //false
document.writeln(f("😎")) //true
document.writeln(f("😊😘")) //true


1
61 byte:s=>(s.match(/\ud83d[\ude00-\ude4f]/g)||"").length==s.length/2
Shaggy,

Come funziona? Il regex non specifica i punti di codice di nessuna emoji ...
NieDzejkob,

@NieDzejkob Credo che JS usi UTF-16 per Unicode, quindi immagino che queste siano le rappresentazioni di byte UTF-16 di quei punti di codice. La risposta è incompleta se esso fallisce 🛂🚀, ♔☺☠, 🏐🎅🌝etc., i quali dovrebbero essere truthy. Sembra verificare solo un intervallo su sei menzionato dall'OP.
Sundar - Ripristina Monica il

1

Python, 87 byte

lambda x:re.match('^[😀-🙏🌀-🗿🚀-🛿☀-➿︀-︀️]*$',x)and 1
import re

Provalo online!

Restituisce 1come valore di verità e Nonecome valore di falsa.


Ho "preso in prestito" il tuo regex, spero che non ti dispiaccia;)
HyperNeutrino

Da quando l'ho detto a Value Ink, lo dirò anche a te: i primi due gruppi nel regex possono essere uniti a causa di punti di 🌀-🙏
codice

1

Proton , 54 byte

map(/[🌀-🙏🚀-🛿☀-➿︀-︀️]/.match)+all

Provalo online!

-9 byte (3 caratteri) grazie a NieDzejkob

"Prendere in prestito" la regex di Uriel: P Questo è più breve grazie alle oscure caratteristiche di Proton e ai letterali regex


Come ho detto a Value Ink, i primi due gruppi nel regex possono essere uniti a causa di punti di 🌀-🙏
codice



0

QuadR , 47 byte

''≡⍵
[🌀-🙏🚀-🛿☀-➿︀-︀️]

Provalo online!

È…

''≡⍵ una stringa vuota identica al risultato quando ...

[🌀-🙏🚀-🛿☀-➿︀-︀️] tutti gli emoji sono ...

 sostituito con niente

?

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.