É um emoji?

17

Eu tenho trabalhado neste aplicativo iOS recentemente e encontrei um problema (bastante facilmente resolvido): Como determinar se minha string é composta apenas por emojis?

Bem, esse é o seu trabalho hoje!

Entrada

Uma linha. Se a presença de caracteres unicode for problemática para você, você poderá usar um formato razoável diferente. Por favor, indique o que você faz se fizer algo diferente de uma sequência regular para obter informações.

Resultado

Imprima ou retorne um valor verdadeiro se a sequência de entrada contiver apenas emojis e um valor falsey se contiver outros caracteres que não sejam emojis.

Espere um segundo ... o que é um emoji? 😅

Um emoji é um personagem que se enquadra nesses intervalos:

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

(Eu acho que)

Este é o " ", então o código mais curto em bytes vence.

Casos de teste

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

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

Para vocês, pobres almas que não podem ver emojis, aqui está uma imagem dos casos de teste .

Daniel
fonte
2
Talvez inclua uma versão (talvez uma imagem) para quem não consegue ver emojis? ;-)
ETHproductions
@ETHproductions, você sugere que eu faça o link para uma foto dos casos de teste ou algo mais?
Daniel
Bem, existem emojis espalhados por toda a pergunta, mas acho que os únicos realmente importantes estão nos casos de teste, então uma imagem apenas dos casos de teste funcionará.
ETHproductions
@ETHproductions, adicionei um link para uma foto dos casos de teste
Daniel
A entrada pode ser uma matriz numérica de pontos de código Unicode? Além disso, que intervalo de caracteres / números a entrada pode conter?
Luis Mendo

Respostas:

2

Ruby , 61 56 + 1 = 62 57 47 bytes

Usa a -nbandeira e recebe as informações de STDIN. Imprime 0de verdade e nilde falsidade.

-5 bytes porque, por algum motivo, pensei inicialmente que a solução regex não funcionaria ???

-10 bytes de NieDzejkob por perceber uma sobreposição de ponto de código que eu perdi:

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

Experimente online!

Value Ink
fonte
11
47 bytes se você mesclar dois intervalos no regex.
NieDzejkob
11
Isso é 47, não é?
Asone Tuhid
Sim, eu esqueci de atualizar a pontuação depois de receber a sugestão de @NieDzejkob
Value Ink
10

Emojicode , 179 bytes

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

Uma chamada que pega uma lista de números inteiros representando os pontos de código e retorna 1 ou 0.

Experimente online!

Emojicode , 187 bytes

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

Uma chamada que pega uma string e retorna um booleano.

Experimente online!

Ungolfed e explicou

👴 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 👍
 🍎👍
🍉

Experimente online!

NieDzejkob
fonte
1

JavaScript, 83 61 bytes

-22 bytes graças a @Shaggy

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

Demo

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

Oliver
fonte
11
61 bytes:s=>(s.match(/\ud83d[\ude00-\ude4f]/g)||"").length==s.length/2
Salsicha
Como isso funciona? A regex não especifica os codepoints de qualquer emoji ...
NieDzejkob
@NieDzejkob Eu acredito que o JS usa UTF-16 para Unicode, então acho que essas são as representações de bytes UTF-16 desses pontos de código. A resposta é incompleta, porém, ele não para 🛂🚀, ♔☺☠, 🏐🎅🌝etc., os quais devem ser truthy. Parece verificar apenas um intervalo dos seis mencionados pelo OP.
sundar - Restabelece Monica
1

Python, 87 bytes

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

Experimente online!

Retorna 1como valor Noneverdadeiro e como valor falso.

Uriel
fonte
I "emprestado" o seu regex, espero que você não se importa;)
HyperNeutrino
Desde que eu contei à Value Ink sobre isso, eu vou lhe contar também - os dois primeiros grupos no regex podem ser mesclados devido a pontos de código adjacentes:🌀-🙏
NieDzejkob
1

Próton , 54 bytes

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

Experimente online!

-9 bytes (3 caracteres) graças a NieDzejkob

"Emprestando" a expressão regular de Uriel: P Isso é mais curto graças aos recursos obscuros de Proton e aos literais de expressão regular

HyperNeutrino
fonte
Como eu disse à Value Ink, os dois primeiros grupos no regex podem ser mesclados devido a pontos de código adjacentes:🌀-🙏
NieDzejkob
@NieDzejkob Como exatamente? Isso me dá erros: tio.run/##KyjKL8nP@59m@z83sUBDP/rD/BkNuh/mT9//Yf4sEGP2/…
HyperNeutrino
como este
NieDzejkob
0

QuadR , 47 bytes

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

Experimente online!

É…

''≡⍵ uma string vazia idêntica ao resultado quando…

[🌀-🙏🚀-🛿☀-➿︀-︀️] todos os emojis são…

 substituído por nada

?

Adão
fonte