Ist es ein Emoji?

17

Ich habe kürzlich an dieser iOS-App gearbeitet und dabei ein (ziemlich leicht zu lösendes) Problem festgestellt: Wie kann ich feststellen, ob meine Zeichenfolge nur aus Emojis besteht?

Nun, das ist heute dein Job!

Eingang

Ein Faden. Wenn das Vorhandensein von Unicode-Zeichen für Sie problematisch ist, können Sie ein anderes vernünftiges Format verwenden. Bitte geben Sie an, was Sie tun, wenn Sie etwas anderes als eine reguläre Zeichenfolge für die Eingabe tun.

Ausgabe

Gibt einen Wahrheitswert aus oder zurück, wenn die Eingabezeichenfolge nur Emojis enthält, und einen Falsey-Wert, wenn sie andere Zeichen als Emojis enthält.

Moment mal ... was ist ein Emoji? 😅

Ein Emoji ist ein Zeichen, das in folgende Bereiche fällt:

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

(Meiner Ansicht nach)

Dies ist " ", also gewinnt der kürzeste Code in Bytes

Testfälle

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

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

Für Sie arme Seelen, die keine Emojis sehen können, hier ein Bild der Testfälle .

Daniel
quelle
2
Vielleicht eine Version (vielleicht ein Bild) für diejenigen, die keine Emojis sehen können? ;-)
ETHproductions
@ETHproductions, schlage ich vor, einen Link zu einem Foto der Testfälle oder etwas anderem zu erstellen?
Daniel
Nun, es gibt Emojis, die über die gesamte Frage verteilt sind, aber ich denke, die einzigen wirklich wichtigen sind in den Testfällen, so dass ein Bild nur der Testfälle funktionieren wird.
ETHproductions
@ETHproductions, ich habe einen Link zu einem Foto der Testfälle hinzugefügt
Daniel
Kann die Eingabe ein numerisches Array von Unicode-Codepunkten sein? Welchen Bereich von Zeichen / Zahlen kann die Eingabe auch enthalten?
Luis Mendo

Antworten:

2

Ruby , 61 56 + 1 = 62 57 47 Bytes

Verwendet das -nFlag und nimmt Eingaben von STDIN entgegen. Drucke 0für wahr und nilfür falsch.

-5 Bytes, weil ich aus irgendeinem Grund anfangs dachte, die Regex-Lösung würde nicht funktionieren?

-10 Bytes von NieDzejkob für das Erkennen einer Codepunktüberschneidung, die ich verpasst habe: o

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

Probieren Sie es online!

Wert Tinte
quelle
1
47 Bytes, wenn Sie zwei Bereiche in der Regex zusammenführen.
NieDzejkob
1
Das sind 47, nicht wahr?
Asone Tuhid
Ja, ich habe vergessen, die Partitur zu aktualisieren, nachdem ich den Vorschlag von @NieDzejkob
Value Ink am
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🍉

Ein Callable, der eine Liste von Ganzzahlen verwendet, die die Codepunkte darstellen, und 1 oder 0 zurückgibt.

Probieren Sie es 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🍇🍎👎🍉🍉🍎👍🍉

Ein Callable, der eine Zeichenfolge akzeptiert und einen Booleschen Wert zurückgibt.

Probieren Sie es online!

Ungolfed und erklärte

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

Probieren Sie es online!

NieDzejkob
quelle
1

JavaScript, 83 61 Bytes

-22 Bytes dank @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
quelle
1
61 Bytes:s=>(s.match(/\ud83d[\ude00-\ude4f]/g)||"").length==s.length/2
Shaggy
Wie funktioniert das? Die Regex spezifiziert nicht die Codepunkte von irgendwelchen Emojis ...
NieDzejkob
@NieDzejkob Ich glaube, JS verwendet UTF-16 für Unicode. Ich denke, dies sind die UTF-16-Byte-Darstellungen dieser Codepunkte. Die Antwort ist unvollständig , obwohl es nicht für 🛂🚀, ♔☺☠, 🏐🎅🌝usw., von denen alle truthy sein sollte. Es scheint nur für einen Bereich von den sechs zu prüfen, die OP erwähnt.
Sundar - Wiedereinsetzung von Monica
1

Python, 87 Bytes

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

Probieren Sie es online!

Gibt 1als Wahrheitswert und Noneals falscher Wert zurück.

Uriel
quelle
Ich habe Ihre Regex "ausgeliehen", hoffe, Sie haben nichts dagegen;)
HyperNeutrino
Da ich Value Ink davon erzählt habe, erzähle ich es Ihnen auch - die ersten beiden Gruppen in der Regex können aufgrund benachbarter Codepunkte zusammengeführt werden:🌀-🙏
NieDzejkob
1

Proton , 54 Bytes

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

Probieren Sie es online!

-9 Bytes (3 Zeichen) dank NieDzejkob

"Ausleihen" von Uriels Regex: P Dies ist kürzer dank Protons obskuren Funktionen und Regex-Literalen

HyperNeutrino
quelle
Wie ich Value Ink sagte, können die ersten beiden Gruppen in der Regex aufgrund benachbarter Codepunkte zusammengeführt werden:🌀-🙏
NieDzejkob
@NieDzejkob Wie genau? Es gibt mir Fehler: tio.run/##KyjKL8nP@59m@z83sUBDP/rD/BkNuh/mT9//Yf4sEGP2/…
HyperNeutrino
wie dieser
NieDzejkob
0

QuadR , 47 Bytes

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

Probieren Sie es online!

Ist…

''≡⍵ eine leere Zeichenkette, die mit dem Ergebnis identisch ist, wenn…

[🌀-🙏🚀-🛿☀-➿︀-︀️] Alle Emojis sind ...

 durch nichts ersetzt

?

Adam
quelle