¿Es un emoji?

17

He estado trabajando en esta aplicación iOS recientemente y me encontré con un problema (bastante fácil de resolver): ¿cómo puedo determinar si mi cadena está compuesta solo de emojis?

Bueno, ese es tu trabajo hoy!

Entrada

Una cuerda. Si la presencia de caracteres unicode es problemática para usted, entonces puede usar un formato razonable diferente. Indique lo que hace si hace algo diferente de una cadena normal para tomar la entrada.

Salida

Imprima o devuelva un valor verdadero si la cadena de entrada contiene solo emojis y un valor falso si contiene cualquier otro carácter que no sea emojis.

Espera un segundo ... ¿Qué es un emoji? 😅

Un emoji es un personaje que cae en estos rangos:

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

(Yo creo que)

Este es 🔹 🔹, por lo que el código más corto en bytes gana❕

Casos de prueba

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

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

Para ustedes, almas pobres que no pueden ver emojis, aquí hay una imagen de los casos de prueba .

Daniel
fuente
2
¿Quizás incluir una versión (tal vez una imagen) para aquellos que no pueden ver emojis? ;-)
ETHproductions
@ETHproductions, ¿sugiere que enlace a una foto de los casos de prueba o alguna otra cosa?
Daniel
Bueno, hay emojis repartidos por toda la pregunta, pero supongo que los únicos realmente importantes están en los casos de prueba, por lo que una imagen de los casos de prueba funcionará.
ETHproductions
@ETHproductions, agregué un enlace a una foto de los casos de prueba
Daniel
¿La entrada puede ser una matriz numérica de puntos de código Unicode? Además, ¿qué rango de caracteres / números puede contener la entrada?
Luis Mendo

Respuestas:

2

Ruby , 61 56 + 1 = 62 57 47 bytes

Utiliza la -nbandera y toma información de STDIN. Impresiones 0para la verdad y la nilfalsedad.

-5 bytes porque por alguna razón inicialmente pensé que la solución regex no funcionaría.

-10 bytes de NieDzejkob por notar una superposición de puntos de código que me perdí: o

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

Pruébalo en línea!

Tinta de valor
fuente
1
47 bytes si combina dos rangos en la expresión regular.
NieDzejkob
1
Eso es 47 ¿no?
Asone Tuhid
Sí, olvidé actualizar el puntaje después de recibir la sugerencia de @NieDzejkob
Value Ink el
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🍉

Un invocable que toma una lista de enteros que representan los puntos de código y devuelve 1 o 0.

Pruébalo en línea!

Emojicode , 187 bytes

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

Un invocable que toma una cadena y devuelve un booleano.

Pruébalo en línea!

Desengañado y explicado

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

Pruébalo en línea!

NieDzejkob
fuente
1

JavaScript, 83 61 bytes

-22 bytes gracias a @Shaggy

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

Manifestación

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
fuente
1
61 bytes:s=>(s.match(/\ud83d[\ude00-\ude4f]/g)||"").length==s.length/2
Shaggy
¿Cómo funciona esto? La expresión regular no especifica los puntos de código de ningún emoji ...
NieDzejkob
@NieDzejkob Creo que JS usa UTF-16 para Unicode, así que supongo que estas son las representaciones de bytes UTF-16 de esos puntos de código. La respuesta es incompleta, sin embargo, se produce un error de 🛂🚀, ♔☺☠, 🏐🎅🌝etc., todo lo cual debe ser Truthy. Parece verificar solo un rango de los seis que OP menciona.
sundar - Restablecer Monica
1

Python, 87 bytes

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

Pruébalo en línea!

Devuelve 1como valor verdadero y Nonecomo valor falso.

Uriel
fuente
"Tomé prestada" tu expresión regular, espero que no te
importe
Desde que le conté a Value Ink al respecto, también se lo diré: los dos primeros grupos en la expresión regular pueden fusionarse debido a puntos de código adyacentes:🌀-🙏
NieDzejkob
1

Protón , 54 bytes

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

Pruébalo en línea!

-9 bytes (3 caracteres) gracias a NieDzejkob

"Préstamo" de expresiones regulares de Uriel: P Esto es más corto gracias a las características oscuras de Proton y los literales de expresiones regulares

Hiperneutrino
fuente
Como le dije a Value Ink, los dos primeros grupos en la expresión regular pueden fusionarse debido a puntos de código adyacentes:🌀-🙏
NieDzejkob
@NieDzejkob ¿Cómo exactamente? Me da errores: tio.run/##KyjKL8nP@59m@z83sUBDP/rD/BkNuh/mT9//Yf4sEGP2/…
HyperNeutrino
como este
NieDzejkob
0

QuadR , 47 bytes

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

Pruébalo en línea!

Es…

''≡⍵ una cadena vacía idéntica al resultado cuando ...

[🌀-🙏🚀-🛿☀-➿︀-︀️] todos los emojis son ...

 reemplazado por nada

?

Adán
fuente